Asynchronous System Traps
ソフトウェア割り込みのようなもの。ast_on(x)でASTをスケジューリングすると非同期にASTの処理が行なわれる。
[関連ルーチン]
ast_on(reason)
i386_astintr(preemption)
ast_taken(reasons, enable)
シグナルの発行を行なっている。
No. | AST要因 | 用途 |
---|---|---|
1 | AST_PREEMPT | スレッドのプリエンプションを発生させる。 |
2 | AST_QUANTUM | スレッドがCPU時間を使いきってコンテキストスイッチしたことを示すフラグ |
3 | AST_URGENT | AST_PREEMPTと共に用いられる。このフラグがついていると、プリエンプト時に他の保留中のASTは処理されず、真っ先にプリエンプトされる。 |
4 | AST_HANDOFF | CPU時間が残っているが、他のスレッドにコンテキストスイッチしたことを示すフラグ |
5 | AST_YIELD | thread_switch()(Machのスレッドインタフェース)などによって明示的にコンテキストスイッチを発生させてCPUを手放したことを示すフラグ。 |
6 | AST_APC | |
7 | AST_BSD | BSD側からASTを起動するのに使用する。 |
AST_PREEMPT,URGENT,BSD以外はTrapの発生には使われず、スレッドのブロック要因を示すthread->reasonで使用されるだけみたい。
[関連ルーチン]
ast_on(reason)
ASTの起動。ast_on(AST_PREEMPT)のようにする。
reasonがCPU毎のビットマップの保存され(ast_pending()で取れる)、実際の処理は非同期(Asynchronously)に実行される(i386_astintr(),ast_taken())。
ast_pending()reasonがCPU毎のビットマップの保存され(ast_pending()で取れる)、実際の処理は非同期(Asynchronously)に実行される(i386_astintr(),ast_taken())。
保留中(まだ処理していない)のASTのビットマップへのポインタを取得する。
ビットマップはCPU単位に存在する。
ビットマップはCPU単位に存在する。
i386_astintr(preemption)
ASTの処理を起動するASTハンドラ。
例外、割り込み、システムコールから戻る時に呼び出されている(locore.s)。
最後にast_taken(AST_ALL)を呼び出して、保留中のASTを処理する。
最後にast_taken(AST_ALL)を呼び出して、保留中のASTを処理する。
ast_taken(reasons, enable)
AST起動処理のCPU非依存部分。i386_astintr()から呼ばれる。
未処理のASTのうち、reasonに指定されているものを処理する。
AST_BSD → bsd_ast() BSDがわの処理ルーチンへ
AST_APC → act_execute_returnhandlers()
AST_PREEMPT → thread_block_reason()でコンテキストスイッチ。AST_URGENTもついている場合は他のASTを処理する前にプリエンプトする。
bsd_ast(thr_act)未処理のASTのうち、reasonに指定されているものを処理する。
AST_BSD → bsd_ast() BSDがわの処理ルーチンへ
AST_APC → act_execute_returnhandlers()
AST_PREEMPT → thread_block_reason()でコンテキストスイッチ。AST_URGENTもついている場合は他のASTを処理する前にプリエンプトする。
AST_BSDの処理ルーチン。
BSD部分に実装されている。ast_taken()から呼び出される。
BSD部分に実装されている。ast_taken()から呼び出される。
シグナルの発行を行なっている。