计网--问题3--网络模型-I/O复用

计网--问题3--网络模型-I/O复用


1.I/O复用技术


      IO复用是一种机制,简单说就是IO事件的到来、读写、异常等情况都有内核帮你监控了,应用程序只需要处理那些内核通知你的IO句柄即可,这种机制的前提是即使建立数万连接,某时刻可读写的fd数量只占总连接量的很小的比例,因此借助于内核事件驱动机制,就可以实现单线程的数万Socket的管理。

举个例子:
       一个大工厂很多车间,之前必须每个车间有个值班人员,per house per woker的模式,大部分情况下车间是没有异常情况的,但是为了保证万无一失,仍然需要一名工作人员。后来引入了监控报警系统,视频音频等信息都实时传输到中控室,从而1名或数名工作人员就可以完成整个厂区的监控,大大提高效率。
IO复用就不多说了,并没有什么太多复杂之处,目前热门的epoll就是其中的悍将,至于epoll的一些详细的机制可以自行查询不再赘述了。


2.事件处理模型


      网络设计模式中,如何处理各种I/O事件是其非常重要的一部分,Reactor 和Proactor两种事件处理模型应运而生,可以使用同步I/O实现Reactor模型,使用异步I/O实现Proactor模型。

(1)Reactor事件处理模型:

      Reactor模型是同步I/O事件处理的一种常见模型,其核心思想:将关注的I/O事件注册到多路复用器上,一旦有I/O事件触发,将事件分发到事件处理器中,执行就绪I/O事件对应的处理函数中。模型中有三个重要的组件:

  1. 多路复用器:由操作系统提供接口,Linux提供的I/O复用接口有select、poll、epoll
  2. 事件分离器:将多路复用器返回的就绪事件分发到事件处理器中
  3. 事件处理器:处理就绪事件处理函数

Reactor模型工作的简化流程:

(2)Proactor事件处理模型

与Reactor不同的是,Proactor使用异步I/O系统接口将I/O操作托管给操作系统,Proactor模型中分发处理异步I/O完成事件,并调用相应的事件处理接口来处理业务逻辑.

Proactor模型的简化的工作流程:

Proactor利用异步I/O并行能力带来更高的效率,但同时增加了编程复杂度。windows对异步I/O提供了很好的支持,而Linux对异步I/O操作支持并不是特别理想,因此Linux平台上还是以Reactor模型为主,Boost asio采用的是Proactor模型。
(3)并发模式
在I/O密集型的程序,采用并发方式可以提高CPU的使用率,可采用多进程和多线程两种方式实现并发。其中包括半同步/半异步模式、半同步/半反应堆模式、半同步/半反应堆模式改进版、Follower/Leader模式。

同步和异步概念

并发模式中的同步异步和 I/O模型中的同步异步并不一样:

  1. 并发模式中同步指程序按照代码顺序执行,异步指程序依赖事件驱动
  2. I/O模型中同步异步用来区分是主动读取数据结构,还是内核帮忙完成数据的读取再返回给线程

猜你喜欢

转载自blog.csdn.net/qq_41103495/article/details/108828535