Muduo 04 Reactor模型

Reactor模型是一种事件处理模式,用于并发服务请求的解复用和同步处理。它包括Event、Reactor、Demultiplex和EventHandler四个组件,通过Epoll等多路复用技术监听和分发事件。Proactor模式则基于异步I/O,操作完成后触发CompletionHandler。两者在效率、跨平台性和复杂性上各有优势,适用不同场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

Reactor模型

Reactor模型中四大组件之间的交互模式

总结

事件处理模式Reactor和Proactor模式区别


Reactor模型

        反应器设计模式是一种事件处理模式,用于处理由一个或多个输入并发交付给服务处理程序的服务请求。然后,服务处理程序对传入的请求进行解复用,并同步发送给关联的请求处理程序。

重要组件:Event事件、Reactor反应堆、Demultiplex事件分发器、Evanthandler事件处理器


Reactor模型中四大组件之间的交互模式

        1. 基于reactor模型的这个网络服务器,在交互的时候呢首先会把事件注册到反应堆上(表示应用对这个事件感兴趣,请求反应堆帮助监听我所感兴趣的事件,并在这个事件发生时去调用一下相应预先设置的回调函数handler)所以我们所谓的向反应堆注册事件意思就是说,把这个事件event + 对应的这个handler,都给到这个reactor反应堆。

        2. 反应堆,可以理解为它维护了这么一个事件Event以及事件处理handler的集合,然后反应堆就可以通过相应的  方法,在事件分发器中针对事件进行调整。以epoll为例:底层epoll_control通过add/modify/或者delete在这个事件分发器中对事件进行一个设置调整,添加新的事件、修改已有的事件、以及把已经添加过的事件进行一个删除。

        

        3. 然后启动反应堆启动反应堆以后,反应堆的后端会驱动这个事件分发器的启动。还是以epoll为例,事件分发器实际上就是在开启epoll_wait,因为在开启之前呢reactor已经调用相应的方法,把用户把应用注册过来的事件进行了添加调整以及删除,多路复用开启epoll_wait, 整个服务器呈现出阻塞的状态来等待新用户的连接,或者是已连接用户的读写事件。如果呢监听到有新事件产生,那么多路复用分发器把这个分发的事件,给返回到反应堆。

       4. 因为事件对应的处理器都是在反应堆里边维护的,所以,它把这个事件返回到reactor里,reactor就会找到这个event对应的handler,一般都是通过一个map表来存储。然后调用调用具体的event handler来读取。

总结

        简单来说Event就包含了我么们在编写网络程序的时候包含的具体的感兴趣的socketfd事件,读、写事件还有一些其他信息(epoll_in epoll_out)这些都是事件类型以及对应方法headler,

注册到Readtor反应堆上,Reactor就维护了这个Event和headler的集合,然后通过相应的方法(epoll_control)给多路复用分发器添加、调整、删除事件,然后事件分发器启动(epoll_wait)监听相应的事件,事件发生后会返回事件列表给Reactor,Reactor会去在map表中找到event对应的eventhandler,eventhandler要做的事情就是:先读取用户的请求read,然后再进行反序列化,也就是解码encode操作,然后进行业务逻辑处理。compute计算对吧啊?然后再进行编码操作,把结果呢处理的结果呢进行编码,也就是数据的序列化,然后再send通过网络给用户返回一个请求对应的响应。

事件处理模式Reactor和Proactor模式区别

`Reactor` 和 `Proactor` 都是事件驱动编程中的模式,用于处理多个并发I/O操作。这两种模式的主要区别在于它们如何处理异步I/O事件。

1. Reactor模式:
    - 是基于同步I/O的。在Reactor模式中,应用程序首先注册一个或多个I/O操作,并等待这些操作就绪。一旦某个操作就绪(例如,socket上的数据可读),事件处理器会被触发。
    - 应用程序仍然需要自己进行实际的I/O操作,例如读取数据。

2. Proactor模式:
    - 是基于异步I/O的。在Proactor模式中,应用程序初始化一个异步I/O操作。一旦操作完成(例如,数据已被读取到缓冲区),完成处理器(completion handler)会被触发。
    - 系统负责处理实际的I/O操作,应用程序只需要处理操作完成后的结果。

reactor模式中,主线程(I/O处理单元)只负责监听文件描述符上是否有事件发生,有的话立即通知工作线程(逻辑单元 ),将socket可读事件放入请求队列,交给工作线程处理。除此之外,主线程不做任何其他性质得工作,交给工作线程处理。 除此之外,读写数据、接受新连接及处理客户请求均在工作线程中完成,通常由同步I/O实现。

proactor模式中,主线程和内核负责处理读写数据、接受新连接等I/O操作,工作线程仅负责业务逻辑,如处理客户请求。通常由异步I/O实现。

哪个更好?

这完全取决于具体的应用场景和平台:

效率:在支持原生异步I/O的平台上(例如,Windows的IOCP),Proactor模式可能更为高效,因为它能够利用操作系统提供的异步I/O能力。
  
跨平台:Reactor模式通常更容易在不同的平台上实现,因为它是基于同步I/O的,这些I/O调用在多数平台上都有。

复杂性:Proactor可能会使应用逻辑变得复杂,特别是当需要处理许多并发的异步操作时。

可扩展性:在高并发环境下,Proactor模式可能提供更好的可扩展性,尤其是当与某些特定的多路复用技术(如IOCP)结合使用时。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值