Help us understand the problem. What is going on with this article?

Windowsのしくみ(ど素人編)

今までMac/Linuxしか使ったことのなかった自分が、Windowsしかない職場で生き残るために勉強したHistoryを残します。自分の備忘録&同様の環境にいる方のTipsになればと思います。

Windowsの動作モード

  • Windows は、カーネルモードとユーザーモードという2種類の動作モードを使い分けて各種処理を行っている(2019/6/21追記:この考え方はMacでもLinuxでも同じ)
    • image.png
  • アプリは全てユーザーモードで動作し、それぞれが独自のアドレス空間や資源を保持する
    • あるアプリが異常になったとしても他のアプリには影響を与えないよう設計されている
  • カーネルモードで動作するプログラムは大きく3層に分類できる
    • HAL
      • ハードウェアに最も近い層がこのHAL(Hardware Abstraction Layer)
    • カーネル
      • HALの上にはプロセスやスレッド、仮想メモリ、デバイスドライバなどを管理するカーネルが位置している
      • システムコールの抽象化により、従来のアプリもカーネルの変更点を意識する必要はない
    • System Service Dispatcher
      • カーネルモードで動作するプログラムの最上位に位置する
      • 例えば、ユーザーモードで動作するアプリからkernel32.dllで定義されているCreateFile()などの関数を呼び出す場合、ユーザーモードの窓口であるntdll.dllを通して呼び出しがシステムコールに変換され、カーネルモードの窓口であるSystem Service Dispatherが呼び出される

WOW64(Windows-On-Windows 64)とは

  • 64bit版のWindowsに搭載されている、従来の32bitのアプリを動かす仕組み

.Netとは

以下のサイトが分かりやすいです。
https://itpropartners.com/blog/8439/

  • ライブラリや各種フレームワークをあわせた統合開発環境のこと
  • 中核となるのは「.Net Framework」
    • 開発者もエンドユーザーもインストールする必要あり (ご指摘いただき以下に修正)
    • Windowsにデフォルトでインストールされている
      • ただしエンドユーザーは何かしらのアプリを入れるときに勝手に入ってくるのであまり意識することはない
    • アプリとOSを仲介するもの(OSレベルのAPIコールをラップするもの?)
    • これがあることによって開発者はWindowsの小難しいAPIを理解しなくてよい??
  • 「ASP.NET」とは
    • 「.NET Framework」上で動作するWebアプリケーションフレームワーク
    • こいつがあるお蔭でクライアントのGUIが簡単に作れる
    • サーバーサイドもこのフレームワークにより通信やバリデーションが簡単に作り込める
  • 共通言語ランタイム(CLR)とは
    • 言語や環境による差異を吸収する中間言語に変換する環境
    • メモリ管理や型とアセンブリの管理、スレッド管理、例外処理、セキュリティなども担当
      • 「アセンブリの管理」が具体的に何を指しているかはよくわかっていないため、【Read Later】として以下を残す

レジストリとは

  • サービスやアプリなど、Windowsに使われている全ての設定がこのDBに格納されている
  • 格納されているデータはkey-valueで構成されている
    • レジストリエディタで見るとkeyはフォルダ、valueはファイルのように見える
  • レジストリには親となるルートキーがある。レジストリ設定にあたっては、このルートキーの種類を理解することが大切
    • HKEY_CLASSES_ROOT
      • ファイルの拡張子と関連付けに関する情報が格納されている
      • 長いので「HKCR」と短縮される
    • HKEY_CURRENT_USER
      • ログイン中のユーザーの設定が格納されている
      • 「HKCU」と略される
      • HKCUでは、ユーザーが変更できるアプリの設定が格納されている
        • HKCUのサブキーにあるvalueはユーザー権限で変更可能
    • HKEY_LOCAL_MACHINE
      • システムについての全ての設定が格納されている
      • 「HKLM」と略される
      • 「HKLM\Software」のサブキーで設定するvalueは、ユーザーのみでなく、PC全体に反映される
      • 外付けのHWのドライバ情報も格納される
    • HKEY_USERS
      • ユーザー別とデフォルト設定を含む設定が格納されている
        • つまり、全てのユーザーのHKCUがここに格納される
      • ユーザー別の設定を確認したいときに便利
      • サブキーはユーザーアカウントがSIDで表示される
        • ユーザーのSIDは以下のように確認できる
        • image.png
    • HKEY_CURRENT_CONFIG
      • 使用中のプリンタとディスプレイの機器についての情報がここに格納される
      • 使用機会は低
    • レジストリの値について
      • レジストリを作成するとき、valueを参照するときは以下の知識が役に立つ
      • registry type.png

