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

相关文章

Spring Boot Interceptor的原理、配置、顺序控制及与Filter的关键区别对比分析

《SpringBootInterceptor的原理、配置、顺序控制及与Filter的关键区别对比分析》本文主要介绍了SpringBoot中的拦截器(Interceptor)及其与过滤器(Filt... 目录前言一、核心功能二、拦截器的实现2.1 定义自定义拦截器2.2 注册拦截器三、多拦截器的执行顺序四、过

C# Semaphore与SemaphoreSlim区别小结

《C#Semaphore与SemaphoreSlim区别小结》本文主要介绍了C#Semaphore与SemaphoreSlim区别小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的... 目录一、核心区别概览二、详细对比说明1.跨进程支持2.异步支持(关键区别!)3.性能差异4.API 差

Java中自旋锁与CAS机制的深层关系与区别

《Java中自旋锁与CAS机制的深层关系与区别》CAS算法即比较并替换,是一种实现并发编程时常用到的算法,Java并发包中的很多类都使用了CAS算法,:本文主要介绍Java中自旋锁与CAS机制深层... 目录1. 引言2. 比较并交换 (Compare-and-Swap, CAS) 核心原理2.1 CAS

Java多种文件复制方式以及效率对比分析

《Java多种文件复制方式以及效率对比分析》本文总结了Java复制文件的多种方式,包括传统的字节流、字符流、NIO系列、第三方包中的FileUtils等,并提供了不同方式的效率比较,同时,还介绍了遍历... 目录1 背景2 概述3 遍历3.1listFiles()3.2list()3.3org.codeha

MySQL 批量插入的原理和实战方法(快速提升大数据导入效率)

《MySQL批量插入的原理和实战方法(快速提升大数据导入效率)》在日常开发中,我们经常需要将大量数据批量插入到MySQL数据库中,本文将介绍批量插入的原理、实现方法,并结合Python和PyMySQ... 目录一、批量插入的优势二、mysql 表的创建示例三、python 实现批量插入1. 安装 PyMyS

Java领域模型示例详解

《Java领域模型示例详解》本文介绍了Java领域模型(POJO/Entity/VO/DTO/BO)的定义、用途和区别,强调了它们在不同场景下的角色和使用场景,文章还通过一个流程示例展示了各模型如何协... 目录Java领域模型(POJO / Entity / VO/ DTO / BO)一、为什么需要领域模

Redis的安全机制详细介绍及配置方法

《Redis的安全机制详细介绍及配置方法》本文介绍Redis安全机制的配置方法,包括绑定IP地址、设置密码、保护模式、禁用危险命令、防火墙限制、TLS加密、客户端连接限制、最大内存使用和日志审计等,通... 目录1. 绑定 IP 地址2. 设置密码3. 保护模式4. 禁用危险命令5. 通过防火墙限制访问6.

深入理解Redis线程模型的原理及使用

《深入理解Redis线程模型的原理及使用》Redis的线程模型整体还是多线程的,只是后台执行指令的核心线程是单线程的,整个线程模型可以理解为还是以单线程为主,基于这种单线程为主的线程模型,不同客户端的... 目录1 Redis是单线程www.chinasem.cn还是多线程2 Redis如何保证指令原子性2.

MySQL中VARCHAR和TEXT的区别小结

《MySQL中VARCHAR和TEXT的区别小结》MySQL中VARCHAR和TEXT用于存储字符串,VARCHAR可变长度存储在行内,适合短文本;TEXT存储在溢出页,适合大文本,下面就来具体的了解... 目录一、VARCHAR 和 TEXT 基本介绍1. VARCHAR2. TEXT二、VARCHAR

Python爬虫HTTPS使用requests,httpx,aiohttp实战中的证书异步等问题

《Python爬虫HTTPS使用requests,httpx,aiohttp实战中的证书异步等问题》在爬虫工程里,“HTTPS”是绕不开的话题,HTTPS为传输加密提供保护,同时也给爬虫带来证书校验、... 目录一、核心问题与优先级检查(先问三件事)二、基础示例:requests 与证书处理三、高并发选型: