1. ET解析モデルを達成するために
1.1 ETとLTとの違いを実感
まず、私の以前のブログ記事の分析から得られるグラフの下に除去し、精製して--epoll。理解ETモデルのepollすでに作業プロセスのためだけに重要なこの画像は、もちろん、私もあなたと共有するためにここに、いくつかの小さな成功の気持ちをまとめました。
注:ポーリングで図形とepoll_ctlによって呼び出されるポーリングに類似するものとして理解されるべきではない選択。
ファイルディスクリプタの作業工程について、以下の簡単な分析:
(1)イベントがepoll_waitコールep_pollを、rdlistは(なし準備FD)空になったとき、時空プロセスがウェイクアップrdlistを知らない現在のプロセスを中断します。
(2)対応するコールバック関数ep_poll_callback fdをもたらす、(バッファが読み出しまたは書き込みにより読めなくなるが、書き込みによって変更されていない)ファイルFDの状態を変更()が呼び出されます。
FD対応ep_poll_callbackがrdlist空でなく、その結果、epitemはrdlistに参加対応(3)、プロセスは目覚め、イベントがepoll_wait継続することができます。
(4)ep_events_transferのrdlist機能はepitemのtxlistをコピーし、そしてrdlist空。
txlist epitemをスキャン各々が(5)ep_send_events機能(クリティカル)、FDそれに関連するプロセスをポーリングするために呼び出す(図青線)を用います。この時点で、コールのみ(イベント前防止更新される)は、比較的新しいFDイベントを取得ポーリングし、取得したイベントを送信し、ユーザ空間に対応する(FD構造体epoll_eventはで囲まれ、イベントがepoll_waitから返されます)。FDに対応するこのepitemを聞いているとLTモデルは、ユーザへの関心のイベントで構成された後ならば、それはrdlistに再参加するために戻っている(青線図)、または(ETモード)rdlistを追加していません。
特定のコード:
/ * ... *リスト全体のtxlistをスキャンします/
用(eventcnt = 0、UEVENT = esed->イベント。
!list_empty(ヘッド)&& eventcnt <esed-> maxevents個;){
/ * *最初のメンバーを削除/
エピ= list_first_entry(ヘッド、構造体epitem、rdllink)。
/ *その後、リストから削除されます* /
list_del_init(&エピ> rdllink);
/ *イベントを読んで、
その後、取るべき理由、一度撮影してきた我々は(ep_poll_callback *注イベント)?
* 1。我々は確かにイベントが変更にバインドされ、現時点で最新のデータを得ることを期待します -
すべての投票が実現* 2、イベントは待ちキューを介して渡されているわけではない、いくつかのドライバでも合格しなかったがあるかもしれません
*読みするためのイニシアチブを取る必要があります。* /
reventsが=エピ> ffd.file-> f_op->ポール(エピ> ffd.file、NULL)&
エピ> event.events。
IF(reventsが){
/ *現在のイベントとユーザーの受信データは、ユーザ空間にコピーします
*イベントがepoll_wait()アプリケーションが読み取ることができるデータの集まりです。* /
(__put_user(reventsが、&uevent->イベント)であれば||
__put_user(エピ> event.data、&uevent->データ)){
/ *エラーがコピー処理を発生した場合は、リストのスキャンを中断し、
*エラーが現在発生しepitemは準備リストに再挿入しました。
* ep_scan_ready_listには処理は破棄されることはありません残りepitem、()
*彼らは準備ができて、リストに再挿入されます* /
list_add(&エピ> rdllink、頭)。
eventcnt返しますか?eventcnt:-EFAULT。
}
eventcnt ++;
UEVENT ++;
もし(エピ> event.events&EPOLLONESHOT)
エピ> event.events&= EP_PRIVATE_BITS。
それ以外の場合(!(エピ> event.events&EPOLLET)){
/ *
*このファイルは、レベルに追加されている場合
*トリガモード、我々は内部のバック挿入する必要があります
*レディリスト、次の呼び出しになるように
*イベントがepoll_wait()は、再びイベントをチェックします
*利用できます。この時点で、誰もが挿入することができます
*私たち以外にもEP-> rdllistに。epoll_ctl()
*発信者はでロックアウトされています
* ep_scan_ready_list()保持 "MTX" と
*投票コールバックは、EP-> ovflistでそれらをキューに入れます。
* /
この一歩ああとの差に/ *ねえ、差EPOLLETと非ET〜
* ETは、epitemはreadlyリストを再入力しない場合は、
FD状態変化が再び発生しない限り*、ep_poll_callbackが呼び出されます。
*非ETた場合は、関係なく、あなたは、有効なイベントやデータを持っていません
*レディリストに再挿入され、その後、次回のイベントがepoll_wait
*ときにすぐに戻り、およびユーザ空間に通知します。もちろん、この場合
データをしませんでした* FDSは、監視されているイベントは、イベントがepoll_waitは、0を返します
*アイドル時間。
* /
list_add_tail(&エピ> rdllink、&EP-> rdllist);
}
}
}
説明:
条件L個のイベントがepoll_wait戻り、空でないrdlist、2つの方法が図赤と青のラインに対応する、あるrdlistを空にしません。
モード中のL ET及びLT epitemは赤色によってイベントがepoll_waitを目覚めさせるようにrdlist方法に参加するが、epitemのLTモードにおいても仕方のイベントがepoll_waitウェイクによってrdlist青いラインを再結合することができます。だから(赤rdlistの添加による)次ETモード、準備FDのみ限り、それぞれLT条件を読み書きする準備ができて戻すように、一度、次のモードを通知する(青い線はrdlistを介して添加しました)。
L ET通知イベントは、一度だけrdlistに追加するために1回だけ発生し、LTは、追加する多くの機会を持つことができます。
1.2 rdlist異なる方法を追加するには2つの方法は、
(それは、赤と青の線である)されて、私たちは数字を分析してみましょうepitemを区別するための2つの方法がrdlist方法が追加されます。
Lレッド:FD状態変化がトリガされます。だから何それは状態のFDの変化につながるのだろうか?
読み取り操作の場合:
(1)状態が空から空でないと、すなわち、リードバッファ時間により読めなくなった場合。
新しいデータが到着すると(2)、すなわち、バッファに読み出されるコンテンツは、多くの時間となります。
書き込み操作の場合:
(1)書き込みバッファから利用可能になると非書き込まれ、即ち、状態への完全な状態によって不満場合。
(2)含有量が少なすぎるとなった場合、古いデータが書き込まれるバッファに、すなわち、ダウン送信された場合。
L青線:時間に対応するイベント(位置1)FD即ちトリガー。その後、イベントはどのような状況下での対応するビットを変更するのでしょうか?
読み取り操作の場合:
(1)データをバッファリングするバッファが読み取り可能なFDが1に設定されているイベントの空でない、すなわちとき、時刻を読み取ります。
書き込み操作の場合:
(1)バッファを書き込み可能なビットがセットされているイベントのFDそのバッファ不満を書き込むスペースがある場合。
注:赤線は受動トリガ時間駆動され、青い線は、クエリ、アクティブトリガの関数です。