epoll的底层实现机制

本文详细介绍了epoll_create()、epoll_ctl()和epoll_wait()三个关键函数的工作原理。epoll_create()用于创建内核事件表,通过ep_getfd()、ep_file_init()等函数分配和初始化相关结构。epoll_ctl()则负责向内核事件表添加、修改或移除事件,通过回调函数管理描述符的就绪状态。最后,epoll_wait()检查并获取就绪事件,讨论了ET和LT两种模式的区别,ET模式确保所有数据都被用户接收,而LT模式可能会丢失数据。
摘要由CSDN通过智能技术生成

1 .epoll_create() //创建内核事件表 容纳事件的容器

2.epoll_ctl() // 向内核事件表中 添加、修改、移除 事件

3.epoll_wait() // 检查获取就绪事件

 

首先谈一谈epoll_create()

sys_epoll_create是创建一个新的内核事件表,分别通过ep_getfd()、ep_file_init()函数分配struct file、fd、struct inode,并创立起关联。

  • 2
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
epoll是一个在Linux内核中提供的I/O事件通知机制,采用了事件驱动的方式,用于高效处理大量的并发连接。它与select和poll相比有以下区别: 1. 底层实现epoll在内核中使用红黑树(红黑树是一种自平衡的二叉搜索树)来存储和管理文件描述符,以及相应的事件。而select和poll则是通过遍历一个事件集合进行查询。 2. 打开的文件描述符数量限制:select和poll都将所有的文件描述符拷贝到内核空间中,因此有一个最大限制值(FD_SETSIZE),默认为1024(可以通过修改宏定义来改变)。而epoll没有这个限制,它采用事件驱动的方式,在注册的文件描述符上有事件发生时才进行通知,因此没有限制。 3. 效率:由于epoll采用事件驱动的方式,只有在有事件发生时才进行通知,因此能够大大提高效率,减少了遍历文件描述符的开销。而select和poll则在调用时需要遍历整个事件集合,效率较低。 4. 内存拷贝:select和poll在每次调用时都需要将所有监视的文件描述符集合拷贝到内核中,而epoll只需要在开始时注册,并且不需要拷贝。 5. 高并发支持:由于epoll采用事件驱动的方式,能够更好地处理大量并发连接。而select和poll则在大量文件描述符时会有性能下降的问题。 综上所述,epoll可以更高效地处理大量并发连接,并且没有文件描述符数量限制,相比之下select和poll的性能较低,且有文件描述符数量限制。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值