epoll和select的区别

首先得了解epoll的三大关键要素:mmap、红黑树、链表
1、mmap将用户空间的一块地址和内核空间的一块地址同时映射到相同的一块物理内存地址(不管是用户空间还是内核空间都是虚拟地址,最终要通过地址映射映射到物理地址),使得这块物理内存对内核和对用户均可见,减少用户态和内核态之间的数据交换
2、epoll在实现上采用红黑树去存储所有套接字,当添加或者删除一个套接字时(epoll_ctl),都在红黑树上去处理,红黑树本身插入和删除性能比较好。
3、一旦有事件发生,epoll就会将该事件添加到双向链表中。那么当我们调用epoll_wait时,epoll_wait只需要检查双向链表中是否有存在注册的事件。
简单来说,epoll利用mmap来减少空间拷贝,利用红黑树来存储所有的套接字,而将活动的套接字放入双向链表。

epoll和select的区别,也可以说是epoll的优点:
1、最大并发数限制
select 最不能忍受的是一个进程所打开的FD是有一定限制的,由FD_SETSIZE设置,默认值是1024;
epoll则没有这个限制,它所支持的FD上限是最大可以打开文件的数目,在1GB内存的机器上大约是10万左右。
2、内核/用户空间内存拷贝
select,每次调用都需要把fd集合从用户态拷贝到内核态,这个开销在fd很多时会很大;
每次注册新的事件到epoll句柄中时,会把所有的fd拷贝进内核,从而epoll保证了每个fd在整个过程中只会拷贝一次。
3、效率
select每次调用都会线性扫描全部的集合,导致效率呈现线性下降。
而epoll只在“醒着”的时候只要判断一下就绪链表是否为空就行了。

你可能感兴趣的:(C++笔记)