网络IO知识小记20210218

网络IO知识小记

网络IO 读时经历的阶段

IO的状态(可读,可写,是否出错)

  • 等待数据准备就绪
  • 将数据从内核拷贝到进程或线程中

网络IO模型

synchronous IO同步IO

阻塞IO、非阻塞IO、多路复用IO(事件驱动IO)

阻塞IO

在这里插入图片描述
特点:进程条件没有满足时,进程一直在等待,满足条件才返回,期间也不占用资源,有利于操作系统的性能释放。
缺点:处理客户端并发,多线程或多进程都会严重占用系统资源。

非阻塞IO

在这里插入图片描述
每次客户询问内核是否有数据准备好,即文件描述符缓冲区是否就绪。当有数据报准备好时,就进行拷贝数据报的操作。当没有数据报准备好时,也不阻塞程序,内核直接返回未准备就绪的信号,等待用户程序的下一个轮询。
使用fcntl函数变成非阻塞

fcntl(fd,F_SETFL,O_NONBLOCK);

缺点:循环调用recv会大幅度提高CPU的占用率。

多路复用IO(事件驱动IO)

在这里插入图片描述
select/epoll单个进程就可以同时处理多个网络连接IO,不断轮询负责所有socket,当某个socket数据到达就会通知用户进程。

优点:用户可以在一个线程中处理多个socket的IO请求
注意:如果处理的连接数不是很高的话,使用select/epoll 的 web server 不一定比使用 multi-threading + blocking IO 的 web server 性能更好,可能延迟还更大。多路复用select和epoll并不是对单个连接处理的更快,而是在于能处理更多的连接。
select优点:select()的事件驱动模型只用单线程(进程)执行,占用资源少,不消耗太多 CPU,同时能够为多客户端提供服务。
select缺点:当需要探测的句柄值较大时,select()接口本身需要消耗大量时间去轮询各个句柄。

asynchronous IO异步IO

异步IO与同步IO本质的不同在于,检测IO是否有数据和读数据不在同一个流程之中。
在这里插入图片描述
用户进程发起 read操作之后,立刻就可以开始去做其它的事。而另一方面,从 kernel的角度,当它受到一个 asynchronous read 之后,首先它会立刻返回,所以不会对用户进程产生任何 block。然后,kernel 会等待数据准备完成,然后将数据拷贝到用户内存,当这一切都完成之后,kernel会给用户进程发送一个 signal,告诉它 read操作完成了。

信号驱动IO

在这里插入图片描述
信号驱动IO模型,应用进程告诉内核:当数据报准备好的时候,给我发送一个信号,对SIGIO信号进行捕捉,并且调用我的信号处理函数来获取数据。这种模型的优势在于等待数据报到达(第一阶段)期间,进程可以继续行,不被阻塞。免去了 select 的阻塞与轮询,当有活跃套接字时,由注册的 handler处理。

高效的事件处理模型

高性能服务器程序通常需要考虑处理三类事件:I/O 事件,定时事件及信号。

Reactor模型

Reactor 释义"反应堆",是一种事件驱动机制,linux 主要还是以 Reactor 模型为主。
和普通函数调用的不同之处在于:应用程序不是主动的调用某个 API 完成处理,而是Reactor 设置了事件处理流程,应用程序需要提供相应的接口并注册到 Reactor上,如果相应的事件发生,Reactor 将主动调用应用程序注册的接口,这些接口又称为“回调函数”。

Reactor模式用于同步 I/O,是将所有要处理的 I/O 事件注册到一个中心 I/O 多路复用器上,同时主线程/进程阻塞在多路复用器上;一旦有 I/O 事件到来或是准备就绪(文件描述符或 socket 可读、写),多路复用器返回并将事先注册的相应 I/O 事件分发到对应的处理器中。

Reactor模型组件

多路复用器:由操作系统提供,在 linux 上一般是 select, poll, epoll 等系统调用。
事件分发器:将多路复用器中返回的就绪事件分到对应的处理函数中。
事件处理器:负责处理特定事件的处理函数。

Reactor模式具体流程

  • 事件分离器等待事件;
  • 事件到来,激活分离器,分离器调用事件对应的处理器;
  • 事件处理器完成实际的读操作,处理读到的数据,注册新的事件,然后返还控制权。

Reactor模式优点

  • 响应快,不必为单个同步时间所阻塞,虽然 Reactor本身依然是同步的;
  • 编程相对简单,可以最大程度的避免复杂的多线程及同步问题,并且避免了多线程/进程的切换开销;
  • 可扩展性,可以方便的通过增加 Reactor实例个数来充分利用 CPU 资源;
  • 可复用性,reactor框架本身与具体事件处理逻辑无关,具有很高的复用性;

Reactor模型的缺点

单线程使用一颗 CPU 的全部资源,每个事件处理中很多时候可以不考虑共享资源的互斥访问。但是CPU 的频率受制于材料的限制不再有大的提升,而改为是从核数的增加上提升能力,当程序需要使用多核资源时Reator模型就不大适合。

Proactor模型

windows 较常采用 Proactor的模型利用完成端口来实现服务器。

Proactor模式具体流程

  1. 处理器发起异步操作,并关注 I/O 完成事件;
  2. 事件分离器等待操作完成事件;
  3. 分离器等待过程中,内核并行执行实际的 I/O 操作,并将结果数据存入用户自定义缓冲区,最后通知事件分离器读操作完成;
  4. I/O 完成后,通过事件分离器呼唤处理器;
  5. 事件处理器处理用户自定义缓冲区中的数据。

猜你喜欢

转载自blog.csdn.net/Narutolxy/article/details/113849679