This is my study note of file system startup process.

select

1
2
3
单个进程就可以同时处理多个网络连接IO请求,基本原理就是程序呼叫select,然后整个程序进入阻塞状态,这时候
kernel内核就会轮询检查所有的select负责的文件描述符fd,找到准备好的fd,返回给select并通知系统调用将数据
从kernel内核复制到进程缓冲区。

缺点:

  • 每次调用select都要把fd集合从用户态拷贝到内核态,开销大
  • 每次都要在内核中遍历fd集合,开销大
  • select的描述符数量太少,只有1024

poll

1
2
描述fd集合的方式不同,poll使用的是pollfd结构,select使用fd_set结构,polled是链式结构,因此最大连接数不限。
poll有一个特点是水平触发,即通知fd就绪后,若是这次没有被处理,下次会再次通知就绪。

epoll

  • epoll_create 创建一个epoll对象,并返回fd
  • epoll_ctl 事件注册函数,将需要监听的事件和fd交给epoll
  • epoll_wait 等待注册事件触发或者timeout发生
    1
    2
    3
    4
    epoll没有fd的限制,每个epoll监听一个fd,epoll不需要每次都从用户空间将fd_set复制到内核空间,在使用注册函数的
    时候,fd已经被复制到内核中,不需要每次都重新复制一次,epoll是被动触发方式,创建对应的fd时指明一个回调函数,当
    数据准备好时就会把就绪的fd加入一个就绪队列中,epoll_wait就是查看队列中是否存在就绪的fd,如果有就唤醒队列上的
    等待者,然后调用回调。

简单一句话概括就是poll、select是知道有事件就绪了,但是不知道是哪个事件,而epoll知道事件就绪的同时还知道是哪个
事件发生。