定时处理非活跃连接

  1. — 非活跃连接—

— 非活跃连接—

​ 非活跃连接主要对连接进来的客户端进行活跃监控的辅助工具

一、非活跃连接

- 非活跃连接:客户端/浏览器 与服务器端建立连接后,长时间不交换数据,一直占用服务器端资源。
- 针对非活跃连接,需要在内核事件表删除对应事件、关闭文件描述符、释放连接资源等相关操作。

二、信号

Linux中的信号是一种消息处理机制,它本质上是一个整数,不同的信号对应不同的值,信号在系统中的优先级是非常高的。

  • - 项目中使用的信号
         1. SIGALRM:定时器超时信号,超时的时间由系统调用alarm设置,默认终止进程。
         2. SIGTERM:程序结束信号,kill或Ctrl+C触发,默认终止进程。
    
    - 两个特殊信号
      1. SIGKILL:9号信号,无条件终止进程,不能被捕捉、阻塞和忽略。
      2. SIGSTOP:19号信号,无条件暂停进程,不能被捕捉、阻塞和忽略。
    

三、定时器

// 倒计时seconds秒,倒计时完成发送SIGALRM信号,当前进程会收到这个信号。
unsigned int alarm(unsigned int seconds);

四、统一事件源

- 1. 一般的信号处理函数需要处理该信号对应的逻辑,当该逻辑比较复杂时,信号处理函数执行时间过长,会导致信号屏蔽太久。
- 解决方法:
  信号处理函数仅发送信号的值,通知程序主循环,程序主循环中执行信号对应的逻辑代码。

- 2. 统一事件源:将信号事件与其他事件一样被处理。
- 解决方法:
  信号处理函数往管道的写端写入信号值,主循环则从管道的读端读出信号值。
  使用I/O复用系统调用监听管道读端的可读事件与其他文件描述符,从而实现统一处理。

五、定时器编写

带头尾结点的升序双向链表管理定时器。关键词:头尾节点,双向,升序,链表

逻辑:

为每个连接创建一个定时器,将其添加到链表中,并按照超时时间升序排列。

执行定时任务时,将到期的定时器从链表中删除。

添加定时器的时间复杂度是O(n), 删除定时器的时间复杂度是O(1)。


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 351134995@qq.com

×

喜欢就点赞,疼爱就打赏