select、poll、epoll 网络模型比较

1、特点

(1)select
select本质上是通过设置或者检查存放fd标志位的数据结构来进行处理。缺点是:
1)单个进程内一个监听socket可监视的fd数量被限制(可以单进程内通过多线程分别监听多个socket来解决,这里的负载均衡需要自行处理)
2)内核维护一个用来存放大量fd的数据结构(数组),用户空间和内核空间在文件描述符数组时复制消耗大
3 )内核对描述符数组进行遍历检查
(2)poll

本质上跟select类似,有select以上的特点。

只支持水平触发:如果通知了一个fd后,没有被处理,那么下次poll时会再次通知该fd。只要该fd在内核对应缓存有数据就会通知。

实现方式,内核链表存储文件描述符:将用户空间传入描述符数组拷贝到内核空间,查询每个文件描述符(fd)对应的设备状态,如果设备就绪则在设备等待队列中加入并继续遍历,如果遍历完所有fd后没有发现就绪设备,则挂起当前进程,直到设备就绪或者主动超时后唤醒当前进程。

(3)epoll

边缘触发:只告诉进程哪些fd变为就需态,只会通知一次,不管有没有处理,直到下一次接受到数据。

水平触发:通过epoll_ctl注册fd,等到该fd转为就绪状态,内核就会采用回调机制来通知该fd,epoll_wait便可以收到通知,如果没有处理下次epoll_wait会继续通知


2、监听连接数限制

(1)select
FD_SETSIZE宏定义限制大小,是32个整数的大小(在32位的机器上,大小就是32*32,同理64位机器上FD_SETSIZE为32*64,就算是进行修改内核后重新编译内核,但是性能也会受到影响,需要遍历的数组长度增加)。
(2)poll
内核中等待队列是基于链表来存储的(但是遍历的长度会影响性能),没有最大连接数的限制
(3)epoll
有上限(是内存大小的限制),1G内存的监听10万左右的连接(现在的机器上,基本上不需要考虑这限制)

3、访问效率

(1)select
每次调用时内核都会对连接进行线性遍历访问,所以随着FD的增加会造成遍历速度线性下降。
(2)poll
每次调用时内核都会对连接进行线性遍历访问,所以随着FD的增加会造成遍历速度线性下降。
(3)epoll
内核中是根据回调函数来实现通知,只有活跃的socket才会主动调用回调函数。


4、内存拷贝

文件描述符
(1)select
描述符数组被整体复制于用户态和内核地址空间之间(相互传递都会内存拷贝)
(2)poll
描述符数组被整体复制于用户态和内核地址空间之间(相互传递都会内存拷贝)
(3)epoll
使用mmap减少复制开销。
(1)select
内核需要将消息传递到用户空间,都需要内存拷贝
(2)poll
内核需要将消息传递到用户空间,都需要内存拷贝
(3)epoll
epoll通过内核和用户空间共享一块内存来实现的。

消息数据传递

5、综合

一般情况epoll的性能最好(epoll使用内存共享来实现内核监听文件描述符数组和传递数据,不需要内核遍历数组或者链表),但是epoll的通知机制需要函数回调。
在连接数少并且连接都十分活跃的情况下,select和poll的性能可能比epoll好。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值