IO多路复用select epoll

IO多路复用一个进程维护多个Socket。类似CPU并发。

多路复用接口 select/poll/epoll ,内核提供给⽤户态的多路复用系统调用,进程可以通过⼀个系统调用函数从内核中获取多个事件

1、select:

把已连接的socket放在一个文件描述符集合,调用 select 函数将⽂件描述符集合拷贝到内核⾥,让内核来检查是否有网络事件产⽣。

通过遍历,有事件产生就把此socket标记为可读/可写,然后再整个拷贝会用户态,用户态还需要遍历找到刚刚标记的socket。两次遍历+两次拷贝。

2、poll:

动态数组,以链表形式来组织,突破了select 的⽂件描述符个数限制,当然还会受到系统文件描述符限制。

3、epoll :

  • 在内核里使用红黑树来跟踪进程所有待检测的文件描述字。把需要监控的 socket 通过epoll_ctl()函数加⼊内核中的红⿊树⾥。红黑树的增删查时间复杂度是O(logn),不需要每次操作都传入整个集合,只需要传入一个待检测的socket。减少了内核和用户空间的大量数据拷贝和内存分配。
  • epoll 使用事件驱动的机制,内核里维护了⼀个链表来记录就绪事件

当某个 socket 有事件发生时,通过回调函数内核会将其加⼊到这个就绪事件列表中,当用户调用 epoll_wait() 函数时,只会返回有事件发生的文件描述符的个数,不需要像 select/poll 那样轮询扫描整个 socket 集合,大大提高了检测的效率。

epoll支持的事件触发模式:①边缘触发ET②水平触发LT。

  • 使用边缘触发模式时,当被监控的 Socket 描述符上有可读事件发生时,服务器端只会从 epoll_wait中苏醒⼀次,即使进程没有调用 read 函数从内核读取数据,也依然只苏醒⼀次,因此我们程序要保证⼀次性将内核缓冲区的数据读取完;
  • 使用水平触发模式时,当被监控的 Socket 上有可读事件发⽣时,服务器端不断地从 epoll_wait中苏醒,直到内核缓冲区数据被 read 函数读完才结束,目的是告诉我们有数据需要读取;

水平触发的意思是只要满足事件的条件,比如内核中有数据需要读,就⼀直不断地把这个事件传递给用户;
边缘触发的意思是只有第⼀次满足条件的时候才触发,之后就不会再传递同样的事件了。

select和epoll的区别

  • select和poll采用轮询的方式检查就绪事件,每次都要扫描整个文件描述符,复杂度O(N);epoll采用回调方式检查就绪事件,只会返回有事件发生的文件描述符的个数,复杂度O(1)
  • select只工作在低效的LT模式,epoll可以在ET高效模式工作。
  • epoll是Linux所特有,而select则应该是POSIX所规定,一般操作系统均有实现
  • select单个进程可监视的fd数量被限制,即能监听端口的大小有限,64位是2048;epoll没有最大并发连接的限制,能打开的FD的上限远大于2048(1G的内存上能监听约10万个端口)
  • select:内核需要将消息传递到用户空间,都需要内核拷贝动作;epoll通过内核和用户空间共享一块内存来实现的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值