缩写释义:
io:input/output 输入输出
fd: file descriptor 文件描述符,一个用于标识打开文件或网络连接的整数,系统为进程打开的每个文件保留一个文件描述符,可以用于读写文件
IO模型的分类:
分为同步IO和异步IO。
同步IO:用户发起IO,用户阻塞或轮训的查看是否就绪,就绪后用户进行内核态到用户态的数据拷贝。
异步IO:用户发起IO,数据是否就绪以及数据拷贝的过程全交给内核,当IO完成时内核通知用户。
同步IO分为阻塞IO、非阻塞IO、信号驱动型IO、多路复用型IO。
阻塞IO:用户发起IO后,若数据还未就绪,该线程就一直阻塞等待着数据的就绪。
非阻塞IO:用户发起IO后,若数据还未就绪,该线程不会阻塞,而是继续向后执行代码,所以需要配合循环来一直检查数据是否就绪,而这也叫做轮询。
信号驱动型IO:用户发起IO后,若数据还未就绪,该线程不会阻塞,而是继续向后执行代码,由内核来检查数据是否就绪,当数据就绪时,内核通知用户。
多路复用型IO:由一个线程来监视(等待数据就绪)多个fd,当某个fd上的数据就绪时,就通知用户。特点:多个io 复用一个后台处理进程
linux 内核提供的io多路复用方式:
- selector
selector 底层使用的是位图,需要轮询检查哪些fd就绪,效率较低。
单个线程能够监视的文件描述符的数量就是固定的(centos7.6上是1024个)。 - poll
每次调用都会将fds从内核态拷贝到用户态;
底层也是采用轮询的方式来检测文件描述符是否就绪,效率较低。 - epoll
可以创建多个epoll 池,epoll 池添加 fd 的时候设置回调方法,就绪后放入队列
使用红黑树维护监视的fd,查询效率稳定
fd就绪后,使用双向链表实现的队列,维护就绪链表,存 就绪状态的epitem,一个 epitem 对应 一个fd
refer:
https://cloud.tencent.com/developer/article/1857255
https://blog.csdn.net/qq_67569905/article/details/132979203