• 忘掉天地
  • 仿佛也想不起自己
bingliaolongBingliaolong  2021-12-16 22:55 Aet 隐藏边栏 |   抢沙发  4 
文章评分 2 次,平均分 5.0

概述

  1. 网络程序需要处理的第三类事件是定时器事件,比如定期检测一个客户连接的活动状态。
  2. 服务器程序通常管理着众多定时事件,因此有效地组织这些定时事件,使之能在预期的时间点被触发且不影响服务器的主要逻辑,对于服务器的性能有着至关重要的影响。
    为此,需要将每个定时事件分别封装成定时器,并使用某种容器类数据结构,比如链表、排序表和时间轮,将所有定时器串联起来,以实现对定时事件的统一管理。
  3. 定时是指在一段时间之后触发某段代码的机制,我们可以在这段代码中依次处理所有到期的定时器。
    换言之,定时机制是定时器得以被处理的原动力。
  4. Linux提供了3种定时方法:
    1. socket选项SO_RCVTIMEO和SO_SNDTIMEO
    2. SIGALRM信号
    3. I/O复用系统调用的超时参数

SO_RCVTIMEO和SO_SNDTIMEO

  1. 这两个socket选项分别用来设置socket接收数据超时时间和发送数据超时时间。
    因此,这两个选项仅对与数据接收和发送相关的socket专用系统调用(socketAPI)有效,包括:

    1. send、sendmsg、recv、recvmsg、accept和connect

  1. 设置connect超时时间:

SIGALRM信号

  1. 由alarm和setitimer函数设置的实时闹钟一旦超时,将触发SIGALRM信号。
    因此,可以利用该信号处理函数来处理定时器任务。
  2. 但是要处理多个定时任务,就需要不断地触发SIGALRM信号,并在其信号处理函数中执行到期的任务。
  3. 一般而言,SIGALRM信号按照固定的频率生成,即由alarm或setitimer函数设置的定时周期T保持不变。如果某个定时任务的超时时间不是T的整数倍,那么它实际被执行的时间和预期的时间将略有偏差。因此定时周期T反映了定时的精度。

基于升序链表的定时器

  1. 定时器通常至少要包含两个成员:
    1. 一个超时时间(相对时间或绝对时间)
    2. 一个任务回调函数
  2. 有的时候还可能包含回调函数被执行时需要传入的参数,以及是否重启定时器等信息。

处理非活动连接

I/O复用系统调用的超时参数

  1. Linux下的3组I/O复用系统调用都带有超时参数,因此它们不仅能统一处理信号和I/O事件,也能统一处理定时事件.
  2. 但是由于I/O复用系统调用可能在超时时间到期之前就返回(比如有I/O事件发生),所以我们要利用它们来定时,就需要不断更新定时参数以反映剩余的时间.

本文为原创文章,版权归所有,欢迎分享本文,转载请保留出处!

bingliaolong
Bingliaolong 关注:0    粉丝:0
Everything will be better.

发表评论

表情 格式 链接 私密 签到
扫一扫二维码分享