スレッドのブロックと起動
プロセスをブロックさせるにはthread_block()を使用する。thread_block()する前にwait_queue_assert_wait()などでプロセスをWaitQueueに入れておく必要がある(図1)。
ブロックしていたプロセスを起こすには、wait_queue_wakeup_one()などを使用する(図2)。
[関連関数]
thread_block(continuation)
thread_invoke(old_thread, new_thread, reason)
thread_go(thread. wresult)
thread_wakeup(event)
[参考]
ブロックしていたプロセスを起こすには、wait_queue_wakeup_one()などを使用する(図2)。
図1 プロセスブロック時の流れ
図2 プロセス起動時の流れ
[関連関数]
thread_block(continuation)
カレントプロセスのブロックさせる。
本関数をコールする前に、wait_queue_assert_wait()などでプロセスをWaitQueueに入れておく必要がある。
continuationが指定されていた場合は、Wakeupするとcontinuationで指定した場所から再開する。(thread_invoke())
本関数をコールする前に、wait_queue_assert_wait()などでプロセスをWaitQueueに入れておく必要がある。
continuationが指定されていた場合は、Wakeupするとcontinuationで指定した場所から再開する。(thread_invoke())
thread_invoke(old_thread, new_thread, reason)
old_threadからnew_threadにコンテキストスイッチをさせる。
continuationが指定されていたら、そこから再開させる。
thread_go(thread. wresult)
プロセスをRun状態にしてRunQueueに入れる。
thread_wakeup(event)
thread_sleep_mutex()などのスケジューラ内のブロックルーチンでブロックしたプロセスを起こす。thread_sleep_mutex()などのスケジューラ内のブロックルーチンはwait_queues[]のWaitQueueにプロセスを入れる。thread_wakeup()ではwait_queues[]に入れられているプロセスを取り扱う。thread_wakeup時の流れは添付ファイル(thread_wakeup.png)参照。基本的にwait_queues[]を指定してwait_queue_wakeup_one()呼び出すようにしているだけ。
[参考]