(ソフト)リアルタイム処理 - スレッドスケジューリング

ゲームはリアルタイム性を要求されるタスクがそれなりに存在する。このため、どうしてもカーネルに依存した方法でリアルタイムスレッドを作る必要が有る。リアルタイムスレッドに依存したプログラムとしてはjack(オーディオサーバ)が有るので、これの実装を見ていく。
ちなみに、WindowsLinuxは更にI/O優先度もサポートしている。もしかしたらメモリページングの優先度をサポートしているカーネルも存在するかもしれない。

Windows

Windowsでは、基本的に"Pro Audio"なMultimedia class scheduler service(MMCSS)を使用する。それが使用できない場合は、THREAD_PRIORITY_TIME_CRITICALを使用する。この優先度の使用に特殊な権限は不要となっている。Windowsでは、対話プロセスに対するcgroupのような概念が運用されていないため、悪いユーザがTIME_CRITICALなスレッドを使うとシステムを止めることができてしまう。このような事態を防ぐためにはQuotaが使用できる。
MMCSSは、スケジューラのパラメタをあらかじめ定義された"クラス"に従って自動設定してくれるサービスで、Vista以降のWindowsで使用できる。"Pro Audio"以外に"Audio"とか"Games"等事前定義されたクラスがいくつか存在する。
MMCSSは他のプロセスとの共存を意識して設計されている点が特色と言える。プロセスがフォアグラウンドであるかどうか等も、優先度判断の要素となる。

Mac OS X / iOS

OSXiOSカーネルMachを元にしており、MachのスレッドAPIを使用して細かいパラメタを調整することができる。リアルタイムスレッドのためにはTHREAD_TIME_CONSTRAINT_POLICYを使用する。
通常のPOSIX OSと異なり、リアルタイムスケジューリングポリシーの使用に特殊な権限は必要ない。つまり、悪いユーザはマシンを止めてしまうことが(原理的には)可能となっている。実際にはnice値の制約も効くため、正しく設定されたシステムではそのようなことは起こらない。

pthread / Linux / Android / Solaris

普通にSCHED_FIFOを使っている。Androidだけ実装が分離されているが、他のOSではpthreadのインターフェースで実装されていることになる。
これらのOSでリアルタイム性を確保するには、jackそのものを適切な権限で起動し、十分なnice値を与える必要がある。

シンプル vs. インテリジェント

こうして比較してみると、Windowsの頭でっかち振りは際立っているように見える。MSはXbox360でもWinNTスケジューリングを採用しているが、ゲーム用の特殊な要件をも同時に処理している。他のゲーム専用機はRTOSのそれに近い。(もっとも、マルチコアなシステム自体ゲーム専用機の歴史では珍しいものとは言える。)
MMCSSのような複雑なデザインが、他のOSに比べて優位性を提供できるかどうかは微妙なポイントでは有る。しかし、AndroidのようなLinuxを採用したモバイルプラットフォームは基本的に一つのアプリケーションフレームワークの中でタスクを抽象化し、より高度なスケジューリングを可能にする余地を持たせている。また、MMCSSも実際にはWindowsサービスとして実装されており、高い優先度と特殊な権限をもってユーザのタスクの優先度引き上げを可能にしているに過ぎない。