Posted at

スケジューラアクティベーション

More than 5 years have passed since last update.

スケジューラアクティベーションはマルチスレッドの実装方式の1つ。

カーネルスレッドの機能性とユーザスレッドの高性能さ・柔軟性を統合するために考案された。

過去に NetBSD のカーネルで実装されていた。

ユーザスレッド用に特別なノンブロッキングコールをつくるべきではないし、select で安全性を調べなくてもいいようにしたい。

ページフォルトでブロックしても同一プロセス内の他のスレッドを実行したい。

スケジューラアクティベーションでは、カーネルはプロセスごとに仮想 CPU を割り当てる。

1つのプロセスには最初は1つだけだが、そこからより多く要求したり開放することができる。

これを実現させるためのアイデアとして、カーネルはブロックを検知したらその情報をスタックにつんでから実行時システムにそれを通知(コール)するようにする。

実行時システムはプロセスごとに決められたアドレスにある。

おおまかにいえば UNIX のシグナルと似ている。

このようなコールを「アップコール」と呼ぶ。

いったんここから起動したら、通常通りレジスタなどを復元して再開する。

デバイスからの割り込みがきたら同様にアップコールで実行時システムに通知され、実行時システムは適切な処理をすすめる。

他のプロセスの入出力完了などで関係のない場合は、ハンドラの終了時に割り込まれたスレッドの状態を割り込まれる前に戻す。

スケジューラアクティベーションの欠点は、アップコールに頼っていることで階層構造に習わない実装になってしまうこと。

通常階層 n の提供するサービスは n+1 で用いられ、逆に n+1 が提供するサービスを n は利用しない。

アップコールでは n+1 で提供される実行時システムを n の階層であるカーネルが叩いてしまっている。