04/08/11 22:28.net
軽量カーネルスレッドモデル
DragonFlyはその中核部分に軽量カーネルスレッド(LWKT)を用います。
システムのプロセスは全てスレッドと結びついていて、カーネルのみの
プロセスのほとんどは事実上純粋なスレッドです。たとえば、pageout
デーモンは純粋なスレッドでプロセスコンテクストを持ちません。
LWKTモデルはアーキテクチャによらないいくつかの鍵となる特徴があります。
これらの特徴はCPU間の競合を除く、あるいは減らすために設計されています。
1.システムの各CPUは自己完結のLWKTスケジューラを持ちます。スレッドは意図的に
CPUに結びついていて、いくつかの特殊な状況下でのみ他のCPUへ移動することが
できます。特定のCPU上のLWKTスケジューリング処理はそのCPU上でのみ直接
実行されます。これは、LWKTスケジューラ本体がスケジュール追加、除去、
CPU内でのスレッド間スイッチを、ロックを一切せずに処理できるということです。
単純なクリティカルセクションの除いてはMPロックもなにもなしにです。
2. スレッドはカーネルで動作中は他のCPUにプリエンプティブに移動されることは
ありません。スレッドはブロックされている間はCPU間を移動しません。
ユーザランドスケジューラはユーザモードで実行しているスレッドを移動できます。
スレッドは非割り込みスレッドへプリエンプティブにスイッチすることは
ありません(この間FreeBSD初心者スレで出た話題のやつね)。割り込みスレッドが
カレントスレッドをプリエンプトする場合、割り込みスレッドが終了または
ブロックした時点でプリエンプトされた方のスレッドはスケジュール状態によらず
復元されます。たとえば、あるスレッドはlwkt_deschedule_self()を呼んだあと、
実際に(別のスレッドへ)スイッチする前にプリエンプトされる可能性があります。
これは問題ありません。なぜなら割り込みスレッドが完了またはブロックしたあと
そのスレッドに直接制御が戻るからです。