IO多路复用--[select | poll | epoll | Reactor]
因为在简历上写了netty的项目,因此还是将网络底层的那点东西搞清楚。
首先希望明确的是,BIO、NIO、IO多路复用这是不同的东西, 我会在本文中详细讲出来。
本文参考资料:
JAVA IO模型
IO多路复用 select poll epoll介绍
从BIO到epoll
UNIX网络编程 推荐看一下
1. BIO与NIO
在一次输入操作中,有两个不同的阶段:
- 等待内核态的数据准备完毕。(比如说输入操作是读取磁盘,那么我们需要等待磁盘寻址、加载到内存,这些过程就是数据准备阶段)
- 将内核态的数据拷贝到用户态。(在数据准备完毕后,为了用户态的程序使用,需要将内核态的数据拷贝给用户态,这个阶段用时很小)。
BIO的读取流程

BIO的读取流程很简单,对于每一个进行读取操作的线程,线程从接受这个读取请求到最终将数据返回用户态的整个过程都是阻塞的。举个小例子,如果使用BIO读取磁盘文件,那么读取线程在 {等待磁盘寻址、页加载等数据准备流程,最终将数据从内核态拷贝到用户态} 这整个流程中都是被阻塞的。
NIO的读取流程

在BIO中,阻塞操作极大地影响了线程的利用率:线程在准备数据阶段无事可做,但是却不能抽身去处理其他的IO操作。因此NIO就是解决这个事情,NIO在接收IO请求时,并不会在数据处理阶段阻塞住,而是不断地询问这个文件描述符:你的数据准备好了吗。如果准备好了的话那么就将数据从内核态拷贝到用户态,然后返回。
可以看出,NIO并不是在全过程都是非阻塞的,而是在数据准备阶段非阻塞,在数据拷贝阶段阻塞。但是由于数据拷贝阶段时间很短,因此几乎相当于非阻塞。
上面这么说有点抽象,我们来聊一聊怎么使用NIO去进行读取。
- 假设说我们现在有100个客户端连接,在linux中一切即文件,因此我们具有100个文件描述符
fd。 - 我们在一个
while循环中不断地遍历这100个fd,去查看其数据是否准备好,一旦准备好了,那么就进行数据拷贝阶段,这个fd的IO过程随之结束。如果没有准备好,我们继续对其遍历。 - 写成代码格式就是这样:
// 具有一系列文件描述符
fds = [fd1, fd2...]while(true){for (fd in fds){// 判断fd中的数据是否准备完毕// 这个过程会涉及系统调用,因为文件描述符是内核态的东西boolean ready = is_ready(fd)if (ready){// 进行数据拷贝等一系列操作}}
}
2. IO多路复用
通过上面的BIO代码我们可以看出,遍历文件描述符这个操作是用户态完成的,在每一次循环过程中,我们都需要对每个fd进行一次系统调用,当我们有100个fd时,每次遍历文件描述符就需要100次系统调用,在用户态到内核态进行切换是很耗费资源的。
那么用户态能解决这个事情吗?肯定是不行的,因此从上个实际80年代开始,unix就开始逐渐提供select, poll, epoll等机制,在内核态去遍历文件描述符。这三个机制实现细节有些差异,但是整体流程都是:用户态接受到文件描述符,将文件描述符的列表fds交给内核态,进行系统调用,内核态完成文件描述符的遍历,将数据准备就绪的文件描述符返回给用户态。因此,一次遍历从之前的100次系统调用就减少为1次系统调用。
因此IO多路复用,复用的是什么?复用的实际上是系统调用,从之前的一次系统调用判断一个文件描述符,变成了一次系统调用判断整个文件描述符列表。
Reactor
这部分内容较多,详见下一篇文章
相关文章:
IO多路复用--[select | poll | epoll | Reactor]
因为在简历上写了netty的项目,因此还是将网络底层的那点东西搞清楚。 首先希望明确的是,BIO、NIO、IO多路复用这是不同的东西, 我会在本文中详细讲出来。 本文参考资料: JAVA IO模型 IO多路复用 select poll epoll介绍 从BIO到epo…...
pod的requests、limits解读、LimitRange资源配额、Qos服务质量等级、资源配额管理 Resource Quotas
前言 环境:k8s-v1.22.17 docker-20.10.9 centos-7.9 目录前言什么是可计算资源CPU、Memory计量单位pod资源请求、限额方式pod定义requests、limits查看节点资源情况pod使用request、limits示例LimitRange限制命名空间下的pod的资源配额Qos服务质量等级资源配额管理…...
R语言基础(六):函数
R语言基础(一):注释、变量 R语言基础(二):常用函数 R语言基础(三):运算 R语言基础(四):数据类型 R语言基础(五):流程控制语句 7. 函数 函数是一组完成特定功能的语句。 7.1 内置函数 R语言系统中提供许多内置函数&…...
[C++] 简单序列化
前言 序列化(Serialization) 是将对象的状态信息转换为可以存储或传输的形式的过程。在序列化期间,对象将其当前状态写入到临时或持久性存储区。以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象。 使用 序列化 std::array&…...
Autosar Configuration(十三)SomeIP之配置TCP/IP
本系列教程是根据实际项目开发中总结的经验所得,如发现有不对的地方,还请指正。 目录Autosar Configuration(一)Davinci Developer-工具介绍 Autosar Configuration(二)Davinci Developer-SWC配置 Autosar Configuration(三) Security之Crypto配置 Autosar Configurat…...
滤波算法 | 无迹卡尔曼滤波(UKF)算法及其Python实现
文章目录简介UKF滤波1. 概述和流程2. Python代码第一个版本a. KF滤波b. UKF滤波第二个版本简介 上一篇文章,我们介绍了UKF滤波公式及其MATLAB代码。在做视觉测量的过程中,基于OpenCV的开发包比较多,因此我们将UKF的MATLAB代码转到python中&a…...
IMU 积分的误差状态空间方程推导
文章目录0. 前言1. 离散时间的IMU运动学方程2. 状态变量定义3. 补充公式4. IMU误差状态空间方程推导4.1. 旋转误差 δr^i1\delta\hat{\mathbf{r}}_{i1}δr^i14.2. 速度误差 δv^i1\delta\hat{\mathbf{v}}_{i1}δv^i14.3. 平移误差 δpi1\delta \mathbf{p}_{i1}δpi14.4. …...
VirtualBox的克隆与复制
快照太多,想整合成1个文件怎么办? 最近,我就遇到一个问题。快照太多了。比较占用空间怎么办? 错误做法 一开始,我是这么操作的,选中某个快照,然后选择删除…然后我登录虚拟机后,发…...
每天5分钟玩转机器学习算法:逆向概率的问题是什么?贝叶斯公式是如何解决的?
本文重点 前面我们已经知道了贝叶斯公式,以及贝叶斯公式在机器学习中的应用,那么贝叶斯公式究竟解决了一个什么样的问题呢?贝叶斯是为了解决逆向概率的问题。 正向的概率和逆向的概率 正向概率:假设袋子里面有N个白球,有M个黑球,你伸手一摸,那么问题就是你摸出黑球的概…...
游戏闲聊之游戏是怎么赚钱的
其实一般情况下不太爱写这种文章,简单说就一点,这个行业的人我惹不起。 1、外挂 所谓外挂,是指通过技术手段,提供辅助游戏的工具,方便玩家获得一些额外的能力; 这事我特意咨询过律师,外挂分两…...
Redis高频面试题汇总(下)
目录 1.Redis中什么是Big Key(大key) 2.Big Key会导致什么问题 3.如何发现 bigkey? 4.为什么redis生产环境慎用keys *命令 5.如何处理大量 key 集中过期问题 6.使用批量操作减少网络传输 7.缓存穿透 8.缓存击穿 9.缓存雪崩 10.缓存污染(或满了…...
Windows修改Docker安装目录修改Docker镜像目录,镜像默认存储位置存放到其它盘
Windows安装Docker,默认是安装在C盘,下载镜像后会占用大量空间,这时需要调整镜像目录;场景:不想连服务器或者没有服务器,想在本地调试服务,该需求就非常重要。基于WSL2安装docker后,…...
376. 摆动序列——【Leetcode每日刷题】
376. 摆动序列 如果连续数字之间的差严格地在正数和负数之间交替,则数字序列称为 摆动序列 。第一个差(如果存在的话)可能是正数或负数。仅有一个元素或者含两个不等元素的序列也视作摆动序列。 例如, [1, 7, 4, 9, 2, 5] 是一个…...
mgre实验
实验思路 1、首先根据拓扑结构合理分配IP地址,并对各个路由器的IP地址和R5环回接口的IP地址进行配置。 2、让私网中的边界路由器对ISP路由器做缺省路由。 3、根据实验要求,对需要配置不同类型认证的路由器进行认证配置,和需要不同封装的协议…...
一文彻底了解Zookeeper(介绍篇)
zookeeper 是什么? zookeeper是一个分布式协作框架,提供高可用,高性能,强一致等特性 zookeeper 有哪些应用场景? 分布式锁:分布式锁是指在分布式环境中,多个进程或线程需要互斥地访问某个共享…...
1. ELK Stack 理论篇之什么是ELK Stack?
ELK Stack 理论篇之什么是ELK Stack?1.1 什么是 ELK Stack?1.2 ELK Stack的发展史1.2.1 Elasticsearch1.2.2 引入 Logstash 和 Kibana,产品更强大1.2.3 社区越来越壮大,用例越来越丰富1.2.4 然后我们向 ELK 中加入了 Beats1.2.5 那么&#x…...
两道有关链表的练习
目录 一、分割链表 二、奇偶链表 一、分割链表 给你一个链表的头节点 head 和一个特定值 x ,请你对链表进行分隔,使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前。 你不需要 保留 每个分区中各节点的初始相对位置。 示例 1: 输…...
Python uiautomator2安卓自动化测试
一、前言 uiautomator2是Python对Android设备进行UI自动化的库,支持USB和WIFI链接,可以实现获取屏幕上任意一个APP的任意一个控件属性,并对其进行任意操作。 重点是它可以实现安卓自动化采集,甚至是群控采集,且安装和…...
Leetcode. 160相交链表
文章目录指针解法指针解法 核心思路 : 先 分别求两个链表的长度 然后长的链表先走 差距步(长-短) 最后长链表和短链表同时走 ,第一地址相同的就是交点 ,注意一定是地址相同 不可能出现上图这种情况 ,因为C1…...
MDPs —— 马尔可夫决策定义与算法
文章目录MDPs 定义——由实例开始时序决策问题给游戏增点乐子*为什么要有折扣游戏的解——原则所以,什么是 MDPs?MDPs 的基本原理、表示光环原理效用的求解是反向传播的原则不变条件MDPs 的表示MDPs 求解效用迭代法缺点原则迭代法MDPs 定义——由实例开始…...
Z-Image-Turbo-rinaiqiao-huiyewunv保姆级教程:如何将本地Turbo模型接入Discord Bot提供绘图服务
Z-Image-Turbo-rinaiqiao-huiyewunv保姆级教程:如何将本地Turbo模型接入Discord Bot提供绘图服务 你是不是也想过,让自己的Discord服务器里有一个专属的“画师”?当群友描述一个二次元角色时,这个Bot就能立刻画出来,而…...
保姆级教程:用PyTorch从零搭建联邦学习MNIST实验环境(附完整代码)
联邦学习实战:PyTorch搭建MNIST实验环境全流程解析 1. 联邦学习与MNIST实验概述 联邦学习作为一种分布式机器学习范式,正在重塑传统模型训练的方式。不同于集中式训练,联邦学习允许多个客户端在保持数据本地化的前提下协作训练模型࿰…...
STM32单片机NRST管脚异常复位问题解析与EMC设计优化
1. STM32单片机NRST管脚异常复位问题解析最近在客户现场遇到一个棘手的STM32G474单片机异常复位问题,发生在EMS浪涌测试过程中。作为嵌入式开发者,复位问题往往是最让人头疼的故障之一。今天我就把这个案例的完整排查过程和解决方案分享给大家࿰…...
LongCat-Video-Avatar 正式发布,实现开源SOTA级拟真表现
在技术领域,我们常常被那些闪耀的、可见的成果所吸引。今天,这个焦点无疑是大语言模型技术。它们的流畅对话、惊人的创造力,让我们得以一窥未来的轮廓。然而,作为在企业一线构建、部署和维护复杂系统的实践者,我们深知…...
如何用 Kinovea 实现专业运动分析?免费视频解析工具完全指南
如何用 Kinovea 实现专业运动分析?免费视频解析工具完全指南 【免费下载链接】Kinovea Video solution for sport analysis. Capture, inspect, compare, annotate and measure technical performances. 项目地址: https://gitcode.com/gh_mirrors/ki/Kinovea …...
AI手势识别效果展示:彩虹骨骼惊艳可视化,21个关键点精准定位
AI手势识别效果展示:彩虹骨骼惊艳可视化,21个关键点精准定位 1. 引言:手势识别的视觉革命 想象一下,只需对着摄像头比个手势,就能控制智能家居、玩转AR游戏或者进行远程教学互动。这一切的核心技术就是手势识别。传统…...
如何让10美元鼠标超越苹果触控板:Mac Mouse Fix终极指南
如何让10美元鼠标超越苹果触控板:Mac Mouse Fix终极指南 【免费下载链接】mac-mouse-fix Mac Mouse Fix - Make Your $10 Mouse Better Than an Apple Trackpad! 项目地址: https://gitcode.com/GitHub_Trending/ma/mac-mouse-fix 你是否曾经为macOS对第三方…...
Baichuan-7B模型压缩终极指南:如何在保持性能的同时大幅减小模型体积
Baichuan-7B模型压缩终极指南:如何在保持性能的同时大幅减小模型体积 【免费下载链接】Baichuan-7B A large-scale 7B pretraining language model developed by BaiChuan-Inc. 项目地址: https://gitcode.com/gh_mirrors/ba/Baichuan-7B Baichuan-7B是由百川…...
ShortURL MCP 集成指南
在今天的数字时代,短链接的生成和管理变得越来越重要。Ace Data Cloud 提供的 ShortURL MCP 服务器,利用 MCP (模型上下文协议),允许 AI 模型(如 Claude、GPT 等)通过标准化接口调用外部工具,从而更加便利地…...
OpenClaw备份自动化:Qwen3-4B-Thinking-2507-GPT-5-Codex-Distill-GGUF智能分类归档云端文件
OpenClaw备份自动化:Qwen3-4B-Thinking-2507-GPT-5-Codex-Distill-GGUF智能分类归档云端文件 1. 为什么需要智能文件归档 我的电脑桌面常年堆积着各种临时下载的PDF、会议记录、代码片段和截图。每次想找特定文件时,要么靠记忆模糊搜索,要么…...
