多路复用之epoll

本文详细介绍了为什么使用epoll代替select和poll,并解释了epoll的水平触发和边缘触发两种模式。此外,还阐述了epoll的工作原理,包括epoll_create、epoll_ctl和epoll_wait的用法,以及epoll如何提高高并发场景下的性能。
摘要由CSDN通过智能技术生成

一、为什么要用epoll?
在高并发的情况下,我们可以在服务器端用多路复用的方法来处理,具体的多路复用方法有select(),poll()和epoll()。但与epoll()相比,select()和poll()都有一些比较明显的缺点,其具体的缺点如下:
1.select()中单个进程所能监视的文件描述符存在限制,通常是1024个;并且select()采用轮询的方式扫描文件描述符,文件描述符越多,其性能越差。
2.内核/用户文件拷贝问题,select()需要复制大量的句柄数据结构。
3.select()采用水平触发方式。
4.select()的返回值是含有整个句柄的数组,需要遍历整个数组才能才能知道是哪些文件句柄发生了变化。
poll()与select()相比,其采用链表的方式来保存文件描述符,所以就没有了文件描述符数量的限制,但其余三个缺点还存在。
epoll是Linux系统下select()和poll()的加强版本,它主要有以下优点:
1.显著提高程序在大量并发的情况下只有少量活跃的系统CPU利用率。
2.无需遍历整个被监听的描述符集,只需遍历被内核IO事件异步唤醒而加入READY队列的描述符集,显著提高了性能。
epoll不仅提供了水平触发,还提供了边缘触发。
LT(level triggered):是默认的工作发式,内核会告诉你当前有哪些文件描述符已经处于就绪状态,然后你就可以对这些文件描述符进行相应的操作,如果不对这些已经就绪的文件描述符做出操作,内核还是会继续通知你,所以在这种工作方式下,出错的概率就会小一些。
ET(edge triggered):边缘触发方式,当一个文件描述符处于就绪状态时,内核就会通过epoll来告诉你,并假设你已经知道这个文件描述符处于就绪态,接下来也就不会再通知你关于这个文件描述符的信息,知道你做出了一些操作改变了这个文件描述符的状态将其变为未就绪态,但是,如果你并没有将这个文件描述符变为未就绪态,内核也就不会再通知你关于这个文件描述符你还未做出操作的信息了。
所以,我们可以将LT模式理解为,在LT模式下,事件不会丢弃,只要读buffer里有数据就会不断的让用户读。而ET模式只会在事件开始发生的时候通知你,所以你可能会错过这个通知。

二.epoll的原理及实现
epoll的设计及实现与select不同,epoll通过在内核建立一个简易的文件系统。其将select()/poll()的调用分成了三个部分。
1.int epoll_create(int size);
调用epoll_create()函数创建了一个epoll对象,在epoll文件系统中为这个epoll对象分配资源。此时epoll对象的兴趣列表为空。
2.epoll_ctl(epoll_fd,op,fd,&events)
向epoll对象中添加连接的套接字,修改(一般是添加,删除)epoll对象的兴趣列表。
3.epoll_wait()
收集已经发生事件的连接。

所以,我们先可以创建一个epoll对象,然后再修改其兴趣列表,最后通过epoll_wait()来收集已经发生事件的连接,注意,epoll_wait()并没有遍历所有的连接。

创建一个epoll实例:

int	epoll_create(int	size)

epoll_create()是系统调用,用户态会切换到内核态,该系统调用会新建一个epoll对象,此时该epoll()对象的兴趣列表为空,如果成功&

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值