このページの本文へ

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

AMD FX向けにパッチで修正 スケジューラーが抱える難題

2012年02月02日 12時00分更新

文● 塩田紳二

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

Windowsのスケジューリングの
鍵を握るAffinityマスク

 Windowsのスケジューリングアルゴリズムの基本は、優先順位付きキューである。この仕組みをWindowsでは、「ディスパッチャー」と呼ぶ。ディスパッチャーとはタクシーの配車センターなどを指す言葉だが、OSではスレッドの切り替えなどを担当する部分のことを言う。

 Windowsでは、スレッドの優先順位は「起動時に指定された順位」をベースにするが、内部的にはこれを上げ下げして調整している。優先順位を変えることで、例えば、“高い優先順位のスレッドが空くのを待っているリソース”を持った、低い優先順位のスレッドなどを優先して実行させることで、待っている高い優先順位のスレッドが早く実行できるようにするといった制御をしている。

 マルチプロセッサーシステムの場合、各プロセッサーごとにキューがある。ただしスレッドは必ずしも、入れられたキューを持つプロセッサーでしか実行されないわけではない。マルチプロセッサーシステムの場合、Windowsのディスパッチャーは以下のような手順で、実行するプロセッサーを決定する。

 Windowsでは、各プロセッサーごとに「アイドルスレッド」が用意されており、スレッドが割り当てられていないプロセッサーは、このアイドルスレッドを実行している。そこで、現在アイドル中のプロセッサーがひとつだけならば、それがスレッドを実行する。

 もし複数のプロセッサーがアイドル状態なら、スレッドの設定により実行する“最適”なプロセッサーを探して実行させる。最適なものがなければ、前回そのスレッドを実行したプロセッサーを探す。プロセッサーがそのどれでもない場合には、ディスパッチャーを実行しているプロセッサーがそのスレッドを実行する。ここで言う“最適”なプロセッサーとは、設定により強制的に指定されたプロセッサーである。また設定がない場合には、最初にそのスレッドを実行したプロセッサーか、複数のスレッドを実行していない物理プロセッサーが割り当てられる。

 各スレッドは「Affinityマスク」と呼ばれる情報を持つ。これは64bitのデータで、1bitが論理プロセッサーに対応しており、各スレッドがどの論理プロセッサーで実行可能なのかを示すものだ。ここになにも設定しないと、スレッドはどの論理プロセッサーでも実行が可能となる。しかし、ユーザーやアプリケーション自身がAPIを経由してAffinityマスクをセットすることで、Windowsはスレッドが動作できる論理プロセッサーを、このマスクにしたがって選択するようになる。またスレッドは、自身を最初に起動したプロセッサーを記憶しており、他の条件がなければ、なるべく同じプロセッサーを使う(暗黙的なAffinityと言える)。

 ただし、64個以上の論理プロセッサーがある場合には、NUMAの構成ごとにグループを作る。スレッドの割り当てはグループ内でのみ行なうようにして、スレッドを実行可能なプロセッサーを64個以下に制限する。このNUMAグループは、メモリーアクセスのコストが小さくなる単位である。グループを越えてのメモリーアクセスは、遅延が大きくなる。そのため割り当てる論理プロセッサーを制限することで、遠方のメモリーにあるスレッドを実行するような、効率の悪いスレッド割り当てを回避している。

カテゴリートップへ

この連載の記事

注目ニュース

ASCII倶楽部

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

ピックアップ

ASCII.jp RSS2.0 配信中

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