reactor模型

问到某个知识点,要尽可能地多说一些。具体方法是先整体的回答要点;然后具体细节地展开叙述。(理论+实践)

比如:什么是reactor模型?

思路:先整体概述reactor模型;然后说一个例子。
答:

  1. Reactor可以理解为「来了事件操作系统通知应用进程,让应用进程来处理」。中心思想是将所有要处理的I/O事件注册到I/O复用函数上,同时主线程/进程阻塞在I/O复用函数上,一旦有I/O事件到来或是准备就绪(文件描述符或socket可读、写),I/O复用函数返回并将事先注册的相应I/O事件分发到对应的处理器中。
  2. Reactor是非阻塞同步网络模式,感知的是就绪可读写事件。在每次感知到有事件发生(比如可读就绪事件)后就需要应用进程主动调用read方法来完成数据的读取,也就是要应用进程主动将socket接收缓存中的数据读到应用进程内存中,这个过程是同步的,读取完数据后应用进程才能处理数据。
  3. Reactor 模型有三个重要的组件:
    I/O复用函数:由操作系统提供,在linux上一般是select,poll,epoll等系统调用。
    事件分发器:将I/O复用函数中返回的就绪事件分到对应的处理函数中。
    事件处理器:负责处理特定事件的处理函数。

具体流程如下:
4. 注册读就绪事件和相应的事件处理器(侦听fd);
5. I/O复用函数循环阻塞;
6. 事件到来,I/O复用函数返回,并调用事件对应的处理器;
7. 事件处理器完成实际的读操作,处理读到的数据,注册新的事件,然后返还控制权。

reactor模式中,各个模式的区别?

  • 第一种方案:单Reactor单进程/线程,不用考虑进程间通信以及数据同步的问题,因此实现起来比较简单,这种方案的缺陷在于无法充分利用多核CPU,而且处理业务逻辑的时间不能太长,否则会延迟响应,所以不适用于计算密集型的场景,适用于业务处理快速的场景,比如Redis(6.0之前)采用的是单Reactor单进程的方案。
  • 第二种方案:单Reactor多线程,通过多线程的方式解决了方案一的缺陷,但它离高并发还差一点距离,差在只有一个Reactor对象来承担所有事件的监听和响应,而且只在主线程中运行,在面对瞬间高并发的场景时,容易成为性能的瓶颈的地方。
  • 第三种方案多Reactor多进程/线程,通过多个Reactor来解决子方案二的缺陷,主Reactor只负责监听事件,响应事件的工作交给了从Reactor,Netty和Memcache都采用了「多Reactor多线程」的方案,Nginx则采用了类似于「多Reactor多进程」的方案。

Reactor v.s. proreactor

Reactor可以理解为「来了事件操作系统通知应用进程,让应用进程来处理」,而Proactor可以理解为「来了事件操作系统来处理,处理完再通知应用进程」。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值