スポンサーリンク

MI_SWITCH(9) FreeBSD カーネル開発者マニュアル MI_SWITCH(9)

名称

mi_switch, cpu_switch, cpu_throw − 別のスレッドコンテキストへのスイッチ

書式

#include <sys/param.h>
#include <sys/proc.h>

void

mi_switch(void);

void

cpu_switch(void);

void

cpu_throw(void);

解説

mi_switch() 関数はマシン非依存なスレッドコンテキストスイッチの前処理を実 装しています。横取り不可能なカーネルモード実行の方針の結果として、カーネ ル内の数少ない区別された場所からのみ呼び出されます。いくつかの主な mi_switch の使用は以下に挙げられます。

             1. sleep(9), tsleep(9) および msleep の中から、あるリソースが利用可能になるのを待つために現在のスレッドが自発的に CPU を放棄するとき。

2. トラップ (例えば、システムコール、デバイス割り込み) の取り扱い の後で、カーネルがユーザモード実行のために戻る準備のとき。通常 この場合は、現在のプロセスのシグナル配置の中の変化の検出の後で マシン依存のトラップハンドリングコードによって取り扱われるか、 より高い優先度のスレッドが実行可能になったかもしれないときで す。後者のイベントはマシン定義の need_resched() の呼び出しによ るマシン非依存のスケジューリングルーチンによって伝達されます。

3. シグナルハンドラコード (issignal(9) を参照) の中で、プロセスを 停止させるシグナルが届けられた場合。

4. スレッドが thread_exit(9) の中で終了し、プロセッサの制御が次の 実行可能のスレッドに渡されることが可能なとき。

5. thread_suspend_check(9) 中で、全体としてのプロセスの停止状態の ために、スレッドが実行を停止する必要がある場合。

mi_switch() はプロセス構造体の中に現在のプロセスが実行された時間量を記録 して、そのスレッドに割当てられている CPU の時間リミット (getrlimit(2) を 参照) に照らしてこの値を検査します。ソフトリミットの超過はそのプロセスに SIGXCPU シグナルが配信される結果を招き、一方ハードリミットの超過は SIGKILL を引き起こします。これらの管理上の仕事が完了した後で、 mi_switch() は実際にプロセスコンテキストスイッチを行なうマシン依存ルーチ ン cpu_switch() に制御を引き渡します。

cpu_switch() は優先度キューデータ構造において、実行準備のできているプロセ スの中から選択します。優先度キューは、キュー先頭構造体である配列 qs[NQS] で構成されます。個々のキュー先頭構造体により、同じ優先度の実行可能なプロ セスのリストを識別します (<sys/proc.h> を参照)。単一の語 whichqs は、空で はないキューが分かるビットマスクを含み、素早くプロセスを選択することを助 けます。 cpu_switch() は最も高い優先度を持つキュー上のリスト (
qs
の中の 低いインデックスが高い優先度を示す) から最初のプロセスを削除しなければな らず、グローバル変数 curproc にそのプロセス構造体のアドレスを割当てなけれ ばなりません。実行キュー上に利用可能なプロセスがない場合には、 cpu_switch() は ‘‘idle’’ ループに移行することになっています。 idle ループ は割り込みを許可する必要があります。これにより、やがてプロセスが実行 キュー上に再び現れます。 cpu_switch() がこの発生を待っている間は変数 curproc は NULL であるべきです。

mi_switch() および当然 cpu_switch() は splhigh() で呼び出されるべきである ことに注意してください。

関連項目

issignal(9), spl(9), tsleep(9), wakeup(9)

FreeBSD 10.0 November 24, 1996 FreeBSD 10.0

スポンサーリンク