反应器Reactor和主动器Proactor的区别

参考书籍《C++11工程级应用》第16章

事件驱动设计在服务器开发中非常流行,其中常见的有两种:反应器(Reactor)和主动器(Proactor)

1. 反应器

反应器需要应用程序先注册事件处理器,然后启动反应器的事件循环,不断地检查是否有就绪地I/O事件,当有就绪事件时,同步事件多路分解器将会返回到反应器,反应器会将事件分发给多个句柄的回调函数以处理这些事件。

反应器的一个特点是,具体的处理程序并不调用反应器,而是由反应器来通知处理程序去处理事件,这种方式也被称为“控制反转”,又称为“好莱坞原则”。

反应器模式大概的流程如下:

1)应用程序在反应器上注册具体事件处理器,处理器提供内部句柄给反应器。

2)在注册之后,应用程序开始启动反应器事件循环。反应器将通过select等待发生在句柄集上的就绪事件。

3)当一个或多个句柄变成就绪状态时(比如某个socket读就绪了),反应器将通知注册的事件处理器。

4)事件处理器处理就绪事件,完成用户请求。

反应器模式使用起来相对直观,但它不能同时支持大量的客户请求或者耗时过长的请求,因为它串行化了所有的事件处理过程。而Proactor在这方面做了改进。

2. 主动器

1)应用程序需要定义一个异步执行的操作,例如,socket的异步读/写。

2)执行异步操作,异步事件处理器将异步请求交给操作系统就返回了,让操作系统去完成具体的操作,操作系统在完成操作后,会将完成事件放入一个完成事件队列

3)异步事件分离器会检测完成事件,若检测到完成事件,则从完成事件队列中取出完成事件,并通知应用程序注册的完成事件处理函数去处理。

4)完成事件处理函数处理异步操作的结果。

主动器和反应器的主要区别就是,主动器中,真正的读写是操作系统完成的。

 

具体介绍可以看这本书《面向模式的软件架构:卷2》

posted @ 2022-03-22 15:52  方山客  阅读(186)  评论(0编辑  收藏  举报