I/O复用模型(select,poll,epoll)

一个线程可以同时监控多个系统IO、并且能够操作多个系统IO的一种技术模型。

一对一Socket模型-->多进程模型-->多线程模型-->I/O多路复用

这三个怎么获取网络事件: 在获取事件时,先把所有连接(文件描述符)传给内核,再由内核返回产生了事件的连接,然后在用户态中再处理这些连接对应的请求即可。

select: 将已连接的 Socket 都放到一个文件描述符集合,然后调用 select 函数将文件描述符集合拷贝到内核里,让内核来检查是否有网络事件产生,检查的方式就是通过遍历文件描述符集合的方式,当检查到有事件产生后,将此 Socket 标记为可读或可写, 接着再把整个文件描述符集合拷贝回用户态里,然后用户态还需要再通过遍历的方法找到可读或可写的 Socket,然后再对其处理。所以需要两次遍历,两次拷贝。

poll:select用BitsMap表示文件描述符,个数有限,一般1024个;poll用的是动态数组,以链表形式来组织,突破了 select 的文件描述符个数限制,当然还会受到系统文件描述符限制。两者没有本质区别,都用线性结构储存Socket,都需要遍历来找,时间复杂度为O(n),在用户态和内核态之间拷贝fd集合,随着并发数上了,性能的损耗会呈指数级增长。

--select和poll都只能工作在相对低效的LT模式下,而epoll同时支持LT和ET模式。

--当监测的fd数量较小,且各个fd都很活跃的情况下,建议使用select和poll;当监听的fd数量较多,且单位时间仅部分fd活跃的情况下,使用epoll会明显提升性能。

epoll:

1.epoll 在内核里维护一个红黑树,用来跟踪进程所有待检测的文件描述符, 所以只需要传入一个待检测的 socket(添加时执行一个系统调用),减少了内核和用户空间大量的数据拷贝和内存分配。可以突破最大文件上限。

2.epoll 使用事件驱动的机制,内核里维护了一个链表来记录就绪事件,当某个socket有事件发生时,通过回调函数内核会将其加入到就绪事件列表中,当用户调用 epoll_wait() 函数时,仅仅观察这个list链表里有没有数据即可。不需要像 select/poll 那样轮询扫描整个 socket 集合,大大提高了检测的效率。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值