スレッドが作成されたら、プロセスやスレッドのスケジューラー(スレッドディスパッチャー)によって実行するCPUコアを選定し、その実行待ち行列(キュー)へスレッドが登録される。CPUのコアごとにスレッドの実行待ちキューがあり(さらに、優先度別にもキューが分かれている)、準備ができたスレッドから順に実行が開始される。実行を開始してから、あらかじめ決められた時間が経過すると次のスレッドの実行へ移る。
スレッドの状態遷移図を次に示しておく。CPUコアの実行待ち行例に登録されたスレッドは、CPUの利用権が実際に得られたら、そのCPU上で実行を開始する。タイムスライス時間(クォンタムタイム。詳細は後述)が経過すると、他のスレッドに制御を渡すか、他に実行待ちのスレッドがなければ引き続き実行される。スレッドが終了するか、I/O待ち、イベント待ちなどで実行できなくなった場合も実行を中断し、他のスレッドに実行権を渡すことになる。
一度実行されたスレッドが待ち状態になった後でまた実行される場合、ディスパッチャーはなるべく同じCPUコアにスレッドを割り当てるようにする。もしCPUコア間をまたがってスレッドを切り替えると、CPUキャッシュのヒット率などが下がり、パフォーマンスが低下するからだ。ハイパースレッド(Simultaneous Multithreading:SMTともいう)やNUMAのようなマルチプロセッサー環境でも、なるべく同じコアや同じブロック内でスケジューリングするように最適化されている。
Windows OSではプロセスやスレッドに32段階の優先度(0〜31)を設定できる。ユーザーが一般に作成するアプリケーションの優先度は「通常」である。だが用途によってはもっと高くして優先的に処理させたり、逆にフォアグラウンドのアプリケーションに影響を与えないように、もっと優先度を下げることもできる。
タスクマネージャーの画面では優先度は6段階しか設定できないが、これらは実際には0〜31のいずれかの優先度の数値に変換されて設定される。0が最低優先度、31が最高優先度である。
優先度 | 基本優先度クラス |
---|---|
リアルタイム | 24(22〜26) |
高 | 13(11〜15) |
通常以上 | 10(8〜12) |
通常 | 8(6〜10) |
通常以下 | 6(4〜8) |
低 | 4(2〜6) |
Windows OSの基本優先度クラス Windows OSには0〜31の32レベルの優先度があるが、APIなどではこの6つの基本的な優先度クラスで設定する。ここで設定した優先度がプロセスの基本優先度となる。プロセスに属するスレッドには、プロセスの基本優先度が初期優先度として割り当てられる。動作中のプロセスやスレッドの優先度は、この基本優先度をベースにして、状況に応じていくらか上下するように制御される。 |
優先度設定にはこの表の通り6段階あるが、これはプロセスの「基本優先度クラス」として扱われる。ここで設定した優先度はスレッドの初期基本優先度として引き継がれるが、その後のスレッド優先度はプロセスやスレッドのスケジューラーによっていくらか上下するように制御される。
スレッドの優先度は、基本的には最初に設定された「プロセスの基本優先度クラス」を引き継ぐ。その一方で、状況によっては優先度を一時的に上げる「優先度ブースト」という機能も持っている。次のような場合に優先度を上げて、アプリケーションの応答性などを向上させている。
いったん上がった優先度はしばらくすると元に戻るように制御されているので、特定のアプリケーションだけがずっと優先的に動作することはない。
システム上に複数の実行可能なスレッドがある場合、スケジューラーはある短い時間間隔で区切ってスレッドをCPUに順に割り当てたり、切り替えたりしながら実行する。スレッドが連続して実行可能な時間を「クォンタムタイム(quantum time)」と呼ぶ。この時間はWindows OSのバージョンやシステムの構成などによって変わる。以下に、クォンタムタイムの割り当て方法を変更する設定画面を示しておく。
クライアントWindows OSではデフォルトで「プログラム」という方が選択されている。こちらを選択すると、GUIの応答性などを向上させるためにクォンタムタイムが短くなり、さらに場合によってはフォアグラウンドのプロセスの方がバックグラウンドのプロセスよりもクォンタムタイムが長くなるように(つまり、フォアグラウンドアプリケーションの応答性が向上するように)制御される。これを「クォンタムブースト」と言う。
サーバーWindows OSのデフォルト設定では「バックグラウンド サービス」という方が選択されている。こちらを選択すると、クォンタムタイムは「プログラム」の場合の6倍(「プログラム」と比較した場合の相対値)の固定長となり、全てのプロセス(スレッド)が安定して同じように動作するようになる(GUI操作などによって、バックグラウンドで動作しているプログラムがあまり影響を受けないようにするため)。
スレッドは、デフォルトではCPUのどのコア上でも動作するようになっており、必要に応じて空いているコアへ自動的に割り当てられるようになっている。だが特定のプロセス/スレッドが全コアを占有して、他のプロセスが動作できなくなることを防ぐために、利用可能なコアを制限することもできる。どのプロセス(スレッド)がどのCPU上で実行可能かという属性のことを「アフィニティ(affinity)」と言い、実行可能なコアのリストを「アフィニティマスク(affinity mask)」という。タスクマネージャーで操作する場合は、「プロセス」タブでプロセス名を右クリックし、ポップアップメニューから「関係の設定」を実行すると、特定のCPUコアのみを利用するように制限できる。
Windows OSが起動すると最初に「System」という名前のプロセスが実行を開始し、これが全てのルートとなって、その他のシステムプロセスやユーザープロセスなどを起動するようになっている。以下に、タスクマネージャー画面などで見ることの多い、Windows OSでよく使われているシステムプロセスの概要についてまとめておく。
プロセス名 | 意味 |
---|---|
conhost.exe | コンソールウィンドウホスト。cmd.exe実行用のホストプロセス |
csrss.exe | クライアント/サーバー ランタイムサブシステム。「Windowsサブシステム」セッションプロセスを開始する |
dwm.exe | Aeroデスクトップウィンドウマネージャー |
explorer.exe | エクスプローラー |
lsass.exe | ローカルセキュリティオーソリティ。ローカルのユーザー認証を行う |
lsm.exe | ローカルセッションマネージャー。ローカルのターミナルセッションを管理する |
services.exe | サービスコントローラー。サービスを開始する |
smss.exe | Windowsセッションマネージャー。「Windowsサブシステム」や「POSIXサブシステム」などの各サブシステムを起動する。 |
svchost.exe | サービスホストプロセス。指定されたサービスを起動する |
System | Windows OSカーネルシステム |
System Idle Process | アイドルプロセス。他のプロセスが動作していないときに実行される(仮想的な)プロセス。システムの稼働率を測定する |
taskhost.exe | Windowsタスクのホストプロセス |
TrustedInstaller.exe | Windowsインストーラープロセス |
wininit.exe | Windows OSの初期化プロセス |
winlogon.exe | Windowsログオンアプリケーション。ユーザーのログオン/ログオフを管理する |
Windows OSの代表的なプロセス |
実際にシステム上で動作しているプロセスの例を次に示す。これはSysinternalsのProcess Explorerというツールでプロセスの一覧を表示したところだ。上の方にはOSカーネルを構成する重要なプロセスが表示されている。これを見ると例えば、サービスを構成するservice.exe(およびその子プロセスのsvchost.exe)はwininit.exeから起動されていることが分かる。
今回はWindows OSのカーネルを理解するための第一歩として、プロセスとスレッド、スケジューリングなどについて見てきた。次回はメモリ管理について取り上げる。
Copyright© Digital Advantage Corp. All Rights Reserved.