WaitQueue
Rev.10を表示中。最新版はこちら。
ブロックしたプロセスをつないでおくキュー。ブロックする要因毎にキューがある。
[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もそんな感じでブロック要因毎に存在する。
[関連関数]
wait_queue_assert_wait(wq, event, interruptible, deadline)
カレントプロレスを指定WaitQueueに入れる。
プロセスを止める手順としてはthread_block()の前にこの関数をよんでプロセスをWaitQueueに入れておく。
プロセスを止める手順としてはthread_block()の前にこの関数をよんでプロセスをWaitQueueに入れておく。
wait_queue_wakeup_one(wq, event, result)
指定WaitQueueの指定eventのプロセスを1つだけ起動する。
wait_queue_wakeup_all(wq, event, result)
指定WaitQueueの指定eventのプロセスを全て起動する。
[イベントとは]
WaitQueueに繋いだプロセスを後でWakeupする際に、Queue内のどのプロセスを起こすか指定する識別子のようなもの。
イベントとはいっても何か既定のdefine値があるわけではない。eventの実態はvoid *でただの値。どういう値を使うかは各Queueの自由だがQueue内でevent値のバッティングが
通常は何か関連するデータのポインタ値をeventとして使ってユニークな値となるようにする
wait_queue_wakeup_all()でまとめて起こす必要がる場合はっっっk
セマフォのWaitQueueではSEMAPHORE_EVENT(semaphore_event変数のアドレス)を固定値で使用している。
&semaphore->wait_queue
SEMAPHORE_EVENT
(semaphore_wait_internal()参照)。
同じセマフォを取ろうとしてブロックしたプロセスは
wait_semaphore->wait_queueにつながって同じevent値を持つ
セマフォを解放した際は、自セマフォ構造体の
wait_queue_wakeup64_all_locked(&semaphore->wait_queue,
SEMAPHORE_EVENT,
semaphore_event変数のアドレス
semaphore_wait_internal()参照