IO即为Input、Output,对计算机来说,我们使用键盘鼠标给计算机指令就是一种输入,计算机将我们键盘输入的文字显示到显示器即是一种输出。或者写博客时将计算机从键盘接收到的文字信息发送到平台上即为输出,当我们查阅资料,打开某一篇博客时对计算机来说也可理解为输入。

操作系统的核心是内核,独立于普通的应用程序,可以访问受保护的内存空间,也有访问底层硬件设备的所有权限。为了保证用户进程不能直接操作内核(kernel),操作系统将虚拟空间划分为两部分,一部分为内核空间,一部分为用户空间。

上面所说的IO数据通常由OS缓存到内核中,而后拷贝到用户空间中,因此Input和Output的流程可以简化为:

外部输入—》OS内核空间—》用户空间—》用户进程

用户进程输入—》用户空间—》OS内核空间—》外部

阻塞IO

用户进程在获取IO数据时,最简单的方式就是串行,即阻塞IO(BIO)。

例子:好比我们在代码开发完成后,提交merge请求,提交后我们就到commitor工位,发现commitor不在工位,我们一直等到他回工位,然后看着他检视代码,直到他检视完成后我们才放心的做其他事。

jdk1.4前网络连接都是采用BIO的模式,当服务端Socket接收到请求后,不能再接收处理其他请求,就只能把这个请求处理完后才能接收其他请求,可以简单的理解为串行。虽然该模型简单,但是我们开发完代码后一直等着commitor检视还是有偷懒的嫌疑,可能会被说效率低,从上图中可以看出,我们不一定要一直守在commitor工位旁边等他回来,所以就出现了非阻塞IO。

非阻塞IO

鉴于BIO有串行效率低的缺点,我们做了优化,就是不再一直等待数据准备好,而是用户进程主动多次询问。

例子:好比我们在代码开发完成后,提交merge请求,提交后我们看到commitor不在工位就知道还不能合代码,此时我们不会守在commiter工位旁边等待,而是是不是去他工位看看回来没,直到某一次去看他已经回到工位,才守到他工位旁边,看着他检视代码,直到他检视完成后我们才放心的做其他事。

和BIO相比,NIO内核会立刻返回,返回后应用进程可以做其他事,即应用进程第一阶段不是阻塞的,但是需要主动不断去询问内核数据是否准备好;第二个阶段仍然是阻塞的。NIO虽然比BIO有所提升,但是还是需要应用进程不断去询问,因此产生了IO复用模型。

IO复用

IO复用模型去掉了应用进程主动询问的过程,而是把数据是否准备好交给了内核处理,内核通过select/poll去遍历检查数据是否准备好,或者通过epoll回调方式处理。

例子:我们此次需要提交前台和后台的功能代码,由多个commitor负责检视,commitor检视前由秘书记录由哪些代码合入的请求,我们提交merge后,发现commitor不在,秘书就先记录,我们在commitor工位一直等着,秘书遍历去各commitor工位看是否回来,一旦看到某个commitor在工位,就通知此commitor相关的merge代码的人来检视代码,程序员看着他检视代码,直到他检视完成后我们才放心的做其他事。

IO 多路复用(IO multiplexing) ,也称事件驱动 IO(event -driven IO),就是在单个线程里同时监控多个套接字,通过 select 或 poll 轮询所负责的所有 socket,当某个 socket 有数据到达了, 就通知用户进程 。 IO 复用同非阻塞 IO 本质一样,不过利用了新的 select 系统调用,由内核来负责本来是请求进程该做的轮询操作。看似比非阻塞 IO 还多了一个系统调用开销,不过支持多路 IO提高了效率。 进程先是阻塞在 select/poll 上,再是阻塞在读操作的第二个阶段上。

IO复用主要有select、poll、epoll三类,select通过数组记录应用进程请求,因此监听数量有限;poll使用链表的方式优化了select的监听数量缺陷,epoll为了减少内核多余的遍历调用,变主动位被动,通过回调实现,如下图:

epoll相较于select/poll,多了两次系统调用,其中epoll_create建立与内核的连接,epoll_ctl注册事件,epoll_wait阻塞用户进程,等待IO事件。

select、poll、epoll区别如下:

IO复用的缺点是应用进程请求后就会阻塞。

信号驱动IO

信号驱动 IO 与IO多路复用最大的区别就在于,在 IO 执行的数据准备阶段 ,不会阻塞用户进程 。 如图所示:当用户进程需要等待数据的时候,会向内核发送一个信号,告诉内核我要什么数据,然后用户进程 就继续做别的事情去了,而当内核中的数据准备好之后,内核立马发给用户进程一个信号,说 ”数据准备好了, 快来查收“,用户进程收到信号之后,立马调用 recvfrom去查收数据 。

例子:我们提交代码合入请求后,这次仍然有秘书记录merge请求,我们看到commitor不在工位就马上回去干自己的活了,一旦commitor回到工位,秘书就通知我去commitor工位检视代码,我就在他旁边看着他检视代码,直到他检视完成后我才放心的做其他事。

总的就一句话:信号驱动优化了第一阶段阻塞的情况,但是在程序员守着检视代码的阶段还是阻塞的。

异步IO

AIO,异步 IO 真正实现了 IO 全流程(两个阶段)的非阻塞。用户进程发出系统调用后立即返回,内核等待数据准备完成,然后将数据拷贝到用户进程缓冲区,然后发送信号告诉用户进程 IO 操作执行完毕 (与 SIGIO 相比,一个是发送信号告诉用户进程数据准备完毕,一个是 IO 执行完毕)。

例子:我们提交代码合入请求后,我们看到commitor不在工位就马上回去干自己的活了,commitor回到工位后看到我们提的merge,就自己开始检视代码,当检视完成后,通知我说代码已经合入了,可以发版本了。

