网络I/O模型
1.网络IO的概念:
本质就杀socket的读取,socket在linux系统被抽象为流,I/O可以理解为对流的操作,实际就是读取对端(另外一个网络节点服务器)通过网络传过来的二进制流
2.网络IO模型分类:
同步模型
阻塞IO
非阻塞IO
多路复用IO
信号驱动式IO
异步IO
3.网络IO的两个阶段:
(1)等待数据准备(数据由对端传输到内核(TCP/IP协议栈在内核)的缓存区)
(2) 数据由内核缓存区复制到用户进程缓存区
4.各种类型IO模型概述
(1)阻塞I/O(bloking I/O):进程向内核发起网络IO请求(recvfrom 系统调用),该进程就阻塞了,让出CPU使用权(无法做计算处理,更无法发起下一次网络IO请求)。直到内核把数据准备好,并起拷贝
到用户进程。
(2)非阻塞IO(non-bloking I/O)
在网络I/O时候,非阻塞I/O也会进行recvform系统调用,检查数据是否准备好,与阻塞I/O不一样,"非阻塞将大的整片时间的阻塞分成N多的小的阻塞, 所以进程不断地有机会 '被' CPU光顾"。
也就是说非阻塞的recvform系统调用调用之后,进程并没有被阻塞,内核马上返回给进程,如果数据还没准备好,此时会返回一个error。进程在返回之后,可以干点别的事情,然后再发起recvform系统调用。重复上面的过程,循环往复的进行recvform系统调用。这个过程通常被称之为轮询。轮询检查内核数据,直到数据准备好,再拷贝数据到进程,进行数据处理。需要注意,拷贝数据整个过程,进程仍然是属于阻塞的状态。