2011-12-21 217 views
2

epoll_wait,select和poll函數都提供超時。然而,在epoll中,它的分辨率爲1ms。選擇& ppoll是提供亞毫秒超時的唯一一個。爲什麼epoll_wait只能提供巨大的1ms超時時間?

這將意味着最好在1毫秒的時間間隔做其他的事情。在現代CPU上,我可以在1ms內完成很多其他的事情。

所以做其他事情往往小於1ms,我實際上是提供零超時(基本上禁用它)。而且我可能會在主循環的某個地方添加我自己的usleep,以阻止它咀嚼太多的CPU。

所以現在的問題是,爲什麼在毫秒的超時的時候我會想清楚有更高分辨率的超時的情況下。

+0

本文提供了選擇(),輪詢()和epoll_wait()及其與內核相互作用的時間分辨率的詳細信息。我建議閱讀它。 http://lwn.net/Articles/296578/ – 2013-02-01 15:48:04

回答

2

epoll_wait接口剛剛繼承從poll以毫秒計的超時。雖然它不小於一毫秒意義的poll,因爲添加了調用線程的所有等待集合的開銷,這有一定道理的epoll_wait。到epoll_wait呼叫不需要以往任何時候都將調用線程在一個以上的等待集中,調用開銷非常低,這可能是有意義的,在極少數情況下,阻止了不到一毫秒。

我只是使用定時線程建議。大部分你想要做的事情都可以在這個時間線上完成,所以你不需要跳出epoll_wait。如果你需要從epoll_wait線程的回報,只是發送一個字節到管道線程是輪詢和等待將終止。

8

既然你是在Linux上,而不是提供一個零超時值,並在循環體手動usleeeping,你可以簡單地使用timerfd API。這基本上可以讓你創建一個文件描述符,您可以添加到組監測到的描述符相關聯的定時器(與精度高於1毫秒)。

+0

剛剛從你的答案中瞭解了timerfd。太好了! – cheshirekow 2015-04-09 16:13:09

相關問題