Windows system >> Windowsの知識 >  >> Linuxシステムチュートリアル >> Linuxチュートリアル >> Linux epollを使った基本チュートリアル

Linux epollを使った基本チュートリアル

  

Linuxネットワークプログラミングでは、長い間selectを使ってイベントをトリガーしてください。 Linuxの新しいカーネルでは、それを置き換えるメカニズムがあります。それはepollです。 selectと比較して、epollの最大の利点は、リスニングfdsの数が増えても効率が低下しないことです。カーネルのselect実装では、ポーリングによって処理されるため、ポーリングされるfdの数が多くなるほど、時間がかかります。また、/usr/include/linux/posix_types.hヘッダーファイルには、次のような宣言があります。#define __FD_SETSIZE 1024は、selectが同時に最大1024 fdまで待機できることを意味しますもちろん、ヘッダーファイルを変更してカーネルを再コンパイルすることでこの数を増やすことができます。これは治療法ではないようです。

epollのインターフェースはとてもシンプルで、3つの機能があります:1. int epoll_create(int size); epollハンドルを作成します。このパラメータはselect()の最初のパラメータとは異なり、最大のリスナーに対してfd + 1の値を与えます。注意しなければならないのは、epollハンドルが作成されると、それはfd値を占めるということです。Linuxで/proc /process id /fd /を見ると、このfdを見ることができます。 close()を呼び出して閉じる。そうでなければfdが使い果たされる可能性がある。

