Mac OS Xのカーネル Xnuのメモ書き

Asynchronous System Traps


ソフトウェア割り込みのようなもの。ast_on(x)でASTをスケジューリングすると非同期にASTの処理が行なわれる。


No.AST要因
用途
1
AST_PREEMPTスレッドのプリエンプションを発生させる。
2
AST_QUANTUMスレッドがCPU時間を使いきってコンテキストスイッチしたことを示すフラグ
3
AST_URGENTAST_PREEMPTと共に用いられる。このフラグがついていると、プリエンプト時に他の保留中のASTは処理されず、真っ先にプリエンプトされる。
4
AST_HANDOFFCPU時間が残っているが、他のスレッドにコンテキストスイッチしたことを示すフラグ
5
AST_YIELDthread_switch()(Machのスレッドインタフェース)などによって明示的にコンテキストスイッチを発生させてCPUを手放したことを示すフラグ。
6
AST_APC
7
AST_BSDBSD側から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()
保留中(まだ処理していない)のASTのビットマップへのポインタを取得する。
ビットマップはCPU単位に存在する。

i386_astintr(preemption)
ASTの処理を起動するASTハンドラ。
例外、割り込み、システムコールから戻る時に呼び出されている(locore.s)。
最後に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_BSDの処理ルーチン。
BSD部分に実装されている。ast_taken()から呼び出される。

シグナルの発行を行なっている。


最終更新 2006/06/08 09:27:05 - kztomita
(2006/05/19 23:27:57 作成)


最近更新したページ