091130

|


久々に飲み過ぎた。今日は酒がまずい。いつもこのくらまずければ楽々節酒な
のだけど...。はしごした先では本当久々の酒友達に会えて楽しかった。しかし
はしごするともう体がだめだな〜。しばらく反省しよう。

スケジューラアクティベーション、ちょっと構造がつかめてきた。基本的には シグナル配送のようなものだ。そうなると、ユーザ層だけのスレッドパッケー ジの実装で、ブロックのシステムコールを、ノンブロックにして、シグナルで スケジューリンングをするようなことの一般化の面があるか。Machではシグナ ルはタスク例外ポートを使ってUXサーバが実装する。スケジューラアクティベー ションもこの枠組みで構成できないだろうか?効率は悪いけど。現実にはここで 実装したような一般的なアップコールの仕組みを特定の状況のために作ってお いた方が、いいとは思う。
Adding Scheduler Activations to Mach 3.0

Paul Barton-Davis, Dylan McNamee, Raj Vaswani, and Edward D.Lazowska
University of Washington

Technical Report 92-08-03 Reversed March 1993
続き。
2. スケジューラアクティベーションのためのカーネル支援

この章ではスケジューラアクティベーションをサポートするためにMach 3.0 カー
ネル*(MK78)に加えた変更について説明する。* UXサーバへの変更は必要ないカー
ネルからの観点では、スケジューラアクティベーションは伝統的なMachのカー
ネルスレッドであり、タスクに起因する(あるいは影響する)、イベントをユー
ザ層に反映するという追加的な特性をもつ。

2.1 初期化

変更されたMachカーネルは、伝統的なMachのタスク(これらはMachのカーネルス
レッドを要求する)と、スケジューラアクティベーションを使うタスクの両方を
サポートする。タスクは次に示す新しいシステムコールを使って、スケジュー
ラアクティベーションを使用することをカーネルに通知する:

 + task_register_upcalls (task, upcalls). ユーザ空間の入口の組を登録す
   る: ユーザ層へのアップコールルーチンのアドレスである。

 + task_recycle_stacks (task, count, stacks). カーネルに'count'個のユー
   ザ空間のメモリを提供する。カーネルがアップコールをする時、これらの領
   域の一つがスケジューラアクティベーションのアップコールのユーザ層の実
   行スタックとして使われる。特定のスタック上の情報が、タスクにとって有
   用でない時、カーネルは検知できないので、タスクがこれらのスタックを管
   理する必要がある。タスクはアップコール中のカーネルの使用のために、ス
   タックは常に使用可能であることを保証しないといけない(4.4.2章を見よ)

 + task_use_scheduler_activations (task, TRUE). カーネルのタスクの構造
   体のスケジューラアクティベーションを使うビットを設定。タスクがこ
   の'using_sa'ビットを設定したなら、そのタスクで作られる全てのカーネル
   スレッドは、(これに関連する)ビットを設定する。この'is_sa'ビットはカー
   ネルスレッドは事実上、スケジューラアクティベーションだということを意
   味する。カーネルはこのビットを以下に述べる特定のイベントを、どう処理
   するかの決定に使う。

   この呼び出しの副作用として、呼び出したカーネルスレッド(タスクの中の
   たった一つだけ実在するスレッドを想定する)は、スケジューラアクティベー
   ションに変化する。この呼出しから戻ってきた時には、タスクはスケジュー
   ラアクティベーションの意味論での、その通常な実行を続けるだろう。

タスクの状態を管理するのに、柔軟性のために複数のシステムコールを使うこ
とにした。この方法は初期化時間に多少のオーバーヘッドがあるが、最終的に
タスクの状態をよりよく管理できる(例えば、いつでも、登録されたアップコー
ルハンドラを変更できるというような)ということに対して許せる代価であると
みなした。