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

比如:什么是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可以理解为「来了事件操作系统来处理,处理完再通知应用进程」。

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部