IO两个阶段
1、数据准备阶段:从谁被读取数据到内核空间的缓冲区。
2、内核空间复制回用户空间进程缓冲区阶段。
同步阻塞IO
同步非阻塞IO
进程调用recvfromc
操作,如果IO设备没有准备好,立即返回ERROR
,进程不阻塞。用户可以再次发起系统调用(可以轮询),如果内核已经准备好数据,就开始阻塞,然后复制数据到用户空间。虽然不阻塞,但是不断的轮询,CPU处于忙等待。
IO多路复用
IO多路复用也称:Event-driven IO
,就是利用操作系统提供的多路选择器(select、poll、epoll等
)同时监控多个IO操作,只要有一路IO准备好了,就不需要等待,可以开始处理这一路的数据。这种方式提高了同时处理IO的能力。
select
几乎所有操作系统都支持,poll
是对select的升级,epoll
Linux内核2.5+开始支持,对select和poll的增强,在监视的基础上,减少了数据在用户态和内核态之间的反复复制,增加回调机制。epoll
与select
相比, 解决了select
监听fd
的限制和O(n)
遍历位图效率问题,提供回调机制等,效率高。
以select
为例,将关注的IO操作告诉select
函数并调用,进程阻塞,内核监视select
关注的文件描述符fd
,被关注的任何一个fd
对应的IO准备好数据,select
返回。再使用read
将数据复制到用户进程。