web-dev-qa-db-ja.com

エポールのエッジトリガーオプションの目的は何ですか?

Epollのmanページから:

epoll is a variant of poll(2) that can be used either as an Edge-triggered
or a level-triggered interface

エッジトリガーオプションはいつ使用しますか?マニュアルページにはそれを使用する例が記載されていますが、例ではなぜ必要なのかわかりません。

52
Dan

FDの読み取りまたは書き込みの準備ができたら、必ずしもすべてのデータをすぐに読み取り(または書き込み)する必要はありません。

レベルトリガーのepollは、FDの準備ができている限り、しつこく続けますが、エッジトリガーは、次回EAGAINを取得するまで気にしません(したがって、コードの作成はより複雑になりますが、何をする必要があるかに応じて、より効率的になります)。

リソースからFDに書き込むとします。レベルトリガーとして書き込み可能になるFDに関心を登録すると、FDが書き込みの準備ができていることを常に通知します。リソースがまだ使用可能でない場合、それ以上ウェイクアップできないため、ウェイクアップの無駄です。

代わりにEdge-triggeredとして追加する場合、FDが1回書き込み準備が完了したという通知を受け取り、他のリソースが準備完了になると、できる限り書き込みます。 write(2)EAGAINを返す場合、書き込みを停止して次の通知を待ちます。

同じことが読み取りにも当てはまります。なぜなら、あなたがやりたいことを何でもやる準備ができる前にすべてのデータをユーザー空間に引きたくないかもしれないからです(したがって、バッファリングなど)。 Edge-triggered epollを使用すると、読み上げの準備ができたときに通知され、それを記憶して、「いつでも」実際の読み取りを実行できます。

96

私の実験では、ETは1つのスレッドのみが起動することを保証しませんが、1つのスレッドのみが起動することはよくあります。 EPOLLONESHOTフラグはこの目的のためのものです。

8
cpq