IO多路复用
IO 多路复用是一种同步IO模型,一个线程可以监视多个文件句柄,一旦某个文件句柄就绪,就能够通知应用程序进行相应的读写操作,没有文件句柄就绪就会阻塞应用程序交出CPU
无需为每个IO操作创建一个线程或进程,没有线程切换的开销
Select
传入需要监听的文件描述符集合,每次select都需要重新初始化一下,因为fd_set会被置位,然后调用select的时候用户态切换到内核态,集合会被拷贝一次,内核会遍历所有的文件描述符看看有没有状态改变的,没有的话会陷入睡眠等待超时时间再次遍历,找到的话会将集合拷贝回用户
fd_set是1024bit组成的位图,由16个long int数组模拟的
内核需要遍历文件描述符
每次初始化fd_set
多次拷贝文件集合
Poll
需要根据监听的文件和事件构造poll数组,然后调用poll拷贝数组传到内核构造poll链表,内核也是遍历链表看看有没有就绪的socket,没有的话就等待事件唤醒或者超时返回,有的话就将链表节点拷贝回用户数组
监听的socket数量没有数据结构的限制
不需要每次构造数组,但每次都需要传入数组
多次拷贝
Epoll
内核通过红黑树来管理监听的文件描述符,不需要每次都拷贝,只用添加一次就行,当监听的socket有事件发生时会被添加到就绪链表中,将就绪链表里面的事件拷贝回用户态数组,没有的话就睡眠等待事件唤醒或者超时退出
减少了用户态到内核态的数据拷贝
用户进程不需要遍历所有的socket