知识卡片

Reactor与Proactor的本质区别——谁来完成I/O操作

普通读书笔记卡 · 1669.b

内容

Reactor是”非阻塞同步”——内核只通知”有事件了”,读写仍需业务进程完成;Proactor是”异步”——内核直接完成读写才通知处理。理论上后者更高效,但需系统底层支持真正异步I/O,主流开源系统并不完善,故高并发编程实践中仍以前者为主,号称支持后者的库也常是用前者模拟的。发散:理论更优的模型能否落地,要看平台是否真支撑,脱离平台谈优劣意义有限。

参考来源

- 位置:《从0开始学架构》第23章《19|单服务器高性能模式:Reactor与Proactor》"Proactor"一节(源文件:_epub-src/OEBPS/Text/part0022_split_003.html) - 结论依据:原文明确"Reactor是非阻塞同步网络模型,因为真正的read和send操作都需要用户进程同步操作……如果把I/O操作改为异步就能够进一步提升性能,这就是异步网络模型Proactor",并说明"目前Windows下通过IOCP实现了真正的异步I/O,而在Linux系统下的AIO并不完善,因此在Linux下实现高并发网络编程时都是以Reactor模式为主……即使Boost.Asio号称实现了Proactor模型,其实……在Linux下是用Reactor模式(采用epoll)模拟出来的异步模型"。 - 原始内容:Reactor是非阻塞同步网络模型……如果把I/O操作改为异步就能够进一步提升性能,这就是异步网络模型Proactor……目前Windows下通过IOCP实现了真正的异步I/O,而在Linux系统下的AIO并不完善,因此在Linux下实现高并发网络编程时都是以Reactor模式为主……即使Boost.Asio号称实现了Proactor模型,其实它在Windows下采用IOCP,而在Linux下是用Reactor模式(采用epoll)模拟出来的异步模型。