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的内核和用户空间共享一块内存,因此内存态数据和用户态数据是共享的
杜绝秃头!!!