1、Reactor模式 |
主线程 只负责监听文件描述符,有事件就立即通知工作线程
工作线程 负责读写数据,接受新的连接,以及处理客户请求
2、Reactor工作流程 |
同步I/O 实现 Reactor:【epoll_wait】
1、主线程往epoll内核事件表 注册socket读就绪事件
2、主线程调epoll_wait 等 socket有数据可读
3、当 socket可读 时,epoll_wait通知主线程;主线程将socket 可读事件放入请求队列
4、睡眠在请求队列上的某工作线程被唤醒,它从socket 读数据并处理客户请求,待处理结束,
工作线程往epoll内核事件表 注册该socket写就绪事件
5、主线程调用epoll_wait等待socket可写
6、当 socket可写 时,epoll_wait通知主线程;主线程将socket 可写事件放入请求队列
7、睡眠在请求队列上的某工作线程被唤醒,它往socket 写处理请求结果
工作线程【线程无读写区分必要】从请求队列取出事件后,将根据事件类型分别处理:
可读事件,执行读数据和处理请求;可写事件,执行写数据
3、Proactor模式 |
与Reactor模式不同,主线程和内核 负责所有I/O操作;工作线程仅仅负责业务逻辑
贴合服务器编程框架:
4、Proactor工作流程 |
异步I/O 实现 Proactor:【aio_read/aio_write】
1、主线程调aio_read向内核 注册socket读完成事件,指设用户读缓冲区、读完成通知应用方式
2、主线程继续处理其他逻辑
3、当 socket数据被读入用户缓冲区 后,内核将向应用发送一信号,以 通知应用 数据已可用
4、应用预定义的 信号处理函数 选一工作线程来 处理客户请求,待处理结束,
工作线程调aio_write向内核 注册socket写完成事件,指设用户写缓冲区、写完成通知应用方式
5、主线程继续处理其他逻辑
6、当 用户缓冲区数据被写入socket 后,内核将向应用发送一信号,以 通知应用 数据已发完
7、应用预定义的 信号处理函数 选一工作线程来 做善后处理,决定是否关闭socket
socket读写事件 是通过aio_xxx向内核注册的,因此内核将通过 信号报告事件 给应用
主线程 epoll_wait 仅检测监听 socket连接请求事件,不检测 socket读写事件