はじめに
第4回では、Windows NT 3.1 の 実行モデルの中核であるスレッド を解説します。NT は初期設計段階からスレッド中心の OS として作られており、この思想は現在の Windows にも直結しています。
1. スレッド中心設計という思想
Windows NT において、CPU によって実際にスケジューリングされるのは プロセスではなくスレッド です。
- プロセス:リソース管理単位
- スレッド:実行単位
この明確な分離により、
- 高い並行性
- GUI 応答性の向上
- マルチプロセッサ対応
が可能になりました。
2. スレッドオブジェクト(ETHREAD / KTHREAD)
NT 内部では、スレッドもプロセス同様に カーネルオブジェクト として管理されます。
- オブジェクト型:Thread
- Executive 構造体:ETHREAD
- Kernel 構造体:KTHREAD
2.1 KTHREAD の役割
KTHREAD はスケジューラが直接扱う構造体で、以下の情報を保持します。
- 実行状態(Ready / Running / Waiting)
- 優先度
- CPU コンテキスト
- 待機オブジェクト情報
2.2 ETHREAD の役割
ETHREAD は Executive 側の管理情報を保持し、
- 所属プロセス(EPROCESS)
- ユーザーモードスタック
- セキュリティコンテキスト
などを管理します。
3. スケジューリング機構
3.1 優先度ベース・プリエンプティブスケジューリング
Windows NT 3.1 では、
- 優先度レベル:0〜31
- 数値が大きいほど高優先度
というモデルが採用されています。
3.2 動的優先度
- I/O 完了時の優先度ブースト
- ユーザー操作に対する応答性向上
これにより、バックグラウンド処理よりも対話型処理が優先されます。
4. コンテキストスイッチ
スレッド切り替え時には、
- レジスタ状態の保存
- スタック切り替え
- ページテーブル参照の更新
が行われます。
この処理は HAL と密接に連携し、CPU アーキテクチャ差異を吸収します。
5. 待機と同期
5.1 待機状態
スレッドは以下の理由で待機状態に入ります。
- I/O 完了待ち
- 同期オブジェクト待ち
- 明示的なスリープ
5.2 同期プリミティブ
- ミューテックス
- セマフォ
- イベント
- スピンロック(カーネル内部)
これらもすべてオブジェクトとして管理されます。
6. 第4回のまとめ
Windows NT 3.1 のスレッド設計は、
- 実行単位の明確化
- 優先度制御による応答性重視
- マルチプロセッサを前提とした設計
という点で、当時としては非常に先進的でした。
次回は、スレッドが利用する基盤である 「メモリ管理」 を詳しく解説します。

コメント