io本质+io效率本质,5种io模型(介绍,异步/同步区别,阻塞/非阻塞区别)

news2024/9/20 18:39:23

目录

5种io模型

io引入

io的本质

io效率的本质

模型引入

以钓鱼为例

效率最高的方式

异步io和同步io的区别

阻塞式和非阻塞式io的区别

介绍

阻塞式io

​编辑

非阻塞式io

​编辑

信号驱动式io

​编辑

多路转接/复用

​编辑

异步io


5种io模型

io引入

io的本质

以read ,write为例:

  • 如果底层缓冲区没有数据/缓冲区已满,会阻塞等待
  • 网络更是如此,大部分时间都在等待,直到有数据才进行拷贝

所以,io=等待+拷贝

  • 因为上层察觉不到等待的时间,只能将等待时间也纳入io时间,无论是在等数据输入/处理数据好腾出空间,都是在等
  • 其实概括一下,等的过程就是在判断条件成立 -- 条件 : 读写事件就绪

并且,在应用层使用这两个函数,本质上是将数据在用户层和os之间传递 

  • 用户层缓冲区的数据 <---> 系统级缓冲区
  • 也就是我们之前提到的,它们本质上都是拷贝函数

io效率的本质

根据上面的内容,我们可以推出:

  • 因为高效io = 单位时间内可以拷贝更多的数据
  • 又因为拷贝工作是os做的,我们无法改变,且io=等待+拷贝
  • 所以,本质上提高io效率,就是要减少等待时间,几乎所有提高io效率的策略,都是在减少等待比重
  • 就像,我们为什么要写多线程来代替单进程, 就是因为可以把等待时间从串行->并行

模型引入

以钓鱼为例

假如a来河边钓鱼

  • 他是一个会一直关注鱼漂的人,所以在鱼咬钩之前,会一直等待,不会被外界因素打扰
  • 对应io模型中的阻塞式io,我们之前接触到的大部分接口都是这样

过了一会又来了个b

  • 他和a不一样,他闲不住,没法一直看着鱼漂,他会每隔五分钟查看一下情况,其余时间都在忙自己的(玩手机啦,看书啦等等)
  • 对应非阻塞式io(这里是轮询方式)

然后又来了个c

  • 他在鱼钩那里挂了一个铃铛,抛竿后就不管了,直到听到铃铛响才去查看
  • 对应信号驱动式io,有数据了再来通知他

富豪d也过来钓鱼

  • 他和前三个人都不一样,他开着车过来,装着一车鱼竿,然后依次把鱼竿插在地上,全部抛竿后以遍历的方式周期性检查所有鱼漂情况 -- 多路复用/转接

目前来说,d的钓鱼效率是最高的

  • 因为鱼竿数量增多,相当于增加了鱼咬钩的概率
  • 假设鱼咬任何一个鱼钩的概率是百分之一,那么d钓上鱼的概率就是n*1%,其他人都是1%

最后,大公司老板e也来钓鱼

  • 他是带着一个司机坐车过来的,他也想去钓鱼,但一会公司还有事,所以他让司机在这里钓,给他留下钓鱼工具,水桶,手机,如果钓的鱼把桶装满了就用手机通知他
  • 小王怎么钓鱼的不重要,重要的是e并没有实际参与钓鱼过程,e只是钓鱼行为的发起者,他只关心数据
  • 对应异步io -- 小王就是os,e就是发起io操作的实体(进程/线程)

例子介绍完了,接下来聊聊细节 

效率最高的方式

五种io模型中,第四种io效率最高

  • 虽然第五种自己不用参与,其实io效率没区别
  • 并且异步io写出来的服务逻辑比较混乱一些

所以,多路转接的io方式是我们最值得学习的,也是效率最高的 

异步io和同步io的区别

前四个人都属于同步io

  • 他们无论如何处理等待时间,总之都亲身参与了等待/钓的过程

最后一个则是完全没有参与

  • 只是发起io,最后拿到结果就行

这就是异步/同步的本质区别,在于是否参与io 

阻塞式和非阻塞式io的区别

也就是a和b的区别

  • 实际上两者的io效率没有区别
  • 因为io=等+拷贝,两者都没有改变等待时间的占比,只是等待的方式不同
  • 只不过b总体效率高,因为b在等待之余还做了其他事情

