ソフトウェア開発では、一部の条件が満たされないためにタスクがスリープ状態になり、待機条件が満たされると実行を継続し、実行状態に入る必要があります。この要件はキューメカニズムによってサポートされる必要があります。待機キューのメカニズムは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
待機キュー内のすべてのタスクを起動する
- ldquo;本物のプログラマはIDEを使用せず、プラグイン付きのテキストエディタを使用してコードを作成します。 &rdquo;このような意見は、ある場所ではいつでも聞くことができます。しかし、ま
でハードドライブまたは不良ブロックをチェックする badblocksは、不良セクタ用にハードディスクおよび外部ドライブをスキャンまたはテストできる、Linuxのようなオペレーティングシステムのコマンド
パブリックIPは、InterNICによって割り当てられ、クラスベースのネットワークIDまたはCIDRベースのアドレスブロック(CIDRブロックと呼ばれる)で構成され、グローバルインターネットで保証され
ACLは、アクセス制御リストの略語です、主な目的は、詳細な権限に加えて、伝統的な所有者、グループ、他の人の読み取り、書き込み、実行権限を提供することです。 ACLを使用して、単一のユーザー、単一のファ