Linuxカーネル待機キューのいくつかの使用法

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):

    特定の待機キューで現在のプロセスを無条件にスリープさせるために、この機能にはレース条件に対する保護メカニズムがないため、強くお勧めしません。

おすすめ

転載: blog.csdn.net/wangquan1992/article/details/108960083