总结

最后总结一下,五种IO模型,从上到下应该是逐级改进的,总体分类如下图:

作者:懒AI患者 | 转自:InfoQ

java io 模型_五种 IO 模型相关推荐

  1. linux各种io模型,Linux五种IO模型

    Linux SendMail服务启动慢总结 在 CentOS release 6.6 上启动sendmail服务时发现服务启动过程非常慢,基本上要耗费3分多钟.有点纳闷:什么原因导致sendmail启 ...

  2. mysql的存储模型_一种BIM模型数据的数据库存储格式的制作方法

    本发明涉及建筑BIM技术领域,特别涉及一种BIM模型数据的数据库存储格式. 背景技术: 在Revit文件的数据格式中,有的遗漏数据,如FBX:有的封闭不够开放,如IFC:有的涉及操作比较复杂的数据库, ...

  3. 对IO复用以及五种IO模型的理解

    阻塞IO 当系统调用没有拿到想要的数据时,它就会一直在等待,不会做其他事情,直到拿到了想要的数据或者资源,它才会返回调用成功的结果. 非阻塞IO 当系统调用产生,但是对于想要的数据来说它还没有被内核处 ...

  4. Linux/Unix五种IO模型

    文章目录 引入 操作系统的内核态和用户态 文件描述符fd IO操作过程: 阻塞和非阻塞 同步和异步 同步IO和异步IO 五种IO模型 1.(同步)阻塞IO模型 2.(同步)非阻塞IO模型 3.IO多路 ...

  5. 说说基于网络的五种IO模型

    # django不是一个异步框架 # tornado是异步的web框架# 处理每秒大量的请求# 个人理解的IO:就是应用层与内核驱动层的交互,这个过程无论从应用层到内核中,还是驱动层等待硬件层的数据, ...

  6. 五种IO模型:阻塞/非阻塞/复用/信号驱动/异步IO模型

    五种IO模型:阻塞/非阻塞/复用/信号驱动/异步IO模型 1. IO基本概念 1.1 IO概念 1.2 IO的两个阶段 1.2.1 IO的两个阶段-例子说明 1.2 IO种类 2. 五种IO模型 2. ...

  7. java中的io复用_从 Java 中的零拷贝到五种IO模型

    在之前的文章中,我们聊过了 Java 中的零拷贝,零拷贝就是指数据不会在内核空间和用户空间之间相互拷贝.这样就减少了内核态与用户态的切换,自然就很高效. 拷贝文件只是 IO 操作中一个特殊的情况,大多 ...

  8. java基础巩固-宇宙第一AiYWM:为了维持生计,四大基础之OS_Part_2整起~IO们那些事【包括五种IO模型:(BIO、NIO、IO多路复用、信号驱动、AIO);零拷贝、事件处理及并发等模型】

    PART0.前情提要: 通常用户进程的一个完整的IO分为两个阶段(IO有内存IO.网络IO和磁盘IO三种,通常我们说的IO指的是后两者!):[操作系统和驱动程序运行在内核空间,应用程序运行在用户空间, ...

  9. 五种IO模型:操作系统五种IO模型大全

    文章目录 五种IO模型:操作系统五种IO模型大全 一.IO模型简介 1.1 操作系统的内存简介 1.1.1 操作系统的应用与内核 1.1.2 内核空间与用户空间 1.1.3 CPU指令等级 1.1.4 ...

最新文章

  1. ngx_lua_module-1.0.5.0 (LUA编写网页脚本,支持windows和linux)
  2. h2 不能访问localhost_SpringBoot2.x系列教程44--H2数据库详解及搭建Web控制台
  3. 设计模式 之 --- GRASP
  4. CentOS7 编译安装LVS 互为主备 (实测 笔记 Centos 7.0 + ipvsadm 1.27 + keepalived 1.2.15 )
  5. 虚拟机中ubuntu可以使用显卡吗_在KVM下使用ubuntu19.10安装Anbox
  6. android 8 ril,Android 8.0 RIL源码分析(二)
  7. 华为前员工李洪元:我的诉求只有见任总能解决;音悦台被传倒闭;.NET Core 3.1 发布 | 极客头条...
  8. 前端面试要注意这几点
  9. GDataDate 的本地时间转换
  10. 西门子/AB/ModbusTCP/FX3U 安卓手机app软件,二代Teslascada2电脑组态版本app Runtime
  11. Linux命令+shell脚本大全:文件系统的检查与修复
  12. php excel库,phpexcel类库下载
  13. 微软ime日文输入法在假名输入模式下怎么快速输入英文
  14. 校园网WiFi免认证软件监控
  15. 两步免费开通企业微信,不用提交资料
  16. 计算机解题的过程实际上是实施某种算法,计算机等级考试二级C考点.doc
  17. 毕业设计论文选题系统系统用例图_毕业设计选题系统
  18. 网络安全保障之“三同步”
  19. 计算机与网络应用word题目解析,计算机二级word真题:《计算机与网络应用》教材的编排...
  20. WinCC智能报表(代替热风炉岗位工手抄日志)

热门文章

  1. 解决后台json数据返回的字段需要替换的问题
  2. 从一个简单的“欢迎“页面开始小程序之旅
  3. 在CentOS7上安装RocketMQ 4.8.0
  4. 配置hosts快速访问GitHub
  5. C#LeetCode刷题之#203-删除链表中的节点(Remove Linked List Elements)
  6. lighthouse使用_如何在CircleCI中使用Lighthouse
  7. 区块链数学建模_试图通过高中数学课程来解释区块链
  8. php遍历文件夹下文件内容_PHP递归遍历指定文件夹内的文件实现方法
  9. 源码分析参考:Queue
  10. 一文搞清楚 Spark shuffle 调优