一、reactor模型和proactor模型区别
1. reactor模型 : 是基于事件驱动和非阻塞IO的并发模型,主要利用与I/O多路复用,将多个IO操作都放在epoll对象中,epoll_wait检测到有事件可读可写时,应用层主动进行对应事件的处理,准确来说 一个事件对应一个动作,根据不同的事件调用不同的回调函数。
2. proactor模型: 是基于异步IO的模型,操作系统负责完成IO操作,应用层序直接处理结果,真正实现了完全异步,不会阻塞线程(本质提交请求, 内核直接将结果给出来)。
二、 两者三个区别
特性 | Reactor | Proactor |
---|---|---|
I/O 模型 | 非阻塞同步 I/O | 真正的异步 I/O |
事件类型 | 事件是否就绪(数据可读/可写) | 事件是否已完成(数据已读/已写) |
I/O 操作 | 应用程序主动发起 I/O 操作(需要等待IO操作完成) | 操作系统完成 I/O 操作(不需要等待io操作完成) |
三、应用
-
Reactor 适用场景:
- 需要跨平台兼容性(尤其是 Linux/Unix)。
- 非阻塞 I/O 支持良好(如网络库、Web 服务器)。
- 开发者更熟悉同步编程模型。
-
Proactor 适用场景:
- 追求极致性能(如高频交易系统)。
- 操作系统原生支持异步 I/O(如 Windows IOCP、Linux
io_uring
)。 - 愿意处理复杂的异步回调逻辑。
四、问题1:为什么reactor是一种同步IO模型?
主要是因为它的io操作都是应用程序主动发起IO操作的,但是和传统的同步io (会阻塞线程)不一样,它又依赖于非阻塞IO和io多路复用,可以高效处理多个并发IO操作
五、两者总结
- Reactor:关注 I/O 就绪,开发者需手动执行非阻塞 I/O。
- Proactor:关注 I/O 完成,操作系统自动完成 I/O,开发者处理结果。
根据实际需求(平台、性能、复杂度)选择模式,现代高性能框架往往结合两者优势。