1 select、poll、epoll
1.1 引言
操作系统在处理io
的时候,主要有两个阶段:
- 等待数据传到io设备
- io设备将数据复制到user space
我们一般将上述过程简化理解为:
- 等到数据传到kernel内核space
- kernel内核区域将数据复制到user space(理解为进程或者线程的缓冲区)
select
,poll
,epoll
都是IO
多路复用的机制。I/O
多路复用就通过一种机制,可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作。但select
,poll
,epoll
本质上都是同步I/O
,因为他们都需要在读写事件就绪后自己负责进行读写,也就是说这个读写过程是阻塞的,而异步I/O
则无需自己负责进行读写,异步I/O的实现会负责把数据从内核拷贝到用户空间
1.2 IO和Linux内核发展
1.2.1 整体概述
整体关系流程:
查看进程文件描述符:
获取pid进程号
ps -ef
查看文件描述符
cd /proc/进程号/fd ; ll
或者查看当前进程的fd
$$ 表示 Shell 本身的 PID (ProcessID)
cd /proc/$$/fd ; ll
1.2.2 阻塞IO
计算机是有内核(kernel
)的,内核向下连接很多的客户端,内核向上连接进程或线程
,早先内核通过read
命令读取文件描述符(fd),在这个时期socket
是blocking
(阻塞的)BIO
。
如下图所示:线程通过内核读取文件fd8,读取到用户空间后,在通过内核写入文件fd9,如果fd8阻塞了,它会阻挡后面的操作
1.2.3 非阻塞IO
socket fd nonblock
(非阻塞),进程/线程用一个,用循环遍历文件描述符(轮询发生在用户空间