IO多路复用机制:select、poll、epoll的区别

IO多路复用机制:select、poll、epoll的区别

1.单个进程打开的文件描述符(fd文件句柄)不一致

​ select :有最大连接数限制数为1024,单个进程所能打开的最大连接数由FD_ZETSIZE宏定义。

​ poll:poll本质上与select没有区别,但是它没有最大连接数的限制,原因是它是基于链表来存储的。

​ epoll:虽然连接有上限,但是很大,1G内存的机器可以打开10万左右的连接,以此类推。

2.监听Socket的方式不一致

select :轮询的方式,一个一个的socket检查过去,发现有socket活跃时才进行处理,当线性socket增多时,轮询的速度将会变得很慢,造成线性造成性能下降问题。

poll:对select稍微进行了优化,只是修改了文件描述符,但是监听socket的方式还是轮询。

expoll:epoll内核中实现是根据每个fd上的callback函数来实现的,只有活跃的socket才会主动调用callback,通知expoll来处理这个socket。(会将连接的socket注册到epoll中, 相当于socket的花名册, 如果有一个socket活跃了, 会回调一个函数, 通知epoll,赶紧过来处理)

3.内存空间拷贝方式(消息传递方式)不一致

select:内核想将消息传递到用户态,需要将数据从内核态拷贝到用户态,这个过程非常的耗时

poll:同上

epoll:epoll的内核和用户空间共享一块内存,因此内存态数据和用户态数据是共享的

原文地址:https://www.cnblogs.com/846617819qq/p/10973862.html