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

2024-09-07 12:36

本文主要是介绍io本质+io效率本质,5种io模型(介绍,异步/同步区别,阻塞/非阻塞区别),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

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

这篇关于io本质+io效率本质,5种io模型(介绍,异步/同步区别,阻塞/非阻塞区别)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


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

相关文章

Java利用@SneakyThrows注解提升异常处理效率详解

《Java利用@SneakyThrows注解提升异常处理效率详解》这篇文章将深度剖析@SneakyThrows的原理,用法,适用场景以及隐藏的陷阱,看看它如何让Java异常处理效率飙升50%,感兴趣的... 目录前言一、检查型异常的“诅咒”:为什么Java开发者讨厌它1.1 检查型异常的痛点1.2 为什么说

Springboot项目构建时各种依赖详细介绍与依赖关系说明详解

《Springboot项目构建时各种依赖详细介绍与依赖关系说明详解》SpringBoot通过spring-boot-dependencies统一依赖版本管理,spring-boot-starter-w... 目录一、spring-boot-dependencies1.简介2. 内容概览3.核心内容结构4.

C#控制台程序同步调用WebApi实现方式

《C#控制台程序同步调用WebApi实现方式》控制台程序作为Job时,需同步调用WebApi以确保获取返回结果后执行后续操作,否则会引发TaskCanceledException异常,同步处理可避免异... 目录同步调用WebApi方法Cls001类里面的写法总结控制台程序一般当作Job使用,有时候需要控制

一文带你迅速搞懂路由器/交换机/光猫三者概念区别

《一文带你迅速搞懂路由器/交换机/光猫三者概念区别》讨论网络设备时,常提及路由器、交换机及光猫等词汇,日常生活、工作中,这些设备至关重要,居家上网、企业内部沟通乃至互联网冲浪皆无法脱离其影响力,本文将... 当谈论网络设备时,我们常常会听到路由器、交换机和光猫这几个名词。它们是构建现代网络基础设施的关键组成

redis和redission分布式锁原理及区别说明

《redis和redission分布式锁原理及区别说明》文章对比了synchronized、乐观锁、Redis分布式锁及Redission锁的原理与区别,指出在集群环境下synchronized失效,... 目录Redis和redission分布式锁原理及区别1、有的同伴想到了synchronized关键字

C#异步编程ConfigureAwait的使用小结

《C#异步编程ConfigureAwait的使用小结》本文介绍了异步编程在GUI和服务器端应用的优势,详细的介绍了async和await的关键作用,通过实例解析了在UI线程正确使用await.Conf... 异步编程是并发的一种形式,它有两大好处:对于面向终端用户的GUI程序,提高了响应能力对于服务器端应

C# async await 异步编程实现机制详解

《C#asyncawait异步编程实现机制详解》async/await是C#5.0引入的语法糖,它基于**状态机(StateMachine)**模式实现,将异步方法转换为编译器生成的状态机类,本... 目录一、async/await 异步编程实现机制1.1 核心概念1.2 编译器转换过程1.3 关键组件解析

setsid 命令工作原理和使用案例介绍

《setsid命令工作原理和使用案例介绍》setsid命令在Linux中创建独立会话,使进程脱离终端运行,适用于守护进程和后台任务,通过重定向输出和确保权限,可有效管理长时间运行的进程,本文给大家介... 目录setsid 命令介绍和使用案例基本介绍基本语法主要特点命令参数使用案例1. 在后台运行命令2.

Linux线程同步/互斥过程详解

《Linux线程同步/互斥过程详解》文章讲解多线程并发访问导致竞态条件,需通过互斥锁、原子操作和条件变量实现线程安全与同步,分析死锁条件及避免方法,并介绍RAII封装技术提升资源管理效率... 目录01. 资源共享问题1.1 多线程并发访问1.2 临界区与临界资源1.3 锁的引入02. 多线程案例2.1 为

MySQL常用字符串函数示例和场景介绍

《MySQL常用字符串函数示例和场景介绍》MySQL提供了丰富的字符串函数帮助我们高效地对字符串进行处理、转换和分析,本文我将全面且深入地介绍MySQL常用的字符串函数,并结合具体示例和场景,帮你熟练... 目录一、字符串函数概述1.1 字符串函数的作用1.2 字符串函数分类二、字符串长度与统计函数2.1