【网络服务器】服务器模型Reactor和Proactor

1、 Reactor

Reactor模型是经典的事件驱动架构模型,按Reactor实例的不同可以分为单Reactor模型,主从Reactor模型。

1.1 单Reactor单线程模型

单Reactor模型的事件处理和业务处理在同一个线程,典型的one loop per thread思想;

单个Reactor模型由事件分发器dispatch,事件处理器handler,事件句柄handle这几个部分组成。

优点:模型简单,没有多线程、进程通信、竞争的问题;全部在一个线程中完成;

缺点:性能问题,只有一个线程,无法完全发挥多核CPU的性能。handler在处理某个连接上的业务时,整个进程/线程无法处理其他连接事件,很容易导致性能瓶颈。当其中某个handler阻塞时,会导致其他所有的client的handler都得不到执行,并且更严重的是,handler的阻塞也会导致整个服务不能接收新的client请求(因为acceptor也被阻塞了),因为缺点很多,所以单线程Reactor模型使用较少。

使用场景:客户端数量有限,业务处理非常快速,如redis。

 

1.2 单Reactor多线程模型

优点:可以充分利用多核CPU的处理能力。

缺点:多线程数据共享和访问比较复杂;Reactor承担所有事件的监听和响应,在单线程下运行,高并发场景下容易成为性能瓶颈。

 

1.3 主从Reactor多线程模型

主Reactor在Acceptor中建立连接后,把连接交由子Reactor模型来处理。

优点:父线程和子线程的数据交互简单、职责明确,父线程只需要接收新连接,子线程完成后续的业务处理。

缺点:

 

 

2、 Proactor

截取对Proactor比较清晰的讲解:

1、由使用者(Initiator)发起一个异步操作(Asynchronous Operation),同时创建一个异步回调对象(Completion Handler);

2、该异步操作交给了异步操作执行器(Asynchronous Operation Processor),由它负责执行异步操作,并在完成后将一个完成事件插入完成事件队列(Completion Event Queue);

3、前摄器(Proactor)驱动异步事件分派器(Asynchronous Event Demultiplexer)从完成事件队列中获取完成的事件(这是一个阻塞的过程),如果获取到则前摄器找出与该事件关联的回调对象并执行回调,继续后续流程;

 

 

参考博文:Boost库学习4 - 网络库asio_boost asio的基础使用-CSDN博客

 

posted on 2024-01-19 11:11  lingzshen  阅读(20)  评论(0)    收藏  举报