今さら聞けないマルチプロセッサの基礎教えます ――キャッシュの共有,割り込みの共有,OSによる制御
ここで,OSのタスクの割り当てかたや待ち行列の持ちかたについて,システムを効率良く運用するためのしくみを考えてみましょう.
1)キャッシュを有効利用する
OSがタスクをCPUに割り当てるとき,単に空いているCPUにタスクを割り当てるのではなく,例えば,何度も実行するタスクについては,なるべく同じCPUに割り当てるという方法があります.そうすれば,キャッシュに以前のデータが残っている可能性が大きいので,効率的に運用できます.
2)待ち行列の「待ち」を解消する
「CPU0とCPU1が同じタスクを同時に実行してしまう」ということのないように,タスクの待ち行列は排他的に(一つのCPUが独占的に)操作する必要があります.しかし,OSが一つの待ち行列しか持っていないと,一つのCPUがタスク・スケジューリングをしている間,ほかのCPUは待たされることになります.CPUの数が増えるほど,これは大きな問題となります.
そこで,例えば米国Sun Microsystems社のOS「Solaris」では,各CPUごとの専用の待ち行列を用意して,CPUが待ち行列の操作の順番を待つことのないようにしています(3),注4.Linux OSのカーネルも,バージョン2.6からこのようなしくみを導入しています.
マルチプロセッサ用のOSにはさまざまなくふうが施されていますが,そのいずれも,キャッシュを有効利用する,資源の排他利用時間をなるべく短くする,といった点に集約されます.
なお,OSを使わない場合は,例えばCPUを一つのマスタCPUと残りのスレーブCPUに分けて,スレーブCPUを明示的に操作するデバイス・ドライバを利用する方法がとれます.このデバイス・ドライバは,スレーブCPUの起動,処理の割り当て(実行するプログラムのアドレスの通知),処理の回収(スレーブCPUが使用していたメモリなどの資源の解放)といった,通常,マルチプロセッサ対応OSが行っていることを担当することになるでしょう.
注4;このようにCPUがそれぞれ専用の待ち行列を持つとき,それぞれの待ち行列にタスクを割り当てるポリシが重要になる.割り当てポリシとしては,「一度あるCPUで実行したプロセスをなるべく同じプロセスで実行し続ける(キャッシュの利用効率の向上)」,「待ち行列にたまっているタスクがなるべく少ないものに割り当てる(負荷分散の向上)」,といったものが挙げられる.