五种网络IO管理
网络io:涉及两个系统对象
a: 用户控件调用io的进程或线程
b:内核空间的内核系统
将网络io分为两个阶段比较好处理:
a:数据准备阶段
b: 数据拷贝阶段
阻塞IO(blockingIO)
linux系统默认情况socket都是blocking;操作过程如下图
注意:阻塞io:等待数据和拷贝数据阶段都是阻塞的
非阻塞IO(non-blockingIO)
Linux下,可以通过设置socket使其变为non-blocking
fcntl( fd, F_SETFL, O_NONBLOCK );
流程图如下
在非阻塞式IO中,用户进程其实是需要不断的主动询问kernel数据准备好了没有。
多路复用IO
可以使得单个进程处理多个网络连接io,
它的基本原理就是select/epoll这个function会不断的轮询所负责的所有socket,当某个socket有数据到达了,就通知用户进程。
流程图如下
异步IO
Linux下的asynchronous IO用在磁盘IO读写操作,不用于网络IO,
从内核2.6版本才开始引入
信号驱动IO
首先我们允许套接口进行信号驱动I/O,并安装一个信号处理函数,进程继续运行并不阻塞。当数据准备好时,进程会收到一个SIGIO信号,可以在信号处理函数中调用I/O操作函数处理数据。当数据报准备好读取时,内核就为该进程产生一个SIGIO信号。我们随后既可以在信号处理函数中调用read读取数据报,并通知主循环数据已准备好待处理,也可以立即通知主循环,让它来读取数据报。无论如何处理SIGIO信号,这种模型的优势在于等待数据报到达(第一阶段)期间,进程可以继续执行,不被阻塞。免去了select的阻塞与轮询,当有活跃套接字时,由注册的handler处理。