? select :有最大连接数限制数为1024,单个进程所能打开的最大连接数由FD_ZETSIZE宏定义。
? poll:poll本质上与select没有区别,但是它没有最大连接数的限制,原因是它是基于链表来存储的。
? epoll:虽然连接有上限,但是很大,1G内存的机器可以打开10万左右的连接,以此类推。
select :轮询的方式,一个一个的socket检查过去,发现有socket活跃时才进行处理,当线性socket增多时,轮询的速度将会变得很慢,造成线性造成性能下降问题。
poll:对select稍微进行了优化,只是修改了文件描述符,但是监听socket的方式还是轮询。
expoll:epoll内核中实现是根据每个fd上的callback函数来实现的,只有活跃的socket才会主动调用callback,通知expoll来处理这个socket。(会将连接的socket注册到epoll中, 相当于socket的花名册, 如果有一个socket活跃了, 会回调一个函数, 通知epoll,赶紧过来处理)
select:内核想将消息传递到用户态,需要将数据从内核态拷贝到用户态,这个过程非常的耗时
poll:同上
epoll:epoll的内核和用户空间共享一块内存,因此内存态数据和用户态数据是共享的
原文:https://www.cnblogs.com/846617819qq/p/10973862.html