Linux多重化機構の原理解析 - セレクト/ポーリング

序文

Linux アクセス デバイスには、ノンブロッキング IO モデル、ブロッキング IO モデル、IO 多重化モデル、シグナルドリブン モデル、および非同期 IO モデルの 5 つの主要な IO モデルがあります。この記事では主に IO 多重化モデルについて分析します Linux での IO 多重化モデルは主に select/poll/epoll などのメカニズムによって実装されます。
IO多重モデルでは、ノンブロッキングで複数のデバイスを監視できます。具体的なモデルは下図のとおりです。図からわかるように、
ここに画像の説明を挿入しますselect/pollでは複数のデバイスを監視できます。いずれか1つのデバイスが条件を満たしていれば、複数のデバイスを監視できます。 、select/poll 特定の応答が返されますが、それ以外の場合はスリープして待機します。つまり、ユーザーが興味のある条件を選択/投票監視させます。

原理

コール分析を選択する

ここに画像の説明を挿入します
1. select システム コールの最後のコア操作は do_select 関数で処理され、元の関数は fs/select.c ファイルを参照します
2. do_select 関数は主に次のキー操作を実行します。

  • poll_initwait を呼び出して、コールバック処理用のドライバ関数を関連付けるために使用されるコールバック関数の初期化を含む、poll_wqueues 構造体を初期化します。

  • 監視対象のファイル記述子をループします。監視条件が満たされたら、構造体 file_operations 内の*f_op->poll (つまり、メンバー関数 unsigned int (*poll) (struct file *, struct poll_table_struct *);) 関数を呼び出します。; 加工用。
  • 監視条件が満たされない場合、schedule_timeout が呼び出されてスリープ処理が行われ、タイムアウトが発生したり、他の信号により中断された場合にウェイクアップします。

3. do_select 関数がループを終了するための条件: 監視条件が満たされ、タイムアウトが発生し、他の信号の割り込みによって起動されます。

選択と投票の違い

ポーリングは基本的に選択と似ています。どちらも監視にポーリング ファイル記述子を使用します。ファイル記述子が大きい場合、オーバーヘッドが増加し、パフォーマンスの低下につながります。選択は、デフォルトで 1024 のファイル記述子の最大数をサポートしますが、ポーリングはサポートしません. 特定の制限。

おすすめ

転載: blog.csdn.net/liang_zhaocong/article/details/130660957