Linux服务器高性能编程——读书笔记(五)

来源:互联网 发布:新浪实时股票数据接口 编辑:程序博客网 时间:2024/05/01 00:14

第十一章  定时器

网络编程中定时器这种定时触发的工具非常重要,可以在某段时间之后触发某段代码,可以用各种数据结构对它们统一管理,这章主要介绍时间轮和时间堆。Linux提供三种定时方法:socket 选项 SO_RCVTIMEO和SO_SNDTIMEO、SIGALRM 信号、I/O复用系统调用的超时参数。

11.1  socket 选项 SO_RCVTIMEO 和 SO_SNDTIMEO

        这两个选项设置了接收数据的超时时间和发送的超时时间。SO_SNDTIMEO:send、sendmsg,SO_RCVTIMEO:recv、recvmsg、accept。如果超时返回-1,errno为EAGAIN或者EWOULDBLOCK。connect可以设置SO_SNDTIMEO,就是非阻塞调用connect同时建立多个连接的一种方法,超时返回-1,errno为EINPROGRESS。

        使用setsockopt更改套接字选项,struct timeval是时间单位,一旦满足超时条件就可以处理了,比如之前的非阻塞connect就可以用select查看是否连接了。

11.2  SIGALRM信号

        先讲了一个简陋的基于升序链表的定时器。回调函数:说白了就是函数作为另一个函数的参数使用的方式,调用者的参数为指向函数的指针,而实参就是某个函数,这就是回调 ,其它都白扯。在epoll_wait取得监听时间时,加一个节点到计时链表上,

11.3  利用I/O复用的三个函数

        利用select、poll和epoll来统一定时操作,不过需要不断更新定时参数,因为可能提前触发。用time(NULL)获取开始的时间和结束的时间,每次循环重置。

11.4  高性能定时器

         时间轮,时间堆,适用范围很大,时间轮的每个槽是一个链表,

0 0
原创粉丝点击