2. int epoll_ctl(int epfd、int op、int fd、struct epoll_event * event); epollイベント登録関数。select()とは異なり、イベントをリスニングするときにリスナーの種類を聞きます。イベントですが、ここでは監視するイベントの種類を登録します。最初のパラメータはepoll_create()の戻り値、2番目のパラメータは3つのマクロで表されるアクションを表します:EPOLL_CTL_ADD:epfdにnew fdを登録します; EPOLL_CTL_MOD:登録されたfdのリスニングイベントを変更します; EPOLL_CTL_DEL:from Epfdはfdを削除します; 3番目のパラメータは監視するfdです、4番目のパラメータはカーネルに何を監視するかを伝えます、struct epoll_event構造体は以下の通りです:struct epoll_event {__uint32_t events; /* Epoll events * /epoll_data_t data; /*ユーザデータ変数* /};

イベントは以下のマクロの集合です:EPOLLIN:対応するファイルディスクリプタを読み込むことができることを示します(ピアSOCKETは通常閉じています); EPOLLOUT:対応するファイルディスクリプタを示します書き込むことができる、EPOLLPRI:対応するファイルディスクリプタが緊急データ読み取り可能であることを示す(ここでは、帯域外データが来ることを示す)EPOLLERR:対応するファイルディスクリプタにエラーがあることを示すEPOLLHUP:対応するファイルディスクリプタが固定されている; EPOLLET:EPOLLをLevel Triggeredを基準としたEdge Triggeredモードに設定します。EPOLLONESHOT:1つのイベントだけをリッスンするこのイベントをリッスンした後、このソケットをリッスンし続ける必要がある場合は、このソケットを再度EPOLLキューに追加する必要があります。

3. int epoll_wait(int epfd、struct epoll_event) * events、int maxevents、int timeout); select()呼び出しと同様に、イベントが生成されるのを待ちます。パラメータeventsは、カーネルからイベントのコレクションを取得するために使用されますmaxeventsは、イベントの大きさをカーネルに伝えますmaxeventsの値は、epoll_create()を作成するときのサイズより大きくすることはできません。確かではない、それが永久にブロックされているということもあります)。この関数は、タイムアウトしたことを示すために0を返すなど、処理する必要があるイベントの数を返します。

-------------------------------------------- ------------------------------------------------

マニュアルから、次のようにETとLTの詳細な説明を入手してください。

EPOLLイベントには2つのモデルがあります。Edge Triggered(ET)Level Triggered(LT)

例:1.パイプラインからepoll記述子にデータを読み込むためのファイルハンドル(RFD)を追加しました2.この時点で、パイプラインのもう一方の端から2KBのデータが書き込まれます3. epoll_wait(2)を呼び出しますそしてそれはRFDを返し、操作4を読む準備ができたことを示します。それから1KBのデータを読みます。5. epoll_wait(2)を呼び出します。

Edge Triggered Workモード:if手順1でepoll記述子にRFDを追加したときにEPOLLETフラグを使用しました。手順5でepoll_wait(2)を呼び出した後、残りのデータがファイルの入力バッファにまだ存在するため、おそらくハングします。そしてデータ発信者はまだ送信されたデータのためのフィードバックメッセージを待っています。 ET作業モードは、監視対象ファイルハンドルでイベントが発生した場合にのみイベントを報告します。そのため、ステップ5では、呼び出し側はまだファイル入力バッファーに残っている残りのデータを待つのをあきらめることがあります。上記の例では、書き込み操作がステップ2で実行されたため、RFDハンドルでイベントが生成され、その後ステップ3でイベントが破棄されます。ステップ4の読み取り操作は空のファイル入力バッファーのデータを読み取らないので、ステップ5でepoll_wait(2)を呼び出した後に中断するかどうかは未定義です。 epollがETモードで動作するとき、ファイルハンドルの読み取り/ブロック書き込み操作がブロックされているために複数のファイル記述子を処理するタスクの枯渇を避けるために、ノンブロッキングソケットを使用しなければなりません。以下の方法でETモードのepollインターフェースを呼び出すことが最善です。これについては、起こりうる欠陥を回避するために後で説明します。ノンブロッキングファイルハンドルに基づいています。ii read(2)またはwrite(2)がEAGAINを返して待機しているときにのみハングアップする必要があります。ただし、EAGAINが生成されてイベント処理が完了するまで、read()をすべて周期的に読み取る必要があるわけではありません。この時点でバッファにデータがないことを確認してください。そうすれば、イベントは処理されたと考えることができます。

Level Triggeredは逆の動作をしますLTモードでepollインタフェースを呼び出すとき、より速いpoll(2)と同等で、データが後で使用されるかどうかにかかわらず同じです。機能ETモードでepollを使用しても、複数のデータを受信すると複数のイベントが生成されます。呼び出し元はEPOLLONESHOTフラグを設定することができます。これはepoll_wait(2)がイベントを受け取った後にepoll記述子から無効にされます。したがって、EPOLLONESHOTが設定されていると、epoll_ctl(2)をEPOLL_CTL_MODフラグとともに使用してファイルハンドルを処理することは、呼び出し側がしなければならないことになります。

次にETについて詳しく説明してください。LT:

LT(レベルトリガ)はデフォルトの動作モードで、ブロックソケットと非ブロックソケットの両方をサポートしています。ファイルディスクリプタの準備が整ったら、この準備完了したfdに対してIO操作を実行できます。何もしなければ、カーネルが通知し続けるので、このモードはプログラムされる可能性が低いです。伝統的な選択/投票はこのモデルの代表です。

ET(エッジトリガ)は、ブロックなしのソケットのみをサポートする高速動作モードです。このモードでは、ディスクリプタの準備ができていないことをカーネルがepollで通知します。それから、ファイルディスクリプタの準備ができていることを知っていると仮定し、ファイルディスクリプタの準備ができなくなるようなことをするまで、そのファイルディスクリプタの準備完了通知を送信しません。 EWOULDBLOCKエラーは、要求を送信、受信、または受信したとき、あるいは一定量未満のデータを送信および受信したときに発生します。ただし、このfdでIO操作を実行しないと(それ以降は準備ができなくなるため)、カーネルはそれ以上通知を送信しません(一度だけ)が、TCPプロトコルではETモードの高速化ユーティリティはさらに必要です。より多くのベンチマーク確認(この文は理解していません)。zh-CN"],null,[1],zh-TW"]]]

Copyright © Windowsの知識 All Rights Reserved