草庐IT

IO相关了解

zqurgy 2023-03-28 原文

1.IO的概念

  • IO简单来讲就是对输入输出设备的简化表达形式
    • 单片机中各种接口,进行数据流的传输
    • 从磁盘中读取数据至内存,又或者从内存中写入磁盘
  • 编程中的IO
    • 此时的IO其应用程序的运行态,即进程---》IO调用
    • 特别强调的是我们的应用程序其实并不存在实质的IO过程,真正的IO过程是操作系统的事情,
    • 这里把应用程序的IO操作分为两种动作:IO调用和IO执行
    • 因此所有的IO操作算作IO调用,之后由内核进行执行

2.Linux中的5种IO模型

  • 5种IO模型

    • 同步IO:阻塞IO模型、非阻塞IO模型、IO复用模型、信号驱动的IO模型

    • 异步IO

  • 阻塞IO模型--bio---blockIO--》

    • fd默认是阻塞的,网络编程中accept(),listen(),recv()等这些函数
    • 阻塞IO不适合工程代码,网络IO
    • 一旦阻塞,线程会被挂起
  • 非阻塞IO模型

    • 流程不变,继续执行
    • 比如recv()只会返回一个–1,然后接着执行
    • 阻塞---要进行读写,没有数据,线程会被挂起

    注:阻塞和非阻塞的属性,是属于fd本身,默认为阻塞,可以通过

    fcntl( fd,flag | O_NONBLOCK )进行非阻塞设置

  • IO复用模型 :IO多路复用

  • 信号驱动的IO模型

    • 注册一个IO信号事件,在数据可操作时通过SIGIO信号通知线程
  • 异步IO

    通过使用fdset(fd,cb),一旦检测到数据调用callback,也不会被阻塞,但是也不会返回-1,因为会自动调用cb

  • reactor---反应堆模型

    • reactor是对epoll进行的封装,让用户只需要关注读什么和写什么和相应的回调函数即可
    • 而不是关注epoll的使用

一些概念

  • 阻塞和非阻塞---》针对于线程状态,
    • 一旦阻塞,线程被挂起,不能做其它事情)
    • 非阻塞可以做其他事情:在等待的过程中可以做其它事情
  • 同步和异步---》线程的做事顺序,异步和同步是相对的
    • 同步为一个线程必须做完一件之后,通知再做下一件
    • 异步为不必做完一件之后,再做下一件,可以一次性做多个,做完通知一下
  • 同步和互斥--》两者的角度不同
    • 同步按照一定的顺序执行,访问者对资源的有序访问。
    • 互斥:同一个资源同一时间只有一个访问者可以进行访问,其他访问者需要等前一个访问者访问结束才可以开始访问该资源。但互斥无法限制访问者对资源的访问顺序,即访问是无序的。
    • 总结:同步是一种更为复杂的互斥,而互斥是一种特殊的同步。

3.常用使用形式----》用途

  • 阻塞IO模型:阻塞socket
    • 进程阻塞挂起不消耗CPU资源,及时响应每个操作;
    • 实现难度低、开发应用较容易;
    • 适用并发量小的网络应用开发;
  • 非阻塞IO模型:socket是非阻塞的方式,超时处理
    • 进程轮询(重复)调用,消耗CPU的资源;
    • 实现难度低、开发应用相对阻塞IO模式较难;
    • 适用并发量较小、且不需要及时响应的网络应用开发;
  • IO复用模型 :select、poll、epoll三种方案,nginx都可以选择使用这三个方案
    • 专一进程解决多个进程IO的阻塞问题,性能好;Reactor模式;
    • 实现、开发应用难度较大;
    • 适用高并发服务应用开发:一个进程(线程)响应多个请求
  • 信号驱动的IO模型:信号机制不可控,不建议应用于服务层(业务层)
    • 回调机制,实现、开发应用难度大;
  • 异步IO:高性能服务器应用
    • 不阻塞,数据一步到位;Proactor模式;
    • 需要操作系统的底层支持,LINUX 2.5 版本内核首现,2.6 版本产品的内核标准特性;
    • 实现、开发应用难度大;
    • 非常适合高性能高并发应用;

4.拓展

  • 在网络编程中,为什么使用IO多路复用,而不是异步IO?

    1.异步IO处于内核空间中,回调函数在用户空间中,从系统空间回调到用户空间
    2.内核和用户空间之间会触发0x80中断,系统调用过程,用户空间经过80中断进入系统空间代码,比如open()
    3.网络编程中的fd数量有NN多个,会有NN多个callback,因此会频繁触发80中断
    4.这会导致80中断队列崩溃
    5.aio的缺陷,但是仍然好用,可以用在磁盘文件读写,即不需要大量IO使用,几十个等

5.相关联的,相对比的技术

6.参考资料

看一遍就理解:IO模型详解 - 掘金 (juejin.cn)

