予備知識:コア原則ポーリングフック
カーネル関数はpoll_wait
カスタムキュー内で待機しているドライバーに加入の現在のプロセスを
代わりにイベントを駆動する場合、あなたは投票プロセスにドライブに待ちキュー定義のウェイクアップコールをカスタマイズすることができます
だから、poll_waitアクション:ドライバが知っていることができ、プロセスを待ち時にウェイクアップイベントの準備ができて
フックポーリング
カーネルf_op->世論調査で使用するための独自の待ち行列で駆動しなければならない、またはイベントは、このイベントのために待機するように発生した後、投票を呼び出す処理を牽引してきたかわかりません
カーネルf_op->ポール観光協会のページをご覧ください
ドライバーは、イベントが待っているコール・ポーリング処理する知っているので、コールpoll_waitは、現在のプロセスは、待ちキュー駆動装置上に置かれます
。この時点ですぐに確認することを既存のイベント(POLLIN \ POLLOUT \ POLLERR ......)と、カバーに戻りますコード示し
f_op->ポーリングが非ブロック操作で、直ちに、現在生産マスク形式のセットでイベントを示す戻り値を返します
例
snullを駆動する例:
snull 2つのドライバがキューを待ってカスタマイズされています:
INQ wait_queue_head_t;このキューで待機しているときなし読み出しデータ、//プロセスを読ん
wait_queue_head_tのOUTQ; //書き込み処理書き込むためのスペースがない場合、このキューで待機して
運転操作が読み出したデータを読み込みます読んsnullいるので、彼らのOUTQキューにプロセスを書くウェイク
キューINQにそのプロセスを目覚めさせ、データを読み書きしますsnullドライブが書かれている書き込み
Snullポーリング操作運転中:
poll_waitは、現在のプロセスINQに追加されます呼び出します。
OUTQにアクのpoll_wait現在のプロセスを呼び出して、
どのような現在のイベントを参照してください、マスクを返す
プロセスXが投票を呼び出し、プロセスXがINQおよびOUTQを待っているキューに表示されますことを前提としてい
書かれたsnull後、ウェイクINQので、投票を呼び出し、XのINQウェイクアップのプロセス入力
snullの読みは、ウェイクOUTQいるので、それがアップX-ウェイクへのポーリングプロセスのOUTQを呼び出すのと同じ方法で、
だから、読み取りおよび書き込みプロセスが待っているイベントが発生したコールの世論調査で起こされました
方言の
イベントが発生したときに私に言う:プロセスは、ポーリングが希望です呼び出します
そしてそれは、キュー待ちにこのプロセスを起動しますので、Eは、その対応する待機キューにそのプロセスによって生成されたイベントは、プロセスEのイベントを待っているとき
プロセスがポーリングを呼び出すときに、現在のプロセス内の世論調査では、適切な待機キューに配置する必要があります
このイベントが発生すると、彼らが対応する待機キューを持っているので、それが目覚めされますので、ポーリングプロセスを呼び出します
予選2:キュー待ちの
待機キューヘッド:wait_queue_head_tの
キューのメンバー:wait_queue_t
wait_queue_tメンバー:
void *型のプライベート;プロセス記述子に/ *ポイント* task_struct /
wait_queue_func_t FUNC; //ウェイクアップそのフック関数の場合、この関数が呼び出され
たstruct LIST_HEADのtask_list; //キューポインタリストは
、一般的に関数funcをフックは、デフォルトのカーネル関数default_wake_functionで、関数が目を覚ますことですプロセス
また、自動プロセスで私たちが目を覚ますために必要なアクションを実行待ちキュー機能にフックを設定する過程で主導権を握ることができます
epollキューは、フック関数を使用するには:イベントがrdlistするコンテンツのコピーを生成し
、この方法は、イベントが自動的にイベントを持っていた調査を扱う私たち自身のリスナーを通過することなくrdlistイベント内容になるだろう
詳しい情報http://www.cnblogs.com/apprentice89/archive/2013/05/09/3068274.htmを見ます
epollカーネル原則1:epoll_create1 / epoll_create呼んで
作成したファイルディスクリプタハンドルeventpollは、表され、そのファイルディスクリプタepfdに存在を返します。
eventpoll内部データ構造は、次のキーがあります。
rbtree:赤黒木、ノードrbtreeのように、ファイルディスクリプタ監視イベントがepitem構造を作成し、各ファイルに追加され
、大きな、容易なCRUD(O(LGN))を収容することができるファイルイベント:rbtreeの使用の利点
rdlist:コアのリストを、生成された電流が生成されたファイルハンドルを見て、前方のイベント(ここではファイルハンドルがepoll_eventはとして理解することができる)を格納するために使用される
プロセスは、待ってキューWQの参加するプロセスを待つイベントがepoll_wait呼び出すとき:WQを
eventpollキュー自体に起因eventpollは自身:poll_waitをまた、ファイルとして、それはファイルディスクリプタリスニング(通常は無益)このキューの選択/世論調査のために他の人/状況を呼び出すされています
:それを使用するシャシ侯でpoll_wait
ソケット= FD(...);
efd1 epoll_create =();
efd2 epoll_create =();
epoll_ctl(efd1、EPOLL_CTL_ADD、FD、...);
epoll_ctl(efd2、EPOLL_CTL_ADD、efd1、...);
上記、efd1 FDを監視し、efd2はつまり、ネストされたファイルディスクリプタの監視、efd1監視:監視のepoll別のepollハンドル
efd1を監視するefd2を、ポーリング機能がefd1呼び出されることは
リコール前に言った:ファイルf_op->ポール・ドライバは提供待ちキューを満たす必要があります
epollfdため、キューを待ってpoll_waitで
、efd2モニタefd1 efd1-> f_op->投票を呼び出し、poll_waitキューのefd1への現在のプロセスがそう
でしょう、イベントが発生したfdに聞いた後、それ自体をefd1とき、カーネルの実装のepollで途中poll_waitプロセスがウェイクアップするために
、その後、efd2に通知する「イベントを聴いefd1」。したがって、epollfdを達成するためには、他のを監視する多重化されます!
したがって:poll_waitが自分のepoll f_op->世論調査で、追加の多重化がepollリスニングを処理するために使用される、より一般的にはあまり見えます
epollカーネル原則2:新しい監視イベントハンドル操作しepoll_ctlを呼び出し
epoll_ctlを:EPOLL_CTL_ADD、EPOLL_CTL_MOD、EPOLL_CTL_DELは、追加、変更、ファイルは赤黒木を扱う削除
どのepll_ctl:EPOLL_CTL_ADD新しいハンドルだけでなく、新たな赤黒木のノードが、キーは、ファイルの監視を開始することです!
ファイルのイベントがepoll_wait呼び出すときだけでなくリスニングし、彼が始めたときEPOLL_CTL_ADDリスニング:選択/世論調査との本質的な違いがあります
詳細な分析EPOLL_CTL_ADDの
epoll_ctl(epfdに存在、EPOLL_CTL_ADD、FD、fdevent)コアプロセス:
event->イベント追加のケアイベントに登録されるイベント:EPOLLERR | EPOLLHUP
使用のepollの思い出は言った:EPOLLERRは、EPOLLHUPイベントは自動的に我々が設定されていない場合でも、リスニングされます
epitem構造を作成し、赤黒ツリーに追加
[キー] revent =ファイル- > f_op->世論調査、それが世論調査を呼び出すことで、現在のプロセスが待ちキューファイルに入れて、コールバック関数ep_poll_callbackに設定され、戻り値reventファイルが現在生成されたイベントマスクは
戻りイベントをチェックしてください。revent場合そして、懸念イベントevent->のイベントが(イベントの準備ができる前に、ADD命令)と交差
リストをrdlistするために、このepitemノードをコピーするには、(コピーrdlistを処理する準備ができて)
プロセスがキューWQで待機している場合(つまり、呼び出し元のプロセスでありますイベントがepoll_wait)待って、それを覚まします!
poll_waitキューを待っているプロセスがある場合ちなみに、(それが現在のプロセスを監視するために多重化されたファイルディスクリプタハンドルを呼び出します)、それを覚まします!
EPOLL_CTL_ADD前にファイルが、このファイルへの関心のイベントが作成されている場合は、この時点でWQ上のキューは、EPOLL_CTL_ADDブロッキングがepoll_waitから関数の戻りを行いますので、それがプロセスを覚ますだろう、見ることができます
数字が描かれていないように、4.3とまったく同じ4.1で物事を行うためのロジックとコールバック関数
要するに:キュー・ファイルで待機し、コールバック関数を設定するには、現在の登録プロセスをEPOLL_CTL_ADD
コールバック関数のやったことを言って
待ちキューのコールバック関数としてコールバック関数ep_poll_callbackを:
キュー・プロセスで待っているファイルを覚ます、ファイルイベントが来ると、ep_poll_callback機能が自動的に呼び出され、イベントが生成されていますが、パラメータとして渡されます
コールバック関数ep_poll_callbackコアプロセス:
:がある場合、共通の基盤があるかどうかをイベントとイベント関係を生成ep_poll_callbackチェック、
(rdlistを処理する準備ができてコピーする)ノードepitemのrdlistリストにファイルをコピーする
プロセスは、キューWQで待機している場合(つまり、呼び出しを待っているイベントがepoll_waitする過程にある)、それを覚まします!
poll_waitキューを待っているプロセスがある場合ちなみに、(それが現在のプロセスを監視するために多重化されたファイルディスクリプタハンドルを呼び出します)、それを覚まします!
要するに:コールバック関数は、ファイルハンドルrdlistをコピーして、待機中のプロセスのイベントがepoll_waitをウェイクアップするには
epollカーネル原則3:そこに一時ファイルへのイベントのとき:
起こされるのを待っているキューに対応するプロセス、コールバック関数ep_poll_callbackは、イベントが生成されたパラメータがに渡され
ep_poll_callbackコール
:
要するに:イベントが発生すると、ファイルハンドルが自動的にrdlistにコピーされ、目覚めるプロセスがepoll_waitを待って呼び出します
EPOLコア原則4:イベントがepoll_waitイベントを待っている呼び出し
がepoll_waitは、ファイルハンドルを監視していないが、空または受信した信号またはタイムアウト復帰のための3つの条件をrdlist待つことはありません。
擬似コード:
イベントがepoll_wait(epfdに存在、イベント、MAXSIZE、タイムアウト)
RES = 0
コアの観点jitimeout =残り時間、タイムアウト時間
rdlist空つつ:
待ちキューWQに現在のプロセス;
ながら1:
rdlistない空の、またはタイムアウトjitimeout = 0の場合
破壊
保留中の信号がある場合、
RESが= EINTRが
破壊
schedule_timeout =(jitimeout)にjitimeout
CPUを可能にし、ウェイクアップ後に残る新しい時刻を返します
RESの= 0、空か説明rdlistタイムアウトした場合
のハンドルrdlist入れ、関数呼び出しイベントep_send_events配列にコピーされ、RESに割り当てられたいくつかのハンドルのコピーを返します
。RES返す
// RES = -1、受信した信号を;
//のRES = 0、タイムアウト
// RES> 0、イベントアレイ処理するためにコピーRESある
メインロジックを:
:まで、連続的にCPUを放棄
rdlistデータ
タイムアウト
信号が受信され
rdlistデータは、ユーザが着信にコピーされた場合イベントの配列
要するに:空rdlist待つか、タイムアウト信号が中断されていない、エアハンドラを入れないrdlistは、ユーザ空間にコピーされました
PS:エッジトリガとレベルトリガとの違いを確認するには、このリンクにユーザーをコピーする
最初のrdlistそれぞれのハンドルを横断するコピーハンドラ関数ep_send_eventsを、各コールの調査のためのハンドルは、実際のイベントを再び取得します。
関心イベントとの交差がある場合:
ハンドルはレベルトリガ(EPOLLLT)である場合、再度rdlistを処理するために加え、そうでない場合にrdlistから除去
だから、次回は原則EPOLLETとEPOLLLTの違いである水平モード、できるようになります
rdlistから削除懸念イベントとの交差部分が存在しない場合
質問:結果は水平モードを扱うようで、いつものようにいつものようにそれに気づくrdlistを、再度参加し続けますか?
事件が処理された場合には、何の交差点を持っていない実際のイベントとケアイベントによって得られた世論調査を呼び出すので、削除されます!
ep_send_events投票以内に再度関数を呼び出すことがrdlistに参加することはありません防ぐために、実際のイベントに生まれEPOLLLTモードを取得することです!
だから、EPOLLLTが通知するデータ、データはもはや通知されないまでそこにあるように、イベントは限り停止していない読ん
---------------------
LeechanXBlog:著者
出典:CSDN
元ます。https://blog.csdn.net/linkedin_38454662/article/details/73337208
著作権:この記事はブロガーオリジナル記事です、再現は、ボーエンのリンクを添付してください!