2011-12-21 6 views
2

epoll_wait、selectおよびpoll関数はすべてタイムアウトを提供します。しかし、epollでは、1msという大きな解像度になっています。選択サブミリ秒のタイムアウトを提供するのは、& ppollだけです。なぜepoll_waitは1msの巨大なタイムアウトしか提供しないのですか?

これは、せいぜい1ms間隔で他のことを行うことを意味します。私は現代のCPU上で1ミリ秒以内に他の多くのことを行うことができます。

1msよりも頻繁に他のことを行うには、実際にはゼロ(実際には無効にする)を指定する必要があります。そして、私は恐らくメインループのどこかに私自身のusleepを追加して、あまりにも多くのCPUを噛んでしまうのを止めるでしょう。

質問がありますが、私は、解像度がより高いタイムアウトのケースが明確にあると思うと、ミリ秒でタイムアウトが発生するのはなぜですか。

+0

この記事では、select()、ポール()とイベントがepoll_wait()とカーネルとの相互作用のタイミング分解能に関する詳細な情報を提供します。私はそれを読むことをお勧めします。 http://lwn.net/Articles/296578/ –

答えて

2

epoll_waitインターフェイスは、pollからミリ秒単位で計測されたタイムアウトを継承しました。 pollは1ミリ秒未満では意味がありませんが、すべての待機セットに呼び出しスレッドを追加するオーバーヘッドのために、epoll_waitには意味があります。 epoll_waitへの呼び出しでは、呼び出しスレッドを複数の待機セットに置く必要はなく、呼び出しのオーバーヘッドは非常に低く、非常にまれなケースでは1ミリ秒未満でブロックすることができます。

タイミングスレッドを使用することをお勧めします。あなたがしたいことのほとんどは、そのタイミングスレッドで行うことができるので、epoll_waitから抜け出す必要はありません。 epoll_waitからスレッドを返す必要がある場合、スレッドがポーリングしているパイプにバイトを送信するだけで、待機が終了します。

8

あなたがLinux上でされているので、代わりにゼロのタイムアウト値を提供し、手動でループ本体にusleeepingのは、単にtimerfd APIを使用することができます。これは基本的に、ファイルディスクリプタに関連付けられたタイマー(1msより細かい解像度を持つ)を作成し、監視対象ディスクリプタのセットに追加することができます。

+0

あなたの答えからtimerfdについて学んだだけです。ニース! – cheshirekow