网络线程模型

  • 堵塞IO模型:每个连接都由独立的线程进行处理。当并发度较高时系统资源占用较大,并且如果线程发生了IO堵塞还会浪费线程资源
  • Reactor模型:reactor线程监听,并分发事件给相应的handler
  • Proactor模型:交由系统进行异步处理,感知完成的处理事件

Reactor模型

单reactor单线程

  1. reactor通过io复用接口监听客户端请求事件,然后进行分发

  2. 若是建立连接请求事件,则由acceptor接受请求,然后创建handler处理具体业务处理

    若非建立连接请求,直接交由相应handler进行处理

单线程模式简单,没有多线程、进程通信、竞争问题,但是也无法发挥多核CPU性能,并且在线程意外终止或者进入死循环的情况下容易导致整个故障

更加适合io密集型的场景,比如redis

单reactor多线程

  1. reactor通过io复用接口监听客户端请求事件,然后进行分发

  2. 若是建立连接请求事件,则由acceptor接受请求,然后创建handler处理具体业务处理

    若非建立连接请求,直接交由相应handler进行响应

  3. handler接受事件之后分发worker线程池进行具体业务处理

多线程模式充分利用了多核处理能力,只是单reactor监听、分发、响应容易在高并发情况下成为性能瓶颈

主从reactor多线程

  1. main reactor负责监听客户端请求事件,并分发

  2. 若是建立连接请求事件,则由acceptor进行连接

    若非建立连接请求,直接交由sub reactor将连接加入到连接队列进行监听,并创建handler处理

  3. handler读取数据后,再交予worker线程池处理

主从reactor模式相对来说还是比较复杂的

Proactor模型

proactor采用异步网络,感知已完成的io事件。

  • initiator:初始化异步操作;向异步操作处理器注册completion dispatcher、completion handler
  • completion handler(acceptor, http handler):由应用程序实现的用于异步操作完成通知的completion handler接口。
  • asynchronous operation:异步操作代表应用执行请求(例如I/O和定时器操作)。当应用程序调用异步操作时,这些操作不会借用应用程序的控制线程。因此,从应用程序的角度来看,操作是异步执行的。
  • asynchronous operation processor:执行异步操作。由系统实现
  • completion dispatcher:在异步操作完成之后负责回调completion handler。当异步操作处理器完成一个异步发起的操作时,完成分派器代表它执行一个应用程序回调。

以下是proacotr网页服务器发起http GET请求的演示

网络线程模型_第1张图片

  1. client发起GET请求
  2. 由系统读取完毕之后通知completion dispatcher
  3. completion dispatcher通知http handler处理
  4. http handler解析请求
  5. http handler同步读取请求文件
  6. http handler初始化异步处理,去写入数据到client连接,并将自己作为一个Completion handler和一个Completion Dispatcher的引用传递给http handler,该引用将用于在异步写入完成时通知http handler;
  7. 当写入操作完成之后,系统通知completion dispatcher
  8. completion dispatcher通知completion handler

Ref

  1. https://www.cnblogs.com/chenssy/p/15440348.html
  2. https://cloud.tencent.com/developer/article/1488120
  3. https://www.dre.vanderbilt.edu/~schmidt/PDF/Proactor.pdf

你可能感兴趣的:(net,哲学与架构,concurrent,网络,架构)