Linuxカーネルの待機キューには、割り込み処理、プロセスの同期、およびタイミングのための多くの用途があります。ここで言うのは、プロセスは特定のイベントが発生するのを待たなければならないことが多いということだけです。待機キューは、イベントに対する条件付き待機を実装します。特定のイベントを待機したいプロセスは、適切な待機キューに入れられ、制御を放棄します。したがって、待機キューは一連のスリーププロセスを表し、特定の条件が満たされると、それらはカーネルによって起動されます。
待機キューは、待機キューヘッダー(wait_queue_head_t)と要素(待機キュー項目)にプロセス記述子へのポインタが含まれる待機キューエントリ(wait_queue)から構成される循環リンクリストによって実装されます。各待機キューは待機キューヘッドを持ち、待機キューヘッダーはwait_queue_head_t型のデータ構造です。
は待機キューヘッダーを定義します(関連する内容はlinux /include /wait.hにあります)。 Br>
キューヘッダ構造の定義を待ちます。
struct wait_queue_head {
spinlock_t lock; //ウェイトキューヘッダで使用されるスピンロック変数
struct list_head task_list; //list_head
}待機キューへ
typedef struct __wait_queue_head wait_queue_head_t;
待機キューを使用するときは、最初にwait_queue_headを定義する必要があります。 DECLARE_WAIT_QUEUE_HEADマクロが実行されます。これは静的に定義されたメソッドです。このマクロはwait_queue_headを定義し、構造体および待機キュー内のロックを初期化します。
タスクがwait_queue_headでスリープする必要がある場合、タスクは自身のプロセス制御ブロック情報をwait_queueにカプセル化してからハングします。 wait_queueのリンクリストにロードされ、スケジュールされたスリープを実行します。特定のイベントが発生すると、別のタスク(プロセス)がwait_queue_headにあるタスクの1つまたはすべてをウェイクアップし、ウェイクアップ作業によって、待機キュー内のタスクがスケジュール可能な状態に設定され、キューから削除されます。
(2)デバイス操作を実行したときに取得できないプロセスがキューに格納されるのを待っています。
待機列の定義:
struct wait_queue {
unsigned int flags; //prepare_to_wait()にはフラグに対する操作があります。意味を理解するために参照してください。
#define WQ_FLAG_EXCLUSIVE 0x01 //flagsの値を変更するために使用されるprepare_to_wait()内の定数
void * private //通常は現在のタスク制御ブロックを指す
wait_queue_func_t func; //ブロッキングタスクの機能をウェイクアップし、ウェイクアップを決定する
struct list_head task_list; //ブロッキングタスクリスト
};
typedef struct __wait_queue wait_queue_t;
投票実行分析
1.select/pollのデメリット
select /pollのデメリットは次のとおりです。1.呼び出すたびに、ユーザーモードからパラメータを繰り返し読み込みます。 2.ファイル記述子は、呼び出されるたびに繰り返しスキャンされます。 3.呼び出しが開始されるたびに、現在のプロセスは各ファイル記述子の待機キューに入れられます。呼び出しが終了すると、プロセスは各待機キューから削除されます。
2.カーネルの実装
2.1主なデータ構造:
(1)struct poll_table_entry {
struct file filp;
wait_queue_t待機; //内部的にプロセスへのポインタを持っています
wait_queue_head_t wait_address; //キューのヘッダーを待つ(待機キューには二重リンクリストでつながった複数のwait_queue_tがあります)
};
(2)struct poll_table_page {
struct poll_table_page next;
struct poll_table_entry entry;
struct poll_table_entry entries [0];
};
(3)struct poll_wqueues {
poll_table pt; //通常は__pollwaitまたはnullを指す関数ポインタ。
struct poll_table_page * table;
int error;
};
(4)struct poll_list {
struct poll_list * next; //kmallocにはアプリケーションデータの制限があるため、メモリページで接続します。
int len; //ユーザースペースに渡されたfdの量
struct pollfd entries [0]; //ユーザースペースに格納されているデータを格納します。
};
typedef void(* pol l_queue_proc)(構造体ファイル*、wait_queue_head_t *、構造体poll_table_struct *); typedefは構造体poll_table構造体{poll_queue_procのqproc;} poll_table;総図
INTの
ログイン
2.2ポーリングシステムコール機能ポーリング(pollfd * fds、nfds_t、nfds、intタイムアウト);
この期間win8.1のMac OS X 10.9マーベリックス2つのオペレーティングシステムほぼ同時にリリース、実際には、Ubuntu 13.10もあります。さて、私はMacを買うお金がない貧しい人
adbシェル端末で、電話の現在のすべてのプロセスステータスを表示するには、psと入力しますpsのフルネームはProcess Statusです。
1. psコマンドのパラメータ
Grep `; すべての一般的なアプリケーションを見るandroidはシングルユーザなので、通常のプロセスのユーザはu0 で始まり、googleはandroidをもっとサポートするようになること
わずかに大きいサイトでは必然的に負荷分散されますが、ハードウェア負荷分散は高価です。ソフトウェアロードバランシングとしてLinuxの下に安価なnginxがあります。 I.実験的な環境設定とトポロ
に対するUbuntu Linuxシステムのサポート米国の技術ブログTNWによると、有名なLinuxベンダーCanonical Corporationは本日、タブレットをサポートする新しいUbuntu