IO两个阶段

1、数据准备阶段:从谁被读取数据到内核空间的缓冲区。

2、内核空间复制回用户空间进程缓冲区阶段。

同步阻塞IO

IO模型_用户空间

 同步非阻塞IO

进程调用recvfromc操作,如果IO设备没有准备好,立即返回ERROR,进程不阻塞。用户可以再次发起系统调用(可以轮询),如果内核已经准备好数据,就开始阻塞,然后复制数据到用户空间。虽然不阻塞,但是不断的轮询,CPU处于忙等待。

IO模型_IO模型_02

IO多路复用

IO多路复用也称:Event-driven IO,就是利用操作系统提供的多路选择器(select、poll、epoll等)同时监控多个IO操作,只要有一路IO准备好了,就不需要等待,可以开始处理这一路的数据。这种方式提高了同时处理IO的能力。

IO模型_用户空间_03

select几乎所有操作系统都支持,poll是对select的升级,epollLinux内核2.5+开始支持,对select和poll的增强,在监视的基础上,减少了数据在用户态和内核态之间的反复复制,增加回调机制。epollselect相比, 解决了select监听fd的限制和O(n)遍历位图效率问题,提供回调机制等,效率高。

select为例,将关注的IO操作告诉select函数并调用,进程阻塞,内核监视select关注的文件描述符fd,被关注的任何一个fd对应的IO准备好数据,select返回。再使用read将数据复制到用户进程。