网络编程事件处理模型和并发模式
事件处理模型
当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模式,感觉一模一样。
领导者/追随者模式
这个感觉用得不多。