WaitQueue
Rev.8を表示中。最新版はこちら。
作成中ブロックしたプロセスをつないでおくキュー。
ブロックする要因毎にキューがある。
プロセスを止める手順としてはプロセスをキューにつないだ後、thread_block()でプロセスをブロックする。
eventは他だのキー
void *で
ブロック要因に応じたキー(アドレスだったり)
データのポインタをイベントとしてつかってユニークな値となるようにする
[WaitQueueの例]
スケジューラのWaitQueue
sched_prim.c::wait_queues[]
スケジューラがブロックさせたプロセスが繋がれる。
sched_prim.cからassert_wait()でこのキューに繋ぐ。
配列のインデクスはeventのハッシュ値。たくさんのプロセスが繋がれるのでばらけるようになっている。
スケジューラがブロックさせたプロセスが繋がれる。
sched_prim.cからassert_wait()でこのキューに繋ぐ。
配列のインデクスはeventのハッシュ値。たくさんのプロセスが繋がれるのでばらけるようになっている。
セマフォのWaitQueue
struct semaphore::wait_queue
セマフォ取得待ちでブロックしたプロセスがつながれる
セマフォ取得待ちでブロックしたプロセスがつながれる
LinuxなんかだとBlockDevice構造体にI/O待ちのWaitQがあったりした。Xnuもそんな感じでBlock要因毎に存在する。
[関連関数]
wait_queue_assert_wait(wq, event, interruptible, deadline)
カレントプロレスを指定WaitQueueに入れる。thread_block()の前にこの関数をよんでプロセスをWaitQueueに入れておく。
wait_queue_wakeup_one(wq, event, result)
指定WaitQueueの指定イベントを待っているプロセスを1つだけ起動する。
wait_queue_wakeup_all(wq, event, result)
指定WaitQueueの指定イベントを待っているプロセスを全て起動する。