reactor和proactor的好处和坏处。为什么要用reactor而不用 proactor?
Reactor:
同步非阻塞 IO + 事件多路复用(select/poll/epoll/kqueue)。
事件就绪后回调业务处理函数,业务代码自己调用 read/write
优点:
逻辑简单,容易调试。事件来了,应用自己去读写,流程直观。
跨平台兼容性好。epoll(linux)、kqueue(bsd)、IOCP(windows 也可以模拟 reactor)。
不需要操作系统支持异步 IO
缺点:
事件就绪只是 “内核缓冲区有数据”,真正 read/write 仍然是系统调用,有少量开销。
如果业务回调里写阻塞操作,整个 Reactor 线程会被卡住
所以 Reactor 要求回调函数必须非阻塞。
Proactor:
异步 IO(AIO)模型
应用提前发起异步读 / 写请求,交给内核
内核自己完成数据拷贝(内核缓冲区 ↔ 用户缓冲区)
数据传输全部完成之后,内核通知应用:操作完成了
优点:
真正异步:数据拷贝由内核完成,应用收到通知时数据已经在用户内存里,不再需要 read/write 系统调用。理论上性能上限更高。
不会因为等待 IO 占用线程,线程专注业务计算。
缺点:
跨平台极差。Windows IOCP 成熟;Linux 原生 AIO 对 socket 支持差,bug 多,很多场景不可用。
模型复杂,调试困难。读写操作提前提交,缓冲区生命周期管理非常麻烦,容易内存越界、内存泄漏。
很难实现协议解析:比如 http,读到部分数据就要解析,Proactor 必须一次性读完预设长度才通知。
为什么很多项目选 Reactor,不用 Proactor?
1.Linux 没有成熟可用的 Proactor
2.Reactor 更容易开发、维护、排坑
3.Reactor 的性能足够绝大多数场景
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐

所有评论(0)