深入理解Linux IO复用之epoll

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

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复用系统调

I/O多路转接之epoll 个人笔记 阅读详情

相关推荐

Linux·深入理解IO复用技术之epoll

I/O复用技术 & epoll原理。

m0_64560763的博客 952

EPOLL(C/S模型)实现I/O复用多进程聊天室,通过共享内存、socketpair实现父子进程通信,通过信号量回收进程

非常巧妙的使用共享内存,通过给每个client编号以及BUFFER_SIZE保存需要广播和接受的内容,因为有了编号,所以父子进程的socketpair通信,我们只要传编号就可以表示这个client需要广播的内容了。最后就是里面注册的信号量,父进程不能直接说关闭就关闭,否则没有及时关闭的子进程会变成僵尸进程,所以我们通过注册的信号量来让系统走我们把所以子进程都关闭再关闭自己的逻辑。这里只展示了server端,client端可以用之前的poll写的。

从你的全世界路过 986

Linux Epoll ET模式EPOLLOUT和EPOLLIN触发时刻

Linux Epoll ET模式EPOLLOUT和EPOLLIN触发时刻 ET模式称为边缘触发模式,顾名思义,不到边缘情况,是死都不会触发的。 EPOLLOUT事件: EPOLLOUT事件只有在连接时触发一次,表示可写,其他时候想要触发,那你要先准备好下面条件: 1.某次write,写满了发送缓冲区,返回错误码为EAGAIN。 2.对端读取了一些数据,又重新...

weixin_33675507的博客 573

EPOLL的理解和深入分析

Linux 服务器开发的人肯定了解 select、poll、epoll,他们都是基于事件驱动的IO多路复用技术,而他们之间的区别网上已经有很多的文章了,大家可以去详细的阅读,我在这里主要想写写我对epoll的底层实现的理解。 首先还是先说说 select、poll相比与epoll来说他们效率低下的原因吧: select、poll、epollLinux平台下的IO多路复用技术,适合用来...

爱拍凯特的专栏 1万+

Linux网络编程--使用epoll,共享内存技术实现高性能的聊天室程序

本篇博文主要介绍使用epoll和多进程的共享内存技术实现高性能的聊天室的服务器程序。#include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <assert.h> #include <stdio.h> #include <unistd.h> #include <errno.h> #include <

志存高远 4476

深入理解Linux内核IO复用--epoll

epoll是什么? 提到epoll,我们不得不先去了解IO复用下的另外两个重要的机制:select和poll 先看看Linux内核中这三个函数的定义 select int select(int n,fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout); 函数解释: select 函数监视的文件描述符分别是 writefds、readfds、和 exceptfds。调用select 函数会阻塞,直到有描述

beyond_0818的博客 271

深入理解Linux网络(六):IO 复用 epoll 内部实现

IO复用解决的真正问题是什么?:每次⼀个进程专⻔为了等⼀个 socket 上的数据就得被从 CPU 上拿下来。然后再换上另⼀个进程。等到数据 ready 了,睡眠的进程⼜会被唤醒。总共两次进程上下⽂切换开销,根据之前的测试来看,每⼀次切换⼤约是 3-5 us(微秒)左右。如果是⽹络 IO 密集型的应⽤的话,CPU 就不停地做进程切换这种⽆⽤功。也就是频繁进程上下文切换的开销巨大。

又见南风的博客 1065

## Linux面试问题汇总---- IO复用的三种方法(select,poll,epoll深入理解,包括三者区别,内部原理实现?

IO复用的三种方法(select,poll,epoll深入理解,包括三者区别,内部原理实现? (一)IO复用Linux中的IO模型之一,IO复用就是进程告诉内核需要监视的IO条件,使得内核一旦发现进程指定的一个或多个IO条件就绪,就通过进程处理,从而不会在单个IO上阻塞了,Linux中,提供了select、poll、epoll三种接口来实现IO复用 (二)select: 缺点: 1 单个...

weixin_41563161的博客 1107

对于epoll实现原理的理解

EpollLinux IO的多路复用的机制,是select/poll的增强版本,在Linux内核fs/eventpoll.c中可以查看epoll的具体的实现。

Linuxhus的博客 345

IO问题的本质以及针对不同场景的处置策略

epoll.h中的接口 // /usr/include/x86_64-linux-gnu/sys/epoll.h extern int epoll_create (int __size) __THROW; extern int epoll_create1 (int __flags) __THROW; extern int epoll_ctl (int __epfd, int __op, int __fd, extern int epoll_wait (int __epfd, struct epoll_eve

MIIEo 435

Linux之高级IO

简述Linux5大IO模型 非阻塞IO 非阻塞IO也就是当读取或者写低速设备时候,设备没有准备好的时候,读写函数直接错误返回,表示如果函数继续执行下去,那么将阻塞。 记录锁 记录锁是读写锁的一种扩展类型,可用于亲缘关系或无亲缘关系的进程之间共享某个文件的读与写。被锁住的文件通过文件描述符进行访问,执行上锁的操作函数是fcntl,这种类型的锁通常在内核中维护。  ...

一个菜鸟的博客 1626

图文详解LinuxIO模型和相关技术

阻塞IO模型(Blocking I/O) Linux内核一开始提供了read与write阻塞式操作。 当客户端连接时,会在对应进程的文件描述符目录(/proc/进程号/fd)生成对应的文件描述符(0 标准输入;1 标准输出;2 标准错误输出;),比如 fd 8 , fd 9; 应用程序需要读取的时候,通过系统调用read (fd8)读取,如果数据还没到来,此应用程序的进程或线程会阻塞等待。 man 2 read 概述 #include <unistd.h&g...

Linuxhus的博客 241

四张图,读懂 BIO、NIO、AIO、多路复用 IO 的区别

作者:扛麻袋的少年blog.csdn.net/lzb348110175/article/details/98941378学习之前,我们先来了解一下IO模型:①同步阻塞IO(Blocking...

Java知音 902

IO多路复用

Linux上的IO多路复用方案有三种,select,poll,epoll select poll epoll

M风景的技术博客 351

I/O多路复用

TCP服务端是通过创建进程的方式来处理每一个客户端的连接。当并发量不是很大时,这种处理方式还可以使用。一旦并发量很大,频繁创建的进程会带来巨大的资源消耗以及上下文切换消耗。而IO多路复用技术的核心是减少服务端线程的创建,通过使用较少线程处理所有请求的方式提高整体效率,可以很好的解决这个问题。

weixin_53333929的博客 1033

四图,读懂 BIO、NIO、AIO、多路复用 IO 的区别

点击上方 "编程技术圈"关注,星标或置顶一起成长后台回复“大礼包”有惊喜礼包!每日英文Tough people aren't born that way, the...

程序员小乐 502
上一篇: 生产事故!线上四台机器同一时间全部 OOM
下一篇: Java后端核心面试题在手,学会如何应付面试
JavaMonsterr
博客等级 码龄4年 211粉丝 481原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值