select、poll、epoll等系统调用都是IO多路复用的操作系统层面的实现机制。IO多路复用是一种同步非阻塞的网络IO模型,“复用”是指通过对一个线程的复用使其能够同时监视多个文件描述符,若某个文件描述符就绪则通知相关线程进行相应的读写操作。
总的来说,select和poll的实现相似,但select/poll的一些固有缺陷导致它的应用受到了很大的限制,为了克服select/poll的缺点,epoll作了很多重大改进:
- epoll支持一个进程打开的socket描述符(FD)不受限制
select/poll最大的缺陷是单个线程所打开的的FD是有一定限制的,默认是1024。epoll所支持的FD上限是操作系统的最大文件句柄数,例如,1G内存的机器上大约是10万个句柄左右。
- IO效率不会随着FD数目的增加而线性下降
select/poll的另一个致命缺陷是每次调用都会线性扫描全部的FD集合,导致效率呈现线性下降。但大多数时刻只有少部分的FD是活跃的,因此会造成性能损失。二poll实现了一个伪AIO,它只会针对活跃的FD进行操作,通过每个FD上面的callback函数实现。
每日学习笔记,写于2020-05-17 星期日