io多路复用
可以解释为,Reactor设计模式,其运用操作系统 底层select poll epoll模型,用户态进行系统调用(select poll epoll),切换为内核态,内核态监听事件返回给用户态应用系统,返回int为监听的几个连接发生了事件变化。

select

select系统调用有一个重要的参数fd文件描述符,即你要监听哪些文件描述符(连接),文件描述符集合rset用一个bitmap位图表示,位图大小为1024,即最多只能监听1024个客户端连接。
当发起系统调用时,会将rset拷贝到内核态,然后内核态监听有没有数据可以处理,监听的所有文件描述符都没有数据的话会一直阻塞,知道有数据,将有数据的fd索引置一,然后返回给用户态。

操作系统根据中断信号感知哪个文件描述符有数据,而用户态应用通过系统调用select获取哪些文件描述符有数据等待处理。
io多路复用_系统调用

poll

Poll工作原理与select基本相同,不同的是将位图改成结构体数组,也有资料说链表,没有了最大1024限制,依然有fd集合的拷贝和O(n)的遍历。
io多路复用_用户态_02

epoll

为了解决fd集合拷贝问题,epoll采用用户态与内核态共享epoll_fds集合,当调用epoll_wait系统调用时,内核态会去检查哪些fd有事件,检查完毕后会将共享的epoll_fds集合重排序,将有事件的fd放在前面,并返回有事件的fd个数。
客户端收到返回个数,就不需要全部遍历,而是直接处理fd集合(红黑树)。
1、创建一个epoll, int epoll_create(int size)

2、注册监听函数int epoll_ctl()

3、等待文件描述符int epoll_wait
io多路复用_用户态_03

io多路复用_文件描述符_04