介绍

阻塞式io

非阻塞式io

信号驱动式io

多路转接/复用

异步io

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2111902.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【鸿蒙HarmonyOS NEXT】页面和自定义组件生命周期

【鸿蒙HarmonyOS NEXT】页面和自定义组件生命周期 一、环境说明二、页面和自定义组件生命周期三、示例代码加以说明四、小结 一、环境说明 DevEco Studio 版本&#xff1a; API版本&#xff1a;以12为主 二、页面和自定义组件生命周期 需要明确几个概念&#xff1a; 页面…

0to1使用Redis实现“登录验证”次数限制

1 引言 系统为了避免密码遭到暴力破解&#xff0c;通常情况下需要在登录时&#xff0c;限制用户验证账号密码的次数&#xff0c;当达到一定的验证次数后&#xff0c;在一段时间内锁定该账号&#xff0c;不再验证。本章将用几行代码实现该功能&#xff0c;完整代码链接在文章最…

Markdown全兼容,MarkText打造专业文档新体验

前言 在科技的洪流中&#xff0c;我们不仅是见证者&#xff0c;更是创造者。它赋予我们力量&#xff0c;将遥不可及的梦想拉近至指尖&#xff0c;让生活的每一刻都充满无限可能。随着数字化内容的爆炸性增长&#xff0c;Markdown作为一种轻量级标记语言&#xff0c;凭借其简洁…

tekton构建标准ci(clone repo, test, build push img)

场景介绍 我们在上一篇文章中构建了一个最简单的ci&#xff0c;接下来我们对我们的github的项目构建一个较标准的ci。 Tekton简介&#xff0c;安装和构建最简单ci/cd-CSDN博客文章浏览阅读239次&#xff0c;点赞2次&#xff0c;收藏2次。本文介绍了tekton是什么&#xff0c;如…

vsftpd配置用户和密码让其他客户端连接

一、第一个主机:vsftpd下载及配置 前置准备: #卸载防火墙 yum -y remove firewalld #为了不让防火墙有影响&#xff0c;iptables配置也清空 iptables -F vim /etc/selinux/conf SELINUXdisabled #主要是把它改为disabled或者permissive SELINUXTYPEtargeted #重启linux让seli…

[Web安全 网络安全]-安全法规 网络基础 信息收集

文章目录&#xff1a; 一&#xff1a;网络安全法规 二&#xff1a;计算机网络 1.计算机网络的组成 2.网络分层模型&#xff08;OSI七层 TCP/IP四层&#xff09; 3.通信协议 IP协议 UDP协议/TCP协议 TCP协议 UDP协议 区别 HTTP协议/HTTPS协议 HTTP协议 HTTPS协议…

RedissonClient 分布式队列工具类

注意&#xff1a;轻量级队列可以使用工具类&#xff0c;重量级数据量 请使用 MQ 本文章基于redis使用redisson客户端实现轻量级队列&#xff0c;以及代码、执行结果演示 一、常见队列了解 普通队列&#xff1a;先进先出&#xff08;FIFO&#xff09;&#xff0c;只能在一端添…

【网络安全 | 甲方建设】SaaS平台、Jira工具及Jenkins服务器

原创文章,不得转载。 文章目录 SaaS平台友好性Jira友好性Jenkins友好性SaaS平台 SaaS,全称为 “Software as a Service”(软件即服务),是一种基于云计算的软件交付模型。在这种模型中,软件不需要用户在本地安装和维护,而是通过互联网访问和使用。软件通常由服务提供商托…

RLC(电阻、电感、电容)

RLC&#xff08;电阻、电感、电容&#xff09; 目录一、两个电阻&#xff08;R1&#xff0c;R2&#xff09;&#xff0c;电容&#xff08;C1&#xff0c;C2&#xff09;的串联/并联公式&#xff1f;二、请画出这个1ms&#xff0c; 1V的Vin脉冲信号在Vout端的大致图像1.电路图2.…

中秋猜灯谜_猜字谜小程序源码,无需服务器

这款小程序搭建是免服务器和域名的&#xff0c;serverless&#xff0c;没有后端; 无需设置合法域名的!上传就可以使用; 只需要使用微信开发者工具打开源码然后上传审核就可以了! 这款小程序其实比较简洁&#xff0c;分两种模式青铜模式(普通)和王者模式(困难)&#xff0c;猜…

