Windows system >> Windowsの知識 >  >> Linuxシステムチュートリアル >> Linuxチュートリアル >> Linuxシステムでの待ち行列の実装

Linuxシステムでの待ち行列の実装

  

ソフトウェア開発では、一部の条件が満たされないためにタスクがスリープ状態になり、待機条件が満たされると実行を継続し、実行状態に入る必要があります。この要件はキューメカニズムによってサポートされる必要があります。待機キューのメカニズムはLinuxで提供されています。これはカーネルで広く使用されています。

Linuxカーネルで待機キューを使用するプロセスは非常に簡単です最初にwait_queue_headを定義し、次にタスクがイベントを待機したい場合はwait_event(wait queue、event)を呼び出します。

待機キューは広く使用されていますが、カーネルの実装は非常に簡単です。リンクリストとアトミックロックを含む待機キューのチェインヘッダを記述する__wait_queue_head構造体は次のように定義されます:

struct __wait_queue_head {

spinlock_t lock; /*キューを待機しているアトミックロックを保護する* /

struct list_head task_list; /* wait queue * /

};

__wait_queue、構造は正しいタスクを待つという抽象概念。各待機タスクはwait_queueに抽象化され、wait_queue_headにマウントされます。構造体は次のように定義されています。

struct __wait_queue {

unsigned int flags;

void * private; /*通常は現在のタスク制御ブロックを指します* /

/*カーネルで提供されるタスクウェイクアップ操作メソッド、通常autoremove_wake_function * /

wait_queue_func_t func;

struct list_head task_list; /* mount mount_queue_headマウントポイント* /< Br>

};

次の図に示すように、タスクがwait_queue_headでスリープする必要がある場合、タスクは自身のプロセス制御ブロック情報をwait_queueにカプセル化してから、スケジュールされたスリープを実行するためにwait_queueのリンクリストにマウントされています。特定のイベントが発生すると、別のタスク(プロセス)がwait_queue_headにあるタスクの1つまたはすべてをウェイクアップし、ウェイクアップ作業によって、待機キュー内のタスクがスケジュール可能な状態に設定され、キューから削除されます。
ログイン

最初の静的に定義された方法であるDECLARE_WAIT_QUEUE_HEADマクロ、によって達成することができるwait_queue_head待ち行列を定義するために使用されます。このマクロはwait_queue_headを定義し、構造体および待機キュー内のロックを初期化します。もちろん、動的初期化の方法も非常に簡単です、あなたはロックとキューを初期化することができます。

タスクがイベントの発生を待つ必要がある場合、通常wait_eventを呼び出します。これは、wait_queueを定義し、待機中のタスクを記述し、現在のプロセス記述ブロックでwait_queueを初期化してからwait_queue_headに追加します。関数の実装フローは次のようになります。

1. wait_queueで記述された待機タスクを現在のプロセス記述ブロック(PCB)で初期化します。

2.キューロックリソースの保護を待っている間に、タスクが待機中のキューに参加するのを待ちます。

3.待ち合わせ条件が満たされているかどうかを判定し、満たされていれば、タスクがキューから削除されるのを待って関数を終了します。

4、条件が満たされていない場合は、タスクのスケジューリング、他のタスクへのCPUリソース。

5.スリープタスクが起きた後、(2)と(3)を繰り返し、確認条件が満たされたら、イベント待ち機能を終了します。

待機キュープログラミングインタフェース

1

wait_event

これは、現在のタスクを待機イベント状態にするマクロです。入力パラメータは次のとおりです。

@wq:待機キュー

@conditions:待機条件

2

wait_event_timeout

関数はwait_eventに似ています。タイムアウトメカニズムがあります。パラメータに余分なタイムアウトがあります。

3

wait_event_interruptible

これは、最初の2つのマクロと比較して、メッセージによって目を覚ますことができるマクロです。メッセージによって起動された場合は、 - ERESTARTSYSを返します入力パラメータは次のとおりです。

@wq:待機キュー

@condition:待機状態

@rt:戻り値

4

wait_event_interruptible_timeout

(3)と比較すると、タイムアウトのメカニズムはより多くなります。

5

wake_up

ウェイクアップ待ちキュー内の1つのタスク

6

wake_up_all

待機キュー内のすべてのタスクを起動する

Copyright © Windowsの知識 All Rights Reserved