深入理解Linux IO复用之epoll

本文深入探讨Linux的IO复用技术,重点解析epoll的原理、优势和实现。从复用技术的背景出发,阐述了epoll如何解决select和poll的局限性,提供更高的并发处理能力。接着,介绍了epoll的API及其底层实现,包括epoll_create、epoll_ctl和epoll_wait。此外,详细讲解了epoll的ET和LT模式,以及ET模式下的线程饥饿问题和解决方案。最后,提到了epoll的惊群问题及其在不同内核版本中的处理方式。
摘要由CSDN通过智能技术生成

0.概述

通过本篇文章将了解到以下内容:

  • I/O复用的定义和产生背景
  • Linux系统的I/O复用工具
  • epoll设计的基本构成
  • epoll高性能的底层实现
  • epoll的ET模式和LT模式

1.复用技术和I/O复用

  • 复用的概念

复用技术(multiplexing)并不是新技术而是一种设计思想,在通信和硬件设计中存在频分复用、时分复用、波分复用、码分复用等,在日常生活中复用的场景也非常多,因此不要被专业术语所迷惑。

从本质上来说,复用就是为了解决有限资源和过多使用者的不平衡问题,且此技术的理论基础是资源的可释放性。

  • 资源的可释放性

举个实际生活的例子:

不可释放场景:ICU病房的呼吸机作为有限资源,病人一旦占用且在未脱离危险之前是无法放弃占用的,因此不可能几个情况一样的病人轮流使用。

可释放场景:对于一些其他资源比如医护人员就可以实现对多个病人的同时监护,理论上不存在一个病人占用医护人员资源不释放的场景。

  • 理解IO复用

I/O的含义:在计算机领域常说的IO包括磁盘IO和网络IO,我们所说的IO复用主要是指网络IO,在Linux中一切皆文件,因此网络IO也经常用文件描述符FD来表示。

复用的含义:那么这些文件描述符FD要复用什么呢?在网络场景中复用的就是任务处理线程,所以简单理解就是多个IO共用1个线程。

IO复用的可行性:IO请求的基本操作包括read和write,由于网络交互的本质性,必然存在等待,换言之就是整个网络连接中FD的读写是交替出现的,时而可读可写,时而空闲,所以IO复用是可用实现的。

综上认为,IO复用技术就是协调多个可释放资源的FD交替共享任务处理线程完成通信任务,实现多个fd对应1个任务处理线程。

现实生活中IO复用就像一只边牧管理几百只绵羊一样:

  • IO复用的设计原则和产生背景

高效IO复用机制要满足:协调者消耗最少的系统资源、最小化FD的等待时间、最大化FD的数量、任务处理线程最少的空闲、多快好省完成任务等。

在网络并发量非常小的原始时期,即使per req per process地处理网络请求也可以满足要求,但是随着网络并发量的提高,原始方式必将阻碍进步,所以就刺激了IO复用机制的实现和推广。

2.Linux中IO复用工具

在Linux中先后出现了select、poll、epoll等,FreeBSD的kqueue也是非常优秀的IO复用工具,kqueue的原理和epoll很类似,本文以Linux环境为例,并且不讨论过多select和poll的实现机制和细节。

  • 开拓者select

select大约是2000年初出现的,其对外的接口定义:

作为第一个IO复用系统调用,select使用一个宏定义函数按照bitmap原理填充fd,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值