Windows API

恐らくここは.NET Frameworkを使って開発しているとあまり意識をしないと思われる(Windowsネイティブアプリの開発に疎いので詳細は他を参照いただきたいが)。

Win32API

  • プロセスとは

    • 「プログラム実行中のインスタンス」を意味する
      • プログラムの実行ファイルからメモリ上に実体化されたインスタンス
      • オブジェクト指向で1つのクラスから複数のインスタンスが作れるのと同様に、Windowsにおけるプロセスも複数のインスタンスを作ることができる
    • その時点でのプロセスの状態をプロセスの実行コンテキストもしくはコンテキストと呼ぶ
    • CreateProcess APIでプロセスを作成する
    • エクスプローラーなどからプログラムを起動したときは内部的にこのAPIが叩かれている
    • 「ハンドル」とはWin32 APIで様々なオブジェクトを識別するために頻繁に使われるもの
      • プロセスのハンドルは特定のプロセスを操作する際に必ず必要になる
    • プロセスの作成に成功するとBOOL型で成功/失敗が返される
      • 成功時にはプロおセスが作成され、そのハンドルがPROCESS_INFORMATION構造体に格納される
    • ハンドルは不要になったら必ずクローズすべきもの
      • クローズしないとメモリが開放されず、メモリリークの原因となる
      • クローズの際にはCloseHandle APIと使えばよい
      • プロセスの処理結果を待ってなにかしら処理をしたい場合、「WaitForSingleObject API」を利用し、起動したプロセスが終了するのを待つのが基本
      • 終了したプロセスの終了コードは「GetExitCodeProcess API」を使用できるj
    • Windowsには「GUIプロセス」と「コンソールプロセス」の2つのプロセスがある
      • ソースコードで見ると、前者はWinMainという名前の関数から処理が始まり、後者はmain関数から処理が始まる
      • GUIプロセス
        • ユーザーからのI/Oをはじめ、様々ないイベントが「ウィンドウ・メッセージ」と呼ばれるデータ構造としてアプリに通知される
        • こうしたイベントが生じる度にメッセージ・キューというアプリ別に用意された待ち行列にウィンドウ・メッセージを追加する
        • GUIプロセスはメッセージ・キューからメッセージを取り出して処理する
      • コンソールプロセス
        • メッセージ・キューは作成されない
        • コンソール・プロセスはデフォルトでコマンドプロンプトのコンソールをそのまま使う
        • エクスプローラなどGUIから起動された場合は専用のコンソールが用意される
        • GUIプロセスはメッセージ・キューに届いたウィンドウ・メッセージをメッセージ・ループで取り出して処理することを繰り返している
          • そのメッセージのほとんどは、キーを押したりマウスを動かしたりといったユーザーの操作を通知するもの
          • メッセージが届かないGUIプロセスは「待機状態」にある
    • タスク・スイッチ
      • タスク・スイッチはプロセスを切り替えるため、動作中のプロセスを止め、CPUのレジスタの値やプロセスから見えるメモリ上のデータなど、プロセスの環境すべてを退避する高コストな処理
      • CPUの仕組みを使い、効率的に処理している(詳細は省く)
      • Windowsは各プロセスが使うメモリ空間が実メモリ上で独立である(共有部分を除いて重ならない)ようになっている
      • プロセスには優先順位がある
        • タスク・マネージャから優先順位は変更可能
    • スレッド
      • スレッドは処理の流れを表すもの
      • マルチスレッドで処理の待ち合わせをする場合、WaitForSingleObject APIに渡して処理の終了を待ち合わせる
      • プロセスは実行に関わる全てのものを含む概念
        • Windowsはプロセスごとにメモリー空間を用意し、ウィンドウや描画に使用するオブジェクトなどもプロセスごとに管理する
        • プロセスの中で「プログラムの実行」の部分を表すのがスレッド
          • 言い換えればスレッドはプロセスを構成する一要素
      • マルチスレッドのマルチプロセスに比べてのメリット
        • タスク・スイッチのオーバーヘッドが早い
          • プロセスを切り替える場合は、メモリ空間など、プロセスのコンテキストも切り替える必要がある
          • スレッドはメモリ空間などプロセスのコンテキストを共有するために切り替えがない
          • プロセスの場合、データを受け渡す場合、「プロセス間通信」が必要
      • CreateThread APIでスレッドを作成できる
  • 参考

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away