Linuxカーネルの待機キューメカニズムは、ドライバー開発でよく使用されます。主にブロッキングアクセスを実装するために使用されます。以下に、待機キューの4つの使用法を簡単に要約します。これが、読者の役に立つことを願っています。
1.スリープして、特定の条件が発生するのを待ちます(条件がfalseの場合はスリープします)。
スリープモード:wait_event、wait_event_interruptible
ウェイクアップモード:wake_up(ウェイクアップ時に条件がtrueかどうかを確認し、falseの場合はスリープを継続し、ウェイクアップする前に条件がtrueになる必要があります)
2.手動スリープモード1:
1)待機キューアイテムを作成して初期化します
DEFINE_WAIT(my_wait)<==> wait_queue_t my_wait; init_wait(&my_wait);
2)待機キューアイテムを待機キューの先頭に追加し、プロセスの状態を設定します
prepare_to_wait(wait_queue_head_t * queue、wait_queue_t * wait、int state)
3)schedule()を呼び出して、他のプロセスの実行をスケジュールするようにカーネルに指示します
。4)スケジュールが戻り、後続のクリーンアップ作業を完了します
finish_wait()
3.手動スリープモード2:
1)を作成し、待機中のキューアイテムを初期化:
DEFINE_WAIT(my_wait)<==> wait_queue_t my_wait; init_wait(&my_wait);
2)待ち行列の先頭に待機しているキューアイテムを追加します。
add_wait_queue
3)を設定し、プロセスのステータス
__set_current_status(TASK_INTERRUPTIBLE)。
4)schedule()
5)待機キューアイテムを待機キューから削除します
remove_wait_queue()
実際、このスリープモードは、手動スリープモードの2番目のステップprepare_to_waitを2つのステップ、つまりprepare_to_wait <====> add_wait_queue + __set_current_statusに分割することと同じであり、他は同じです。
4.古いバージョンのスリープ関数sleep_on(wait_queue_head_t * queue):
特定の待機キューで現在のプロセスを無条件にスリープさせるために、この機能にはレース条件に対する保護メカニズムがないため、強くお勧めしません。