当前位置: 首页 > news >正文

IO多路复用--[select | poll | epoll | Reactor]

因为在简历上写了netty的项目,因此还是将网络底层的那点东西搞清楚。
首先希望明确的是,BIO、NIO、IO多路复用这是不同的东西, 我会在本文中详细讲出来。
本文参考资料:
JAVA IO模型
IO多路复用 select poll epoll介绍
从BIO到epoll
UNIX网络编程 推荐看一下

1. BIO与NIO

在一次输入操作中,有两个不同的阶段:

  1. 等待内核态的数据准备完毕。(比如说输入操作是读取磁盘,那么我们需要等待磁盘寻址、加载到内存,这些过程就是数据准备阶段)
  2. 将内核态的数据拷贝到用户态。(在数据准备完毕后,为了用户态的程序使用,需要将内核态的数据拷贝给用户态,这个阶段用时很小)。
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^i1​4.2. 速度误差 δv^i1\delta\hat{\mathbf{v}}_{i1}δv^i1​4.3. 平移误差 δpi1\delta \mathbf{p}_{i1}δpi1​4.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 定义——由实例开始…...

调用支付宝接口响应40004 SYSTEM_ERROR问题排查

在对接支付宝API的时候,遇到了一些问题,记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...

智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql

智慧工地管理云平台系统,智慧工地全套源码,java版智慧工地源码,支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求,提供“平台网络终端”的整体解决方案,提供劳务管理、视频管理、智能监测、绿色施工、安全管…...

STM32+rt-thread判断是否联网

一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...

Golang dig框架与GraphQL的完美结合

将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用,可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器,能够帮助开发者更好地管理复杂的依赖关系,而 GraphQL 则是一种用于 API 的查询语言,能够提…...

macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用

文章目录 问题现象问题原因解决办法 问题现象 macOS启动台(Launchpad)多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显,都是Google家的办公全家桶。这些应用并不是通过独立安装的…...

【Go】3、Go语言进阶与依赖管理

前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课,做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程,它的核心机制是 Goroutine 协程、Channel 通道,并基于CSP(Communicating Sequential Processes&#xff0…...

论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)

笔记整理:刘治强,浙江大学硕士生,研究方向为知识图谱表示学习,大语言模型 论文链接:http://arxiv.org/abs/2407.16127 发表会议:ISWC 2024 1. 动机 传统的知识图谱补全(KGC)模型通过…...

【Java学习笔记】BigInteger 和 BigDecimal 类

BigInteger 和 BigDecimal 类 二者共有的常见方法 方法功能add加subtract减multiply乘divide除 注意点:传参类型必须是类对象 一、BigInteger 1. 作用:适合保存比较大的整型数 2. 使用说明 创建BigInteger对象 传入字符串 3. 代码示例 import j…...

基于PHP的连锁酒店管理系统

有需要请加文章底部Q哦 可远程调试 基于PHP的连锁酒店管理系统 一 介绍 连锁酒店管理系统基于原生PHP开发,数据库mysql,前端bootstrap。系统角色分为用户和管理员。 技术栈 phpmysqlbootstrapphpstudyvscode 二 功能 用户 1 注册/登录/注销 2 个人中…...

脑机新手指南(七):OpenBCI_GUI:从环境搭建到数据可视化(上)

一、OpenBCI_GUI 项目概述 (一)项目背景与目标 OpenBCI 是一个开源的脑电信号采集硬件平台,其配套的 OpenBCI_GUI 则是专为该硬件设计的图形化界面工具。对于研究人员、开发者和学生而言,首次接触 OpenBCI 设备时,往…...