目录
-
基础概念
-
IO阶段
-
IO模型分类
-
select、poll、epoll的区别
一、基础概念
IO:数据的读取或写入操作,目前通常指网络IO与磁盘IO
同步与异步
- 同步:所有的操作都做完,才返回给用户结果
- 异步:不用等所有操作都做完,就响应用户请求
阻塞与非阻塞
- 阻塞:调用者调用某个函数,等待函数返回,期间什么也不做,不停检查函数有没有返回,必须等这个函数返回后才能进行下一步动作
- 非阻塞:每隔一段时间就去检查IO事件是否就绪,没有就绪就可以做其他事情
二、IO阶段
IO分为两阶段:
(1)用户进程空间与内核空间之间的相互切换
(2)内核空间与设备空间的相互切换
Linux中进程无法直接操作I/O设备,其必须通过系统调用请求内核来协助完成I/O动作,内核会为每个I/O设备维护一个缓冲区,具体操作如下:
(1) 进程IO系统调用
(2) 内核查看缓冲区有无缓存数据
(3) 若有,则直接复制到进程空间;若没有,则到设备中读取
三、IO模型分类
- 阻塞IO:进程发起IO系统调用后,进程被阻塞,转到内核空间处理,整个IO处理完毕后返回进程
- 非阻塞IO:进程发起IO系统调用后,进程被阻塞,内核数据还没好,不想让进程等待,就返回一个错误,进程退出阻塞状态,每隔一段时间发起IO系统调用去检查IO事件是否就绪
- IO多路复用:和阻塞IO不同的是其可以同时阻塞多个IO操作
- 异步IO:进程发起IO系统调用后立即返回,当内核将数据拷贝到缓冲区后,再通知进程,进程可以直接使用数据
四、select、poll、epoll的区别
I/O多路复用就是通过一种机制,可以监视多个文件描述符,一旦某个文件描述符就绪能够通知应用程序进行相应的读写操作
对于高并发场合,采用IO多路复用往往会使得单线程/单进程起到多线程/多进程的效果,并且减小了上下文切换的开销,效率更高!
select、poll、epoll本质都是同步阻塞IO,它们都需要在读写事件就绪后自己负责进行读写
select目前既可以应用在windows系统也可以应用在Linux系统
poll、epoll只能应用在Linux系统
select特征
(1)每次调用select,都需要把fd集合从用户态拷贝到内核态,这个开销在fd很多时会很大
(2)同时每次调用select都需要在内核遍历传递进来的所有fd,这个开销在fd很多时也很大
(3)select支持的文件描述符数量太小了,默认是1024
(4) 时间复杂度:O(n)
poll特征
(1)相比于select,poll采用链表的方式替换原有fd_set数据结构,使其没有文件描述符个数的限制
(2)其余与select相同
epoll特征
(1) epoll只要判断就绪链表是否为空就可,不需要遍历传递进来的所有fd
(2)epoll只要一次拷贝,不需要每次调用都把fd集合拷贝到内核态
(3)epoll没有文件描述符数量限制