网络编程事件处理模型和并发模式

网络编程事件处理模型和并发模式

事件处理模型

当socket上读事件就绪时,说明此时连接有新请求到来,在web服务器设计中,表示一个http请求的到来,我们应该如何高效响应并处理这些事件?

Reactor模式

使用同步I/O的多线程服务端编程模型

  • 主线程使用epoll_wait来监听监听socket和连接socket上的读写就绪事件。
  • 当socket上可读时,将socket上的读事件加入到请求队列中,此时睡眠在请求队列上的工作线程被唤醒,读取socket上的请求并处理请求,处理请求完成后,再注册socket上的可写事件。
  • 当socket上可写时,主线程将socket上的写事件加入到请求队列当中,此时睡眠在请求队列上的工作线程被唤醒,向socket中写入服务器处理请求的结果。如果该http连接是短连接,则断开连接,否则重新注册该socket上的读事件,重新等待新请求的到来。

Proactor模式

使用异步I/O的多线程服务端编程模型

  • 主线程只负责监听监听socket上的读事件(只关心是否有新连接到来)。
  • 主线程注册连接socket上的读完成事件,并告诉内核用户读缓冲区的位置。然后当socket上的数据成功写入用户缓冲区后,内核使用信号通知应用程序,然后在信号处理函数中选择一个工作线程来处理http请求。之后工作线程注册socket上的写完成事件,并告诉内核写缓冲区的位置。
  • 在写完成的信号处理函数中选择一个工作线程来做善后工作(是否关闭该socket)

使用同步I/O来模拟Proactor

主要的一点是Proactor里面工作线程是不进行I/O操作的,如果使用同步I/O来模拟Proactor,我们要在主线程内监控到socket上的读事件时,就将socket上的数据读到读缓冲区中,再让工作线程来处理这个请求,工作线程处理完之后,将回复消息生成于写缓冲区之后,注册该socket上的写就绪事件。主线程负责将写缓冲区中的内容写入socket。

并发模型

I/O处理单元和多个逻辑单元之间协调完成任务的方法

半同步/半异步模式

同步:应用程序完全按照代码序列的顺序来执行;异步:信号驱动、中断等。

  • 逻辑单元使用同步,I/O处理单元使用异步

半同步/半反应堆

  • 异步线程为主线程,负责监听连接socket和监听socket,其实就是用Reactor模式,感觉一模一样。

领导者/追随者模式

这个感觉用得不多。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值