Bootstrap

Proactor模型

前言

上一篇讲解的Reaactor是非阻塞的同步网络模式,而Proactor是异步网络模式。

至于异步IO怎么理解:可以参考我的这一篇博客:
Linux的五种IO模型
理解之后:你就会感受到:很明显,异步 I/O 比同步 I/O 性能更好,因为异步 I/O 在「内核数据准备好」和「数据从内核空间拷贝到用户空间」这两个过程都不用等待。


因此:

  • Reactor 可以理解为「来了事件操作系统通知应用进程,让应用进程来处理
  • Proactor 可以理解为「来了事件操作系统来处理,处理完再通知应用进程」。这里的「事件」就是有新连接、有数据可读、有数据可写的这些I/O 事件这里的「处理」包含从驱动读取到内核以及从内核读取到用户空间。

无论是 Reactor,还是 Proactor,都是一种基于「事件分发」的网络编程模式,区别在于 Reactor 模式是基于「待完成」的 I/O 事件,而 Proactor 模式则是基于「已完成」的 I/O 事件。

步入正题:

Proactor模型

请添加图片描述

模块关系的工作流程如下:

  • Proactor Initiator负责创建ProactorHandler,并将ProactorHandler都通过Asynchronous operation processor注册到内核。
  • Asynchronous operation processor负责处理注册请求,并完成IO操作,完成IO操作后会通知proactor
  • proactor根据不同的事件类型回调不同的Handler进行业务处理,Handler完成业务处理,Handler也可以注册新的Handler到内核进程。

proactor有如下缺点:

  1. 编程复杂性,由于异步操作流程的事件的初始化和事件完成在时间和空间上都是相互分离的,因此开发异步应用程序更加复杂,应用程序还可能因为反向的流控变得更加难以Debug;
  2. 内存使用,缓冲区在读或写操作的时间段内必须保持住,可能造成持续的不稳定性,并且每个并发操作都要求有独立的缓存,相比Reactor模型,在Socket已经准备好读或写前,是不要求开辟缓存的;
  3. 操作系统支持,Windows下通过IOCP实现了真正的异步IO,而在LInux操作系统下,Linux2.6才引入,并且异步IO是使用epoll实现的,所以还不完善

因此在Linux下实现高并发网络编程都是以Reactor模型为主。

;