端材処理運動。桧と一枚だけ杉。製材だけしておきました。木材に限らずそろ
そろもう一度、大廃棄運動しないとだめかな。このままではゴミに埋もれてし
まう。

スケジューラアクティベーション続き。やっと読み終わった...。今日読んだと
ころでは他の二層スケジューリングのOSとの対比をしている。ちょっとコメント。
きわどい領域に対する処理への著者らの対処は設計ではなく力づくな実装だ。
これを元に優位性を主張はないかと思う。I/O完了後の通知にしても、スケジュー
ラアクティベーションの場合、ユーザ層のスレッドの優先度にカーネルは一切
関知しないため、横取りしたプロセッサが実はユーザ層スレッドシステムでは
高優先度だったということがあり得る。なのでその場合横取りのし直しをカー
ネルに頼まないといけないため、余計なカーネル/ユーザのやり取りが生じる。
著者らはCPUがTest-And-Set命令しか実装していなくても大丈夫なようにこう実
装したけれど、スケジューラアクティベーションを実装する規模のマルチプロ
セッサのターゲットであれば、Load-Link/Store-Conditionalあるいは
Compare-And-Swap命令はあるだろう。wait-free同期にしてしまう方がいいかも。
他の2実装にある共有メモリは、いい解決になるかもしれない。ユーザ層でのス
レッド優先度をいちいちシステムコールで伝えていたら大変なことだけど、こ
れを共有メモリに置いておいて、カーネルが横取りする時にこれをヒントにす
れば余計なシステム/アップコールが防げる。(これはスケジューラアクティベー
ションのポリシーには反するけれど)
この共有メモリは4BSDのVAXのu領域のようにすれば、シグナル処理を含めた
アップコールの仕組みを素直に実装できそう。
I/O完了後、カーネルの後処理を終えてユーザに戻るとこまで実行してそのコン
テキストをアクティベーションに載せてユーザ層に渡すところは(これはかなり
面倒だ)Using Continuation to Implement Thread Management and
Communication in Operating Systemにあったような、継続を使って機種非依存
な形にもっていくといいだろう。
まず大切なのは旧来のシグナル機構のままきれいに実装することかな。Machの
場合、タスク間のポートによる通信になるわけだけど、ここまでやるとオーバ
ヘッドがきつい。旧来の実装は捨て難い。
Scheduler Activations: Effective Kernel Support for the User-Level
Management of Parallelism
Thomas E.Anderson, Brian N.Bershad, Edward D.Lazowska and Henry M.Levy
University of Washington
ACM Transactions on Computersystems, Vol.10, No.1, February 1992,p53-79.
6 関連する考え
Psyche[20]とSymunix[9]という二つのシステムはカーネル支援を改良すること
でユーザ層のスレッドを適切に統合するという我々の目標ととても関連がある。
両方ともNUMAマルチプロセッサのサポートを最初の目標としていた。Simunixは
高性能な並列UNIX実装として、Psycheは新しいOSとして。
PsycheとSymunixは1,2章で述べたように「仮想プロセッサ」を提供し、ユーザ
層にいくつかのカーネル事象を通知するソフトウェア割込みを定義することで、
これらの仮想プロセッサを補強する。(ソフトウェア割込みは同一プロセッサ上
の全ての割込みは同じスタックを使うということ(なので再入可能ではない)以
外はアップコールのようなものである。) Psycheはさらに、いろいろな種類の
ユーザ定義のスレッドが、異るアドレス空間でそのコードとデータを共有しな
がら、同期できるような、複数モデルの並行プログラムを念頭に入れて調査を
している。
Psyche、Symunixと我々の研究は似た目標を共有しているが、それに対する手段
はいくつかの重要な点で異なる。我々のやり方と違い、PsycheもSymunixもI/O、
ページフォルト、並行プログラムに対するカーネルスレッドの正確な機能を提
供していない。さらにユーザ層スレッドの操作の性能は妥協したものになる。
この理由については2章でいくつか検討した。これらのシステムはアドレス空間
に影響を与えるカーネル事象の全てではなく、いくつかをユーザ層に通知する。
例えば、PsycheもSymunixも横取りされた仮想プロセッサが再開したことをユー
ザ層に通知しない。結果として、ユーザ層スレッドシステムは、いくつのプロ
セッサを持っているのか、どのユーザスレッドがこれらのプロセッサ上で走っ
ているのかを知ることができない。
PsycheとSymunixの両方ともカーネルとそれぞれのアプリケーションの間に書き
込み可能な共有メモリを提供しているが、両者ともカーネルがプロセッサ再割
当てが必要なことをユーザ層が通知する効果的な機構がない。それぞれのアプ
リケーションが必要なプロセッサの数はその共有メモリに書くことができるが、
より多くのプロセッサを必要とするアプリケーションが、他のアプリケーショ
ンでアイドル中のプロセッサがあることを知るいい方法がない。
PsycheとSymunixのアプリケーションは不適切な時に(例えばスピンロックを保
持している時など)横取りが起こるのを防ぐために同期状態をカーネルと共有す
る。Symunixではカーネルと共有する変数をアプリケーションがセットしクリア
することで、きわどい領域の中にいることを示す。Psycheではアプリケーショ
ンがきわどい領域に入る前に差し迫った横取りを調べる。これらのビットをセッ
トしたりクリアしたり調べることによってロックの遅延が大きくなり、これは
高性能なユーザ層スレッド管理をする時のオーバーヘッドの大きな原因となる
[2]。対照的に、我々のシステムでは、横取りが実際に起きていなければロック
遅延への影響がない。さらに、これら二つのシステムではプロセッサを横取り
したいということを、実際に横取りをする「前に」アプリケーションに通知す
る。この通知を元に、アプリケーションはスレッド「安全」な状態を選ぶこと
ができ、そして自発的にプロセッサを放棄する。この機構は高優先度のスレッ
ドは常に低優先度のスレッドの代わりに実行されるという束縛を破る。
Guptaらは[9a]物理プロセッサと走行するユーザ層スレッドの実行コンテキスト
の1:1対応を維持するという目的を、我々と同じくしている。プロセッサの数よ
りも多くのコンテキストがある状態で、I/Oが完了あるいは横取りをする場合、
Guptaらのカーネルはアプリケーションを安全に中断できるところまで時分割し
て実行させる。我々のカーネルでは、コンテキストの数を一定のまま、時分割
をせずに、アプリケーションにその事象を通知することができる。
いくつかのシステムでは非同期カーネルI/Oをマルチプロセッサ上でのユーザ層
スレッドのいくつかの問題を解決するのに使っている[9,25]。実際、我々のシ
ステムは非同期I/Oのような雰囲気がある。I/O要求ができると、プロセッサは
アプリケーションに戻り、そしてその後でI/Oが完了するとアプリケーションは
通知される。しかし、われわれのシステムと伝統的な非同期I/Oとの間には二つ
の大きな違いがある。一つは、一番重要なことだが、スケジューラアクティベー
ションはプロセッサの横取り、I/O、ページフォルトの問題に対して一つの一様
な機構を提供する。非同期I/Oに較べて、全てのカーネルとのやりとりは、一つ
のスケジューラアクティベーションという見地から同じになるということによっ
て、我々の手法は概念的な単純さを引きだしている。カーネル内でブロックし
たスケジューラアクティベーションは待っていた事象が起こると新しいスケ
ジューラアクティベーションに取り換えられる。二つ目に、非同期I/Oではアプ
リケーションとカーネルの両方に大きな変更が必要となるかもしれないが、我々
のやり方では、ユーザ層スレッドシステムとカーネルの構造を大きく変更せず
に済む。
最後に、我々のこの仕組みの一部は、最初期のマルチプロセッサOSの一つであ
るHydra[26]に関連があり、Hydraではスケジュール方針はカーネルの外に出て
いた。しかしながらHydraは、この分離によって性能が悪く、というのはその方
針の決定にカーネルとスケジュールサーバとの通信が必要だったからであり、
その後コンテキストスイッチの実装はカーネル内になった。我々のシステムで
はアプリケーションはスレッドをプロセッサにスケジュールする方針を自分で
設定することができ、そしてこれはカーネルにトラップすることなく実装でき
る。我々のシステムでは長時間のプロセッサ割当ての決定は、カーネルの責任
であるが、Hydraでは、これは別々のアプリケーション層のサーバに任せるよう
になっていた。
7 要約
並行性をユーザ層で管理することが高性能並列計算に重要である。しかし、多
くのOSで提供されてきたカーネルスレッドあるいはプロセスでは貧弱な抽象で
ある。我々は、カーネルスレッド(頻繁ではないが、カーネルの介入がある場合
に正しい振舞いをする)の役割りと、ユーザスレッド(ほとんどの場合のスレッ
ド操作は全てユーザ層だけで実装できる)の性能を組合せたカーネルインター
フェースとユーザ層スレッドパッケージの設計と実装、そしてその性能につい
て述べた。我々の手法は、アプリケーションそれぞれのアドレス空間に仮想プ
ロセッサを与えるということを基本にし、アプリケーションはいくつのプロセッ
サがあるかということを正確に把握し、これらのプロセッサ上でどのスレッド
が走行しているかということも正確に把握する。カーネルとそれぞれのアプリ
ケーションのアドレスの間でその責任が分離される。
- プロセッサ割当て(アドレス空間へのプロセッサの配分)はカーネルによって
なされる。
- スレッドスケジュール(アドレス空間のスレッドをプロセッサへの配分)はそ
れぞれのアドレス空間でなされる。
- カーネルはアドレス空間に影響を与える全ての事象をアドレス空間のスレッ
ドスケジューラに通知する。
- アドレス空間は、カーネルのプロセッサ割当て方針に影響を与えるユーザ層
の事象のいくつかをカーネルに通知する。
これらの考えを実装するのに使ったカーネル機構をスケジューラアクティベー
ションと呼んだ。スケジューラアクティベーションはカーネル事象にあたって
その制御をカーネルからアドレス空間に誘導する実行コンテキストである。ア
ドレス空間のスレッドスケジューラはこのコンテキストで事象を処理したり、
ユーザ層スレッドのデータ構造を変更したり、ユーザ層スレッドを実行したり、
カーネルに要求を送るのに使う。我々の試作ではスレッドをユーザ層での並行
性の抽象化モデルとして実装したが、スケジューラアクティベーションは特定
のモデルに特定されない。スケジューラアクティベーションでは、カーネルは
ユーザ層のデータ構造に一切よらないので、いかなるユーザ層の並行性モデル
でもサポートすることができる。
謝辞
Andrew Black, Mike Burrows, Jan Edler, Mike Jones, Butler Lampson, Tom
LeBlanc, Kai Li, Brian Marsh, Sape Mullender, Dave Redell, Michael
Scott, Garret Swart, John Zahorjanの有用な意見に感謝する。そして
Fireflyのソフトウェアとハードウェアを提供してくれたDEC System Research
Centerに感謝する。
FF13続き。シャオロングイ狩りに戻りました。久々の一発目はかなり確実にダー
クマターを落とす気がする。自分の日記を見て、その通りにプレイしたにも関
わらず、一匹倒すのに3回死んだ。当時より武器は強くなっているのに。シャオ
ロングイの場合、敵の攻撃に合わせて確実にD/D/D入れないといけないので(タ
イマイならゲージだけ見てオプティマ切り替えるだけ)その攻撃パターンのリズ
ムに体が慣れないとだめ。先長いな〜〜。
最近のコメント