前回では簡単に、Windowsの「スケジューリングアルゴリズム」について解説した。今回は一歩踏み込んで、具体的なWindowsでのスレッド実行について見ていくことにしよう。
Windowsのタイムスライスは
「Quantum」単位で割り当てる
Windowsではスレッドに対して、一定の実行時間を割り当てる。これを「タイムスライス」と呼ぶ。基本的にすべてのスレッドは、このタイムスライスの間だけ実行されて、時間が終わると次のスレッドに切り替わる。ただし、Windowsは“プリエンプティブ”なスケジューリングを採用しているので、優先順位の高いスレッドがキューに入ると、そのスレッドが、ほかのスレッドから制御を横取りして実行を開始する。
そのタイミングは、一定時間ごとにハードウェアが発生させるタイマー割り込みによる。一般的なパソコンでは、15.6ミリ秒ごとにCPUに割り込みがかかり、そのタイミングでスケジューラー(ディスパッチャー)が動作して、より優先順位の高いスレッドがあれば、そのスレッドを実行する。
どのスレッドも、前述のタイムスライスの期間分だけ、実行時間を割り当てられる。時間を横取りされた場合でも、より優先順位の高いスレッドがなくなったとき(つまり自身が最も高い優先順位になったとき)には、制御が戻ってタイムスライスの残りを実行する。スレッドがタイムスライスを使いはたしたら、同じ優先順位の実行待ち行列の最後に置かれて次の順番を待つ。
さて、このタイムスライス割り当てだが、Windowsでは「Quantum」という単位で割り当てられる。基本的にタイムスライスの割り当て量は、Quantumの整数倍になる。前述したタイマー割り込みの1周期(15.6ミリ秒)が、3Quantumに相当すると定義されている。そのため、実際のタイムスライスの割り当ては、3の倍数となるわけだ。
基本的に、Windows 7などクライアント系のWindowsでは、タイムスライスは6quantumであり、サーバー系では36Quantumとなっている。クライアント系での割り当ては「Short」と呼ばれ、サーバー系の割り当ては「Long」という。これはレジストリで制御されるパラメーターであり、クライアント系でもタイムスライス割り当てをLongに設定することが可能だ。
なおクライアント系Windowsでは、ユーザーが操作しているフォアグラウンドのプロセス(ウインドウが選択状態になっているプロセス)に属するスレッドに対して、大きなタイムスライスを割り当てる「Quantum Boosting」という機能がある。この機能では、フォアグラウンドのスレッドに3倍、つまり18Quantumのタイムスライスを割り当てる。
このような仕組みが作られた背景には、フォアグラウンドのプロセスはGUI操作とアプリケーション内部の処理を行なう必要があり、ユーザーのスムーズな操作を可能にするためには、少し大きめの時間を与える必要があるからだ。6Quantumは、タイマーの時間でいえば2周期、約31.2ミリ秒となる。これに対して3倍となる18Quantumは、93.6ミリ秒もある。
スレッド実行のタイミングは同時に実行されているスレッド数や、それらの優先順位によって変わるものだ。GUI操作ではマウスのレポートレートなども関係する。しかし確率的に言えば、Quantumが長いほうがマウスのレポートなどを受け取ったあと、十分な処理時間が割り当てられる可能性が高い。多少バックグラウンドのスレッドが多かったとしても、この仕組みであればフォアグラウンドのアプリケーションに、ある程度の処理時間が割り当てられる可能性が大きいわけだ。
この連載の記事
-
第13回
PC
ARM版Windows 8実現の布石となったWindows 7の「MinWin」 -
第12回
PC
アプリがWindowsの機能を使うには? APIとDLLの仕組み -
第10回
PC
AMD FX向けにパッチで修正 スケジューラーが抱える難題 -
第9回
PC
マルチコアCPUを賢く使いこなす スケジューリングの秘密 -
第8回
PC
意味の違いがわかる? タスクとプロセスとスレッド -
第7回
PC
Windowsのメモリー管理をx86の仕組みから読み解く -
第6回
PC
メモリー不足を根本的に解決する64bit OSの仕組み -
第5回
PC
Windows 8でMetro Styleアプリを動かす「WinRT」 -
第4回
PC
Windowsを動かすデバイスドライバーの仕組み 前編 -
第3回
PC
OSの仕事はハードウェアをアプリから「隠す」こと? - この連載の一覧へ