为什么不在linux上使用系统计时器(timerfd)?

时间:2014-07-17 07:08:22

标签: c++ linux timer

我发现大多数服务器(例如RPG网页游戏服务器)总是自己实现一个计时器,而不是使用系统计时器,例如在linux上,

int timerfd_create(int clockid, int flags)
你可以告诉我为什么吗?我认为系统api(timerfd_create)可以有更高的性能。

3 个答案:

答案 0 :(得分:4)

阅读time(7)。实际上,timerfd_create(2)是有效的,但它是针对Linux的。

将Posix计时器与timer_create(2)等人一起使用。可能更便携。

Linux特定timerfd_create(以及signalfd(2)& eventfd(2) ...)的显着优势是event loop友好(因为它是文件描述符) ,例如管道或插座)。但是,大多数事件循环都建立在多路复用系统调用之上,如poll(2),它接受​​延迟(毫秒),或者更早的select(2)

答案 1 :(得分:2)

没有理由不这样做。系统调用仅在Linux 2.6.25(2008)之后才可用,并且直到glibc 2.8(2009)才出现库支持。鉴于大多数人都学习如何从他们的教授或现有的开源项目中编写应用程序,到目前为止(2014年)还缺乏实际的例子。

答案 2 :(得分:0)

我可以想到的至少有两个潜在的原因,即在程序中不使用timerfds:

1)该程序是维护大量打开连接的服务器。默认情况下,Linux允许一个进程在每个进程中具有1024个描述符。这可以更改,但是事实仍然是文件描述符不是免费的资源,如果您有成千上万个开放的套接字连接,则可能至少要有这么多的计时器来管理超时。所有这些加起来构成了很多描述符。

2)使用timerfds可能比在用户空间中管理一组定时器要多得多的开销。阻塞对select()或更合适的epoll_wait()的调用涉及到系统调用,而由于clock_gettime()不需要一个,它可以管理用户空间中的大量计时器而无需任何此类转换。

http://linuxmogeb.blogspot.com/2013/10/how-does-clockgettime-work.html