有关IO相关了解的更多相关文章

  1. ruby-on-rails - 相关表上的范围为 "WHERE ... LIKE" - 2

    我正在尝试从Postgresql表(table1)中获取数据,该表由另一个相关表(property)的字段(table2)过滤。在纯SQL中,我会这样编写查询:SELECT*FROMtable1JOINtable2USING(table2_id)WHEREtable2.propertyLIKE'query%'这工作正常:scope:my_scope,->(query){includes(:table2).where("table2.property":query)}但我真正需要的是使用LIKE运算符进行过滤,而不是严格相等。然而,这是行不通的:scope:my_scope,->(que

  2. ruby - 如何验证 IO.copy_stream 是否成功 - 2

    这里有一个很好的答案解释了如何在Ruby中下载文件而不将其加载到内存中:https://stackoverflow.com/a/29743394/4852737require'open-uri'download=open('http://example.com/image.png')IO.copy_stream(download,'~/image.png')我如何验证下载文件的IO.copy_stream调用是否真的成功——这意味着下载的文件与我打算下载的文件完全相同,而不是下载一半的损坏文件?documentation说IO.copy_stream返回它复制的字节数,但是当我还没有下

  3. Ruby 文件 IO 定界符? - 2

    我正在尝试解析一个文本文件,该文件每行包含可变数量的单词和数字,如下所示:foo4.500bar3.001.33foobar如何读取由空格而不是换行符分隔的文件?有什么方法可以设置File("file.txt").foreach方法以使用空格而不是换行符作为分隔符? 最佳答案 接受的答案将slurp文件,这可能是大文本文件的问题。更好的解决方案是IO.foreach.它是惯用的,将按字符流式传输文件:File.foreach(filename,""){|string|putsstring}包含“thisisanexample”结果的

  4. Get https://registry-1.docker.io/v2/: net/http: request canceled while waiting - 2

    1.错误信息:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:requestcanceledwhilewaitingforconnection(Client.Timeoutexceededwhileawaitingheaders)或者:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:TLShandshaketimeout2.报错原因:docker使用的镜像网址默认为国外,下载容易超时,需要修改成国内镜像地址(首先阿里

  5. ruby - 为什么不能使用类IO的实例方法noecho? - 2

    print"Enteryourpassword:"pass=STDIN.noecho(&:gets)puts"Yourpasswordis#{pass}!"输出:Enteryourpassword:input.rb:2:in`':undefinedmethod`noecho'for#>(NoMethodError) 最佳答案 一开始require'io/console'后来的Ruby1.9.3 关于ruby-为什么不能使用类IO的实例方法noecho?,我们在StackOverflow上

  6. ruby-on-rails - 在具有 ActiveRecord 条件的相关模型中按字段排序 - 2

    我正在尝试按Rails相关模型中的字段进行排序。我研究的所有解决方案都没有解决如果相关模型被另一个参数过滤?元素模型classItem相关模型:classPriority我正在使用where子句检索项目:@items=Item.where('company_id=?andapproved=?',@company.id,true).all我需要按相关表格中的“位置”列进行排序。问题在于,在优先级模型中,一个项目可能会被多家公司列出。因此,这些职位取决于他们拥有的company_id。当我显示项目时,它是针对一个公司的,按公司内的职位排序。完成此任务的正确方法是什么?感谢您的帮助。PS-我

  7. ruby - 了解在 Ruby 中与 lambda 一起使用的 inject 行为 - 2

    我经常将预配置的lambda插入可枚举的方法中,例如“map”、“select”等。但是“注入(inject)”的行为似乎有所不同。例如与mult4=lambda{|item|item*4}然后(5..10).map&mult4给我[20,24,28,32,36,40]但是,如果我制作一个2参数lambda用于像这样的注入(inject),multL=lambda{|product,n|product*n}我想说(5..10).inject(2)&multL因为“inject”有一个可选的单个初始值参数,但这给了我......irb(main):027:0>(5..10).inject

  8. ruby-on-rails - 如何测试自己对 Ruby/ROR 的了解? - 2

    是否有self验证的问题列表。看着那个,我可以确定我知道。我应该复习一下。在学习的过程中,我列了一个这样的list,但它只包含我在某处听说过的项目。我需要一段时间才能找到新的东西。 最佳答案 以下是针对ruby​​和Rails的一些测试列表。证书名称:RubyonRails谁提供:oDeskIncorporation认证费用:免费网站:https://www.odesk.com/tests/985?pos=0证书名称:RubyonRails提供者:Techgig.com(TimesBusinessSolutionsLimited(T

  9. ruby-on-rails - 了解 "attribute_will_change!"方法 - 2

    我想覆盖store_accessor的getter。可以查到here.代码在这里:#Fileactiverecord/lib/active_record/store.rb,line74defstore_accessor(store_attribute,*keys)keys=keys.flatten_store_accessors_module.module_evaldokeys.eachdo|key|define_method("#{key}=")do|value|write_store_attribute(store_attribute,key,value)enddefine_met

  10. ruby - 我怎样才能更好地了解/了解更多关于 Ruby 的知识? - 2

    按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭9年前。我最近开始学习Ruby,这是我的第一门编程语言。我对语法感到满意,并且我已经完成了许多只教授相同基础知识的教程。我已经写了一些小程序(包括我自己的数组排序方法,在有人告诉我谷歌“冒泡排序”之前我认为它非常聪明),但我觉得我需要尝试更大更难的东西来理解更多关于Ruby.关于如何执行此操作的任何想法?

随机推荐