【Linux高性能服务器编程】:8.4、高效事件处理模式——Reactor/Proactor

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读写事件

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值