【Linux】事件处理模式

服务器框架

  • I/O处理单元:处理客户连接、读写网络数据
  • 逻辑单元:接收数据后应该做什么例如解析数据、封装响应数据
  • 请求队列:I/O处理单元和逻辑单元之间的通信中介,I/O处理单元处理后的数据先送入请求队列再由逻辑单元接收
  • 服务器通常要处理三类事件:I/O事件、信号事件(signal/sigaction)以及定时事件(alarm/setitimer),结合I/O多路复用和多线程/多进程,有两种高效的事件处理模式分别是应用于同步的Reactor模式和应用于异步的Proactor模式

Reactor模式

  • 要求主线程只负责监听文件描述符上是否有事件发生,有的话则通知工作线程,交给工作线程来处理。除此之外主线程不做任何其他的工作,接收新的连接、读写数据、处理客户的请求都在工作线程中完成。
  • 工作流程(epoll为例)
      1. epoll_ctl()向内核确定并注册需要监听的文件描述符
      2. 主线程调用epoll_wait()来等待epoll_event就绪事件即等待文件描述符上有数据可读
      3. 当有数据可读时,epoll_wait()通知主线程,主线程将可读事件放入请求队列
      4. 唤醒请求队列的工作线程,从文件描述符读取数据并处理客户请求,然后往epoll内核注册文件描述符上的写就绪事件
      5. 主线程调用epoll_wait()来等待文件描述符上有数据可写
      6. 当有数据可写时,epoll_wait()通知主线程,主线程将可写事件放入请求队列
      7. 唤醒请求队列的工作线程,往文件描述符上写入服务器处理客户请求的结果。

Proactor模式

  • Proactor模式应用于异步I/O中,将所有的I/O操作都交给主线程和内核来进行处理,工作线程仅仅负责业务逻辑即收到数据后应该做什么。
  • 区别于Reactor模式,Proactor模式数据提交到工作线程时已经不需要执行I/O操作,只需要执行逻辑即可

同步I/O模拟Proactor模式

  • 主线程执行监听和数据读写操作,读写完成后向工作线程通知,从工作线程的角度来看,它直接获得了数据I/O的结果,和Proactor模式一样,工作线程只需要进行业务逻辑即可。

线程池

  • 服务器预先创建一定数量的线程,并将这些线程维护在线程池中。当请求队列有新的任务到来时,不是为每个任务创建新线程,而是从线程池中取出一个空闲线程来执行任务。任务执行完毕后,线程不会被销毁,而是返回到线程池中等待下一次任务分配。这种方式可以减少线程频繁创建和销毁的开销,提高系统资源的利用率和程序的响应速度。

相关推荐

  1. Linux事件处理模式

    2024-06-14 02:02:02       6 阅读
  2. 事件处理模式--reactor原理与实现

    2024-06-14 02:02:02       13 阅读
  3. Vue - 事件处理详解

    2024-06-14 02:02:02       36 阅读
  4. vue3--事件处理

    2024-06-14 02:02:02       19 阅读
  5. React——关于事件处理

    2024-06-14 02:02:02       21 阅读
  6. vue 事件处理

    2024-06-14 02:02:02       21 阅读
  7. flink 事件处理 CEP

    2024-06-14 02:02:02       9 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-06-14 02:02:02       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-06-14 02:02:02       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-06-14 02:02:02       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-06-14 02:02:02       18 阅读

热门阅读

  1. PHP表单的多方面应用与实践

    2024-06-14 02:02:02       8 阅读
  2. 记住用户登录状态的方法:从基础到高级

    2024-06-14 02:02:02       8 阅读
  3. React-Native Modal组件中无法按返回键隐藏

    2024-06-14 02:02:02       10 阅读
  4. 【QT】QSettings读取中文乱码

    2024-06-14 02:02:02       8 阅读
  5. Llama2微调

    2024-06-14 02:02:02       6 阅读
  6. Python记忆组合透明度语言模型

    2024-06-14 02:02:02       8 阅读
  7. screenrecord

    2024-06-14 02:02:02       7 阅读
  8. 高精度汽车衡的应用领域有哪些?一文说清楚

    2024-06-14 02:02:02       7 阅读
  9. 时间类:SimpleDateFormatk

    2024-06-14 02:02:02       10 阅读
  10. window系统下为django自动绘制模型类关系图

    2024-06-14 02:02:02       8 阅读