首页 > 其他分享 >五种IO模型

五种IO模型

时间:2023-11-16 15:55:23浏览次数:21  
标签:同步 信号 模型 阻塞 五种 IO 进程 水开

什么是IO

其实IO就是把进程的内部数据转移到外部设备,或者把外部设备的数据迁移到进程内部。外部设备一般指硬盘、socket通讯的网卡。

 

我们来把 I/O 过程比喻成烧水+倒水的过程,等待资源(就是烧水的过程),使用资源(就是倒水的过程):

  • 如果你站在炤台边上一直等着(等待资源)水烧开,然后倒水(使用资源),那么就是同步阻塞 I/O;

  • 如果你偷点儿懒,在烧水的时候躺在沙发上看会儿电视(不再时时刻刻等待资源),但是还是要时不时的去看看水开了没有,一旦水开了,马上去倒水(使用资源),那么这就是同步非阻塞 I/O;

  • 如果你想要洗澡,需要同时烧好多壶水,那你就在看电视的间隙去看看哪壶水开了(等待多个资源),哪一壶开了就先倒哪一壶,这样就加快了烧水的速度,这就是同步多路 I/O 复用;

  • 不过你发现自己总是跑厨房去看水开了没,太累了,于是你考虑给你的水壶加一个报警器(信号,水开了报警),只要水开了就马上去倒水,这就是信号驱动 I/O;

  • 最后一种就高级了,你发明了一个智能水壶,在水烧好后自动就可以把水倒好,这就是异步 I/O。

同步阻塞IO

 

同步非阻塞IO

阻塞IO的缺点就是:如果内核数据一直没准备好,那用户进程将一直阻塞,浪费性能,可以使用非阻塞IO优化。

 

 

同步非阻塞IO

 非阻塞IO模型,简称NIO,Non-Blocking IO。它相对于阻塞IO,虽然大幅提升了性能,但是它依然存在性能问题,即频繁的轮询,导致频繁的系统调用,同样会消耗大量的CPU资源

 

 

同步IO多路复用

应用进程通过调用select函数,可以同时监控多个fd,在select函数监控的fd中,只要有任何一个数据状态准备就绪了,select函数就会返回可读状态,这时应用进程再发起recvfrom请求去读取数据。

 

 信号驱动IO

信号驱动IO不再用主动询问的方式去确认数据是否就绪,而是向内核发送一个信号(调用sigaction的时候建立一个SIGIO的信号),然后应用用户进程可以去做别的事,不用阻塞。当内核数据准备好后,再通过SIGIO信号通知应用进程,数据准备好后的可读状态。应用用户进程收到信号之后,立即调用recvfrom,去读取数据。

 

异步IO 

前面讲的BIO,NIO和信号驱动,在数据从内核复制到应用缓冲的时候,都是阻塞的,因此都不算是真正的异步。AIO实现了IO全流程的非阻塞,就是应用进程发出系统调用后,是立即返回的,但是立即返回的不是处理结果,而是表示提交成功类似的意思。等内核数据准备好,将数据拷贝到用户进程缓冲区,发送信号通知用户进程IO操作执行完毕。

 

 

参考:

1. https://zq99299.github.io/note-architect/hc/05/03.html#%E5%A6%82%E4%BD%95%E6%8F%90%E5%8D%87%E7%BD%91%E7%BB%9C%E4%BC%A0%E8%BE%93%E6%80%A7%E8%83%BD

2. https://jiges.github.io/2018/02/07/%E4%BA%94%E5%A4%A7IO%E6%A8%A1%E5%9E%8B/

3. https://www.51cto.com/article/693213.html

标签:同步,信号,模型,阻塞,五种,IO,进程,水开
From: https://www.cnblogs.com/wxdlut/p/17836479.html

相关文章

  • el-radio 再次点击取消选中
    参考ElementUI中el-radio再次点击取消选中<el-radio-groupv-model="radio"><el-radio:label="1"@click.native.prevent="radioClick(1)">备选项</el-radio></el-radio-group>//prevent阻止默认事件data(){ret......
  • “视界”尽在眼前,海纳视联大模型来了!
    11月10日—13日,以“数字科技焕新启航”为主题的2023数字科技生态大会在广州举办。会议期间,在数字生活与天翼视联合作论坛上,重磅发布了由天翼云科技有限公司、天翼数字生活科技有限公司和天翼视联科技有限公司联合研发的视联行业大模型——海纳视联大模型,为视联行业智能化发展按下......
  • error DatabaseException(disk I/O error (code 1802)) sql 'PRAGMA user_version' ar
    问题描述errorDatabaseException(diskI/Oerror(code1802))sql'PRAGMAuser_version'args[]duringopen,c问题分析错误消息"DatabaseException(diskI/Oerror(code1802))"表示在尝试打开SQLite数据库时发生了磁盘I/O错误。这可能有几种原因:数据库文件路径......
  • 【Mquant】7:构建价差套利(三) ——空间误差校正模型
    1.上节回顾【Mquant】6:构建价差套利(二)上节带领大家编写了统计套利均值回归的程序,通过历史回测发现还不能进入实盘交易状态,原因出现在手续费率上,由于加密市场手续费率较高,我们选择国内期货市场,一般期货市场手续费率可以达到万分之一,个别品种手续费率可以达到万分之0.1。这节内......
  • iOS开发 重要通知(critical-alerts)
    重要警报(critical-alerts)是iOS12和watchOS5.0中的一种新型选择加入通知,允许绕过“请勿打扰”和静音开关。他的本意是出现紧急情况,需要用户立即关注的关键事件。一、适用程序苹果不允许通过重要通知来推送营销信息,因此,此类通知仅限于医疗或健康相关应用程序、公共安全......
  • 博弈论——古诺博弈模型详解
    古诺模型(Cournotmodel)是博弈论中最具有代表性的模型之一,也是是纳什均衡最早的版本。它是法国经济学家古诺(AugustinCournot)在1938年出版的《财富理论的数学原理研究》一书中最先提出的。而古诺的定义比纳什的定义早了一百多年,足以体现博弈论这样一个学科是深深扎根于经济学的土......
  • 使用.NET 4.0、3.5时,UnmanagedFunctionPointer导致堆栈溢出
    本文介绍了使用.NET4.0、3.5时,UnmanagedFunctionPointer导致堆栈溢出的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!问题描述我在带有trycatch块的点击处理程序中有一个简单的函数。如果我在此trycatch块中抛出异常,则它会成功捕获该异常。......
  • SAP调用外部的REST服务 http_communication_failure Connection to partner timed
    SAP中主动调用外部的REST服务时候, 因为传输的数据量比较大, 所以报Connectiontopartnertimedoutafter60 这一错误,原因之一可能是Tcode-SMICM ->转到->服务设置保活和处理超时时间,秒为单位,可以更具自己的需求进行设置。......
  • uniapp打包Android,出现崩溃Didn't find class "io.dcloud.application.DCloudApplicat
    自己创建的新的Android项目打包的时候一直崩溃,报错:Didn'tfindclass"io.dcloud.application.DCloudApplication"查找之后在app/build.gradle中发现添加multiDexEnabledtruecompileOptions{sourceCompatibilityJavaVersion.VERSION_1_8targetCompatibilityJavaV......
  • uniapp运行启动时候出现 The current application is running in a custom debugging
    突然出现这个,原来是uniapp说的自定义基座,是在app/src/main/assets/data/dcloud_contro.xml中需要修改hbuilder标签中的debug的值,如果为true则会出现标题的提示,如果改为false则不会出现标题提示的弹窗<hbuilderdebug="false"syncDebug="false"><apps><appappid="__UNI__......