Linux IO模式及 select、poll、epoll详解
一. 涉及概念
用户空间与内核空间
进程间切换
进程的阻塞
文件描述符
缓存I/O
用户控件与内核空间
操作系统根据寻址空间,划分为内核空间与用户控件。
Linux 操作系统的高位1G字节为内核使用;低位3G字节位用户使用 (32位操作系统而言)
- 进程切换
为了控制进程的执行,内核必须有能力挂起正在CPU上运行的进程,并恢复以前挂起的某个进程的执行。这种行为被称为进程切换
- 进程的阻塞
正在执行的进程,由于期待的某些事件未发生,如请求系统资源失败、等待某种操作的完成、新数据尚未到达或无新工作做等,则由系统自动执行阻塞原语(Block),使自己由运行状态变为阻塞状态。当进程进入阻塞状态,是不占用cpu资源的
- 文件描述符fd
文件描述符在形式上是一个非负整数。实际上,它是一个索引值,指向内核为每一个进程所维护的该进程打开文件的记录表。当程序打开一个现有文件或者创建一个新文件时,内核向进程返回一个文件描述符
- 缓存I/O
缓存 I/O 又被称作标准 I/O,大多数文件系统的默认 I/O 操作都是缓存 I/O。在 Linux 的缓存 I/O 机制中,操作系统会将 I/O 的数据缓存在文件系统的页缓存( page cache )中,也就是说,数据会先被拷贝到操作系统内核的缓冲区中,然后才会从操作系统内核的缓冲区拷贝到应用程序的地址空间。
select,poll,epoll 都属于用户进程调用函数,整个进程进入block状态(block状态不占用CPU);
而同时kernel监控所有函数指负责的socket文件描述符,有任何的一个socket中的数据准备好了,select(poll,epoll)就会返回;
用户进程此时将会终止block状态,进行下一步的操作。