关于蓝屏查看日志分析原因

一、前提 虽然电脑经常蓝屏&#xff0c;或者发生了蓝屏现象&#xff0c;但是仍然可以进入系统&#xff0c;并且可以进行桌面操作。 二、查看蓝屏日志 1.按下win键&#xff0c;搜索计算机管理。 2.依次点击&#xff1a;系统工具->事件查看器->Windows日志->系统 3.在…

CosyVoice:开源强大的 AI 语音合成工具

在当今科技飞速发展的时代&#xff0c;AI 语音合成技术正逐渐改变着我们的生活。今天&#xff0c;就为大家介绍一款卓越的语音合成工具——CosyVoice。 一、安装步骤 克隆和安装&#xff1a; 克隆仓库&#xff1a;git clone --recursive https://github.com/FunAudioLLM/Cos…

linux使用samba共享目录,其他虚拟机和windows都可以访问

一、192.168.137.12主机作为源目录主机&#xff0c;将/samba/shared_dir目录分享出去 #192.168.137.12主机&#xff1a; rpm -q samba #查看是否安装 yum -y install samba #创建共享目录 mkdir /samba/shared_dir -p #给共享目录赋权 chown -R samba.samba /samba #提示用户不…

【流程设计】JAVA系统集成activiti工作流,流程设计器,在线审批,会签,驳回,流程图查看(实际多套系统运用案例分析)

基于Javavue开发的智能审批系统&#xff0c;低代码平台方案 其他资料&#xff0c;软件资料清单列表部分文档清单&#xff1a;工作安排任务书&#xff0c;可行性分析报告&#xff0c;立项申请审批表&#xff0c;产品需求规格说明书&#xff0c;需求调研计划&#xff0c;用户需求…

图论篇--代码随想录算法训练营第五十二天打卡| 101. 孤岛的总面积,102. 沉没孤岛,103. 水流问题,104.建造最大岛屿

101. 孤岛的总面积 题目链接&#xff1a;101. 孤岛的总面积 题目描述&#xff1a; 给定一个由 1&#xff08;陆地&#xff09;和 0&#xff08;水&#xff09;组成的矩阵&#xff0c;岛屿指的是由水平或垂直方向上相邻的陆地单元格组成的区域&#xff0c;且完全被水域单元格…

攻防世界 unseping

unseping 攻防世界web新手练习 -unseping_攻防世界web新手题unseping-CSDN博客 这道题对我来说还是有点难&#xff0c;什么oct绕过命令执行第一次遇到捏&#xff0c;所以基本是跟着别人的wp写的&#xff0c;一点点记录吧 先对源码进行分析 <?php highlight_file(__FILE…

LLVM IR指令VM混淆分析

未混淆编译 编写一个最简单的测试代码&#xff0c;对 test_add函数用于对两个数相加&#xff1a; int __attribute((__annotate__("vm"))) test_add(int a, int b) {int c a b;return c; }int main(void) {int c test_add(1, 2);return c; } 编译成中间代码&am…

【佳学基因检测】如何知道一个网站是用Nginx还是Apache运行的服务器。

【佳学基因检测】如何知道一个网站是用Nginx还是Apache运行的服务器。 要确定一个的网站是由Nginx还是Apache服务器运行&#xff0c;可以使用以下几种方法&#xff1a; 1. 查看HTTP头信息 您可以通过检查网站返回的HTTP头信息来判断使用的是哪种服务器。具体步骤如下&#x…

Kafka【十三】消费者消费消息的偏移量

偏移量offset是消费者消费数据的一个非常重要的属性。默认情况下&#xff0c;消费者如果不指定消费主题数据的偏移量&#xff0c;那么消费者启动消费时&#xff0c;无论当前主题之前存储了多少历史数据&#xff0c;消费者只能从连接成功后当前主题最新的数据偏移位置读取&#…

FastAPI+Vue3零基础开发ERP系统项目实战课 20240906 上课笔记 fastapi的各种练习

回顾练习 用FastAPI写一个接口&#xff0c;这个接口能够返回九九乘法表的字符串。 获取九九乘法表&#xff1a; for i in range(1, 10):for j in range(1, i 1):print(f"{j} x {i} {j * i}", end"\t")print()# 得到字符串 talbe99 "" for …