高效事件处理模式--Proactor模式
同步I/O模型通常用于实现Reactor模式,异步I/O模型则用于实现Proactor模式。
Proactor模式
与 Reactor 模式不同,Proactor 模式将所有 I/O 操作都交给主线程和内核来处理, 工作线程仅仅负责业务逻辑。
- 主线程:负责监听已连接文件描述符上是否有事件发生。
- 内核:负责处理I/O读写操作。
- 工作线程:仅负责业务逻辑。
![Proactor模式.png](https://i.loli.net/2020/12/17/BHf5AtxvRQsWUV1.png)
使用异步 I/O 模型(以 aio_read 和 aio_write为例)实现的 Proactor 模式的工作流程是:
- 主线程调用 aio_read 函数向内核注册 socket 上的读完成事件,并告诉内核用户读缓冲区的位置,以及读操作完成时如何通知应用程序(这里以信号为例)。
- 主线程继续处理其他逻辑。
- 当 socket 上的数据被读入用户缓冲区后,内核将向应用程序发送一个信号,以 通知应用程序数据已经可用。
- 应用程序预先定义好的信号处理函数选择一个工作线程来处理客户请求。工作线程处理完客户请求之后,调用 aio_write 函数向内核注册 socket 上的写完成事件,并告诉内核用户写缓冲区的位置,以及写操作完成时如何通知应用程序(仍然以信号为例)。
- 主线程继续处理其他逻辑。
- 当用户缓冲区的数据被写入 socket 之后,内核将向应用程序发送一个信号,以通知应用程序数据已经发送完毕。
- 应用程序预先定义好的信号处理函数选择一个工作线程来做善后处理,比如决定是否关闭 socket。
主线程中的 epoll_wait 调用仅能用来检测监听(已连接)socket 上的连接请求事件,而不能用来检测连接 socket 上的读写事件。
参考:《Linux高性能服务器编程》 游双