1、阻塞I/O
1)当上层应用app调用recv系统调用时,如果对等方没有发送数据(缓冲区没有数据),上层应用app将阻塞(默认行为,被linux内核阻塞)。
2)当对等方发送了数据,linux内核recv端缓冲区,有数据后,内核会吧数据copy给用户空间。然后上层应用解除阻塞,执行下一步操作。
2、非阻塞I/O
1)、上层应用程序将套接字设置成非阻塞模式
2)、上层应用程序轮询调用recv函数,接受数据。若缓冲区没有数据,上层程序不会阻塞,recv返回值为-1,错误码是EWOULDBLOCK.
3)、上层应用程序不断轮询有没有数据到来,会造成上层应用忙等待。大量消耗CPU很少直接使用,应用范围小,一般和selectio复用配合使用。
3、I/O复用
1)、上层应用程序调用select机制(该机制有linux内核支持,避免了应用程序忙等待),进行轮询文件描述符的状态变化。
2)、当select管理的文件描述符没有数据(或者状态没有变化时),上层 应用程序也会阻塞
3)、好处select机制可以管理多个文件描述符
4)、select可以看成一个管理者,用select来管理多个IO.
一旦检测到的一个I/O或者多个I/O,有我们感兴趣事件发生,select函数将返回,返回值为检测到的事件个数。进而可以利用select相关api函数,操作具体事件。
5)、select函数可以设置等待时间,避免了上层 应用程序长期僵死。
6)、和阻塞IO模型相比,selectI/O复用模型相当于提前阻塞了,等待有数据到来时,在调用recv就不会发生阻塞。
4、信号驱动I/O
1)、上层应用程序建立SIGIO信号处理程序。当缓冲区有数据到来,内核会发送信号告诉上层应用程序。
2)、上层应用程序接收到信号后,调用recv函数,因缓冲区有数据,recv函数一般不会阻塞。
3)、这种模型用的比较少,属于电影的“”拉模式“”,即上层应用程序需要调用recv函数把数据拉进来。
5、异步I/o
1)、上层应用程序调用aio_read函数,同时提交一个应用层的缓冲区buf;调用完毕后,不会阻塞。上层应用程序可以继续其它任务。
2)、当tcpip协议缓冲区有数据时,linux主动的把内核数据copy到用户空间,然后在给上层应用发送信号,告诉上层应用程序有数据了,抓紧处理吧。
3)、典型的"推模式"
4)、效率最高的一种形式,上层应用程序有异步处理的能力(在linux内核的支持下,言外之意:处理其他任务时的同时,也可支持IO通信)。异步I/O指的是,上层应用程序,在也可以干别的活的时候,可以接受数据(接受异步通信事件。===)异步指令来源)。与信号驱动IO模型相比,上层应用程序不需要调用recv函数。
I/O复用和异步IO比较重要