一、实现方式
Reactor: 采用同步IO,用户层执行IO操作时,处于挂起状态,等待内核层完成。图示如下:
Proactor:采用异步IO,用户层执行IO操作时,可以一边等待内核操作IO,一边自己去处理其他事情。等内核操作IO结束后,用户层被唤醒。图示如下:
Proactor下,应用程序需要传递缓存区。
二、优点和缺点
1. Reactor:
优点:(1) 实现简单,不需要向内核传入缓冲区字符串,不需要使用多线程;
(2) 通用性更好,windows,linux都支持。
缺点:(1) 用户层要亲自执行IO操作时,会挂起等待IO,效率较低。
(2) 多个IO操作必须依次等待执行IO操作。
Proactor:
优点:(1) 用户层无需亲自执行IO操作,而是交给内核来执行。
(2) 内核可以并发地执行多个IO操作,效率更高。
缺点:(1) 实现复杂,需要向内核传入缓冲区字符串, 需要使用多线程。
(2) 依赖于操作系统,libevent暂时不支持。
三、适用场景
Reactor:不同客户端的服务请求,需要严格按照时序执行。
Proactor:连接数多,服务请求数目多,需要更高效率地处理这些请求。