なぜ投票がエポールに置き換えられないのですか?


8

レベルトリガーepollはによく似ていpollます。なぜ後者をサポートするシステムのpoll単なるラッパーではないのepollですか?

編集:つまり、そのような決定に対する技術的な障壁はありますか?pollas epollを実装すると、多くのネットワークアプリケーションのパフォーマンスが劇的に向上します。私が気付かないいくつかの技術的な問題があるはずです。


5
これらはシステムコールです。彼が何について話しているのかわからない場合は、調べてみるべきかもしれませんが、彼の質問は完全に有効です。
drrlvn

2
どちらも、一連のファイル記述子に対するアクティビティを待機するためのシステムコールです。EpollはLinux 2.6以降に固有です。マニュアルページへのリンクを追加しました。

私は彼らが何であるか知っています。しかし、投票を行うシステムのようなlinux / unixのようなものはたくさんあります。質問の答えは、何のどのバージョンかについての詳細なしでは答えられません。
bmargulies

pollラッパーとして実装するのは、epoll信じられないほど複雑で非効率的です。新しいepoll記述子をセットアップして毎回構成する必要があるか、現在のポーリングセットとepoll記述子に既に関連付けられているポーリングセットとの苦痛な比較を行う必要があります。おい!
David Schwartz

回答:


2

簡単なケースでは投票ははるかに簡単です。それはおそらく、少数のファイル記述子に対しても同じくらい効率的です。呼び出し元は、ポーリングFDの維持やFDの追加/削除について心配する必要はありません。ポーリングする各呼び出しで必要なものをすべて追加するだけで済みます。

私の考えでは、それらは補完的であると感じていますが、pollはepollのラッパーとして実装することができますが、そうすべきではないでしょう。

epollは(ほとんど)ポーリングのラッパーとして実装できますが、その効率性の引数を無効にします。


1
それが最も可能性の高い答えです。私はそれをテストし、epollはローカルファイルの1つのファイル記述子のポーリングよりも実際に10倍遅い(1000ポーリングあたり550 usおよび1000 epollあたり5420 us(create + ctl + wait + close))。epoll_waitは、ポーリングよりも2倍遅いだけでした。

1

意味poll()とはepoll異なっています。場合poll()の記述子が読み取り可能であることを通知します、あなたは、いくつかの読書を行うが、利用可能なバイトをすべて読み、その後にその記述を渡さないpoll()、再び、それはすぐに目を覚ますだろう。私の知る限り、同じことは真実ではありませんepoll

また、epoll記述子は限られたリソースであることに注意してください。 マンページでは、epoll_create()AFAIKでは発生しない障害状態について説明していpoll()ます。

すべての実装の詳細についてはわかりませんが、このことからpoll()、のラッパーを作成することは意味がないと言えますepoll。プログラマーはこれらの点に注意する必要があり、poll()許可を前提に書かれた既存のコードは機能しなくなります。


1
1. epollのデフォルトのフレーバー(レベルトリガー)は、pollのように動作します(epoll(7)のマンページの説明セクションを参照)。2.ポーリングは本質的にepoll_create + epoll_ctl + epoll + wait + closeです。したがって、この架空のポーリングで使用されるepoll記述子の数は、ポーリングを同時に実行するスレッドの数によって制限されます。したがって、スレッドの最大数を反映するようにmax_user_instancesを調整するいくつかのテクニックがあるかもしれません。3.これらの仮定が何であるかについての好奇心のために、この質問を投稿しました。

1

わかりました、7年後、私はEvan Klitzkeによるこの記事に基づいて、より説得力のある答えを得ました。

最初に、私が最初に質問した理由は、/ epollと比較してよく言及されるパフォーマンス上の利点です。つまり、(O(N))よりも(O(1))の方が漸近的に効率的です。pollselectepollpoll

あまり広く知られていませんが、エッジトリガー のみepollが真にO(1)であるのに対し、レベルトリガー epollはO(N)と同じ症状を示します。実際、レベルトリガーのフレーバーは、呼び出されるたびに監視中のfdsのリストを調べて、まだ保留中のデータがまだ残っている可能性があるものを見つける必要があります。エッジトリガーバラエティは、fdに現れる新しいバイトに応答する信号に依存できます。

再開されたスレッドがどのfdがそれを起こしたかを正確に知る方法を見つけることは興味深いでしょうが、このデータが、epollによってトリガーされたウェイクアップ中に渡される可能性は確かにあります。

明らかに、セマンティクスが異なるため、poll/ selectエッジトリガー epollを使用できません。見てきたように、レベルトリガー で実装してepollも、漸近的なパフォーマンス上のメリットはありません。そして、おそらく、定数因子または定数項が高い場合にも悪影響を及ぼします(これらは、私が行って別のコメントで引用した大まかなベンチマークに基づいているようです)。

詳細については、ブロックI / O、非ブロックI / O、およびEpollを参照してください

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.