Windows 7 の新機能 - ユーザーモードスケジューラー (UMS; User Mode Scheduler)

Windows 7, Windows Server 2008 R2 の新機能を紹介していこうと思います。UI変更は取り上げられる機会が多いのですが Kernelの変更についてはあまり情報が出ていませんよね。そんなわけで今回は User Mode Scheduler について取り上げたいと思います。

従来の Threading の実装では、I/O操作や同期処理などで生じるカーネルモード処理の待機のために多くのコンテキストスイッチが必要とされていました。 OS の動作に詳しい方はよくご存知だと思いますが、それぞれの Thread には実行状態を保存するコンテキストが割り当てられています。

image
コンテキストスイッチはそれ自体がオーバーヘッドを伴う処理であり、またスケジューリングが OS に委ねられているため、例えば数値計算のように切り替えを自分で制御したい場合にも常に汎用的な排他処理を利用しなければなりませんでした。

Windows NT では Threading が抱えるこれらの課題に対し、Fiber (軽量スレッド)が実装されました。しかし個々の Fiber は対応するカーネルモードスレッドを持たないため、システムコールの呼び出しには注意を要することになりました。

新たに導入された UMS では Fiber の軽量さと通常の Threading が持つ柔軟性を同時に実現することができます。 UMSは Windows Server 2008 R2, Windows 7 (x64) で利用可能です。
UMS ではユーザーモードのスレッドの切り替えにカーネルモードのスレッドを切り替える必要がありません。よってコンテキストスイッチを軽減することが可能となります。

image

また UMS内のスレッドでシステムコールが行われた場合、対応するカーネルスレッドへの切り替えが行われシステムコールは対応するカーネルモードスレッドで行われます。これにより安全にシステムコールを行うことが可能となります。

image

また、カーネルモードスレッドによって処理がブロックされた場合、UMS ではカーネルモードスレッドはそのままに、待機状態のユーザーモードスレッドを実行することで CPU の性能を無駄なく発揮できます。

これらの特徴により、数値計算や、処理時間が I/O 処理に対して相対的に長い Thread Pool では大きな恩恵を受けることができます。
次期開発環境である Visual Studio 2010 では標準 C++ TR1 拡張に加えて並列プログラミングをサポートするための機能が追加されます。その基盤として Concurrency Runtime (ConcRT) が提供されますが、Concurrency Runtime では UMS を内部で使用する予定です。

実際に UMSを利用したプログラムの例はまたの機会に取り上げたいと思います。