このページの本文へ

前へ 1 2 3 次へ

基礎から覚える 最新OSのアーキテクチャー 第9回

マルチコアCPUを賢く使いこなす スケジューリングの秘密

2011年12月27日 12時00分更新

文● 塩田紳二

  • この記事をはてなブックマークに追加
  • 本文印刷

マルチタスクにも2種類の作法がある

 本連載では「OSの目的のひとつは資源の管理」と説明しているが、その“資源”の中で最も重要なのが、「CPUの処理時間」の配分である。マルチタスクのOSでは、「次にどのプロセスを実行するのか」は一番重要な問題であり、これがうまくいかないと、同じハードウェアでも性能に違いが出てしまう。

 マルチタスクで使われる用語に「プリエンプティブマルチタスク」という語がある。これは、OSによるCPUの処理時間の配分、つまり「スケジューリング」の動作を示すものだ。ちなみに反対語は「協調的マルチタスク」(ノンプリエンプティブ、疑似マルチタスクとも)。プリエンプティブの場合、OSは実行中のプロセスを停止させて、ほかのプロセスを再開させることができる。これを一定間隔で行なうことにより、複数のプロセスを見かけ上、同時実行させているわけだ。

 これに対して協調的マルチタスクは、システムコールのタイミングやプロセス自身が制御を返すことで、プロセスの切り替えを行なうものだ。プログラムをきちんと作法どおりに作れば、これでも問題はないのだが、バグなどにより戻ってこなくなると、システム全体が止まってしまう。

 Windowsの歴史を振り返ると、「Windows 2.x」まではこの協調的マルチタスクが基本だったが、仮想86モードを使う「Windows/386」からは、DOSモード限定のプリエンプティブマルチタスクが取り入れられた。一方で2.xから継承された16bitモジュールは、互換性維持のためにWindows 95まで残っていた。そのため32bitコードはプリエンプティブに動作していたものの、16bitコードは協調的マルチタスクのままだった。

 協調的マルチタスクの考え方自体に問題はないのだが、現実にはバグなどでプログラムが制御を返さないことがあり得るため、実用性という点では低くなってしまうことが多い。プリエンプティブマルチタスクであっても、アプリケーションが明示的に制御を戻すことはできる。例えば、指定された時間や、プロセスを停止させるようなシステムコールなどだ。

 そういうわけで、近代的なOSであればプリエンプティブマルチタスクが採用されているので、以後のスケジューリングの話はプリエンプティブであることを前提とする。

スケジューリングは
リソースのやりくりと密接に関係する

 プリエンプティブなマルチタスクでは、各プロセスにできるだけ公平に実行時間を配分するように、スケジューリングが行なわれる。基本はハードウェアが持つタイマーなどの割り込み機能を使い、一定時間の実行後にシステムへと強制的に制御を戻す。このとき割り当てられる時間を「タイムスライス」や「テック」などという。また、最近ではあまり言わないが、このようなマルチタスクを「タイムシェアリング」ということもある。

 スケジューリングの基本は、OSに制御が戻されたら次に実行すべきプロセスを再開させることだが、何を次に再開させるべきなのかが重要で、しかも難しい問題をはらんでいる。スケジューリングは、OSが管理しているメモリー、I/O、CPU時間といったリソースの配分と、深く関係しているからだ。図1を元に説明しよう。

スケジューリングとリソース配分の例

 多くのアプリケーションは、ファイルをアクセスしたり、画面を更新するなどのI/O操作を行なう。一般的にI/Oの動作速度は、CPUの動作速度に比べるとかなり遅い。あるプロセスがI/O処理、例えばファイルの読み出しなどを開始したら、それが完了するまで長時間かかる。この間にプロセスが再開させられても、何もすることがない。I/O処理が終了するまでは、プロセスを再開させる必要がないだけでなく、再開させてはいけないわけだ。

 I/O処理側にもいろいろと事情がある。例えば、ファイルアクセスを高速化することを考えると、必ずしも要求された順番どおりにアクセスすることがいいとは限らない。HDD上にあるファイルへのアクセスでは、ファイルがおかれているセクタの位置(トラック)へ、ヘッドを移動させるのに一番時間がかかる。だからヘッドが行ったり来たりを繰り返すと、システム全体の処理の足を引っ張ってしまう。

 そのため、ファイルをアクセスする順番は、ヘッドが内から外(または逆)になるように並べ替えたほうが高速になる(エレベーターシーキングと呼ぶ)。また、同一トラック上に読み出すセクタがあった場合でも、番号の小さいものから読むようにすれば、一周分のアクセスで必要なセクタを読み込むことが可能になる。

 つまり、I/Oの処理完了を待たなければならないプロセスは、先に待ちに入ったからといって、先に再開できるとは限らないのである。I/Oの管理は、間接的にプロセスのスケジューリングを行なっているとも言える。

前へ 1 2 3 次へ

カテゴリートップへ

この連載の記事

注目ニュース

ASCII倶楽部

プレミアムPC試用レポート

ピックアップ

ASCII.jp RSS2.0 配信中

ASCII.jpメール デジタルMac/iPodマガジン