全2449文字

 Windowsの内部構造を詳細に解き明かす定番書籍「インサイドWindows」。1992年の初版発行以来(初版の訳書は1993年発行)、Windowsに接するすべてのITエンジニアのバイブルとして永く読み継がれてきました。最新刊の第7版は、2017年5月に上の原書が発行され(訳書の発行は2018年5月、山内和朗訳)、約4年の歳月を経て2021年10月に下の原書が発行されました(訳書の発行は2022年9月、山内訳)。

 第7版完結を機に、「インサイドWindows」の読みどころを、上(第1章~第7章)と下(第8章~第12章)から抜粋してお届けします。今回は第4章(上)からの抜粋で、Windowsのスレッド内部で使われるデータ構造体を見ていきます。(日経BOOKSユニット第2編集部)

第4章 スレッド

 この章では、スレッドを扱うデータ構造体とアルゴリズム、およびWindowsにおけるスレッドスケジューリングについて説明します。最初に、スレッドを作成する方法について示します。次に、スレッドとスレッドスケジューリングの内部について説明します。最後に、スレッドプールについて説明します。

4.2 スレッドの内部

 この節では、スレッドの管理のためにカーネル内(および一部はユーザーモード内)で使用される内部の構造体について説明します。なお、特に明記しない限り、この節の内容は、ユーザーモードスレッドとカーネルモードのシステムスレッドの両方に適用されます。

4.2.1 データ構造体

 オペレーティングシステム(OS)レベルでは、Windowsのスレッドはエグゼクティブスレッドオブジェクトによって表されます。エグゼクティブスレッドオブジェクトはETHREAD構造体をカプセル化し、この構造体に、KTHREAD構造体が最初のメンバーとして含まれています。

 これらの構造体を図4-1(ETHREAD)と図4-2(KTHREAD)に示します。

図4-1 エグゼクティブスレッド(ETHREAD)構造体の重要なフィールド
図4-1 エグゼクティブスレッド(ETHREAD)構造体の重要なフィールド
(出所:『インサイドWindows 第7版 上』)
[画像のクリックで拡大表示]
図4-2 カーネルスレッド(KTHREAD)構造体の重要なフィールド
図4-2 カーネルスレッド(KTHREAD)構造体の重要なフィールド
(出所:『インサイドWindows 第7版 上』)
[画像のクリックで拡大表示]

 ETHREAD構造体と、この構造体がポイントする他の構造体は、システムアドレス領域内に存在します。唯一の例外はスレッド環境ブロック(Thread Environment Block:TEB)で、これはプロセスアドレス領域内に存在します(プロセス環境ブロック=PEBと同様、ユーザーモードのコンポーネントはTEBにアクセスする必要があるからです)。