计算机中常见的IO模型主要分为几种BIO,NIO和AIO。

操作系统的IO操作包括读写文件,Socket操作等。CPU分为内核态和用户态,出于安全考虑,所有用户的应用程序都工作在用户态,系统调用工作在内核态,例如当应用程序需要进行读文件操作时候,由应用程序向操作系统发起系统调用,由操作系统从IO设备将数据读到内核态,然后将数据从内核态拷贝到用户态(例如缓冲区),应用程序拿数据完成文件读取。这是个通用的过程,根据具体执行过程的不同可以分为BIO,NIO和AIO。

关于阻塞需要说明一下:阻塞指的是之进程状态为“wait”状态,CPU不会给进程分配时间片,只有当数据准备好时,进程从“wait”转为“running”时,CPU才会给进程分配时间片继续执行。而应用程序while(1)循环不是阻塞。

BIO

这是最早做的IO模型,调用过程如图所示:

具体步骤如下:

  1. 应用程序发起系统调用,请求操作系统读数据;
  2. 操作系统切换到内核态,去读取IO设备的数据,将数据由IO设备读到内核;
  3. 读取完毕后将数据从内核复制到用户空间。
  4. 数据返回。

在这个读取数据过程中,系统调用一直没有返回数据,应用程序一直处于阻塞状态,等待数据准备就绪。

假如说一个Socket通信程序的服务端,需要同时监听多个socket连接,a,b,c。其中a数据量大,耗费时间多,b很快,a在等待数据过程中,整个服务端处于阻塞状态,无法执行任何运算或响应任何的网络请求。效率比较低下。

NIO

BIO的问题在与应用程序一直处于等待数据准备就绪的状态,阻塞了整个应用程序。而BIO改进的地方就是,当数据没准备好的时候,内核直接告诉应用程序数据没有准备好就行了,不需要应用程序等待。

执行过程过程如下图所示:

当操作系统数据没有准备好时,立即返回,不需要阻塞等待,应用程序通过多次系统调用来等待数据操作完成。当有多个IO请求时候,每个都需要占用一个进程不断执行系统调用来查询数据是否准备完成,耗费大量的CPU资源。

为了解决上面的问题,进化出了IO多路复用。

假如说有3个IO操作,用一个线程专职负责轮询操作系统这三个IO操作的数据是否准备就绪,不需要每个IO操作都用一个线程去轮询。这就是多路复用。执行过程如下图所示:

select专职监听各个IO操作是否就绪,此时应用程序也是阻塞的,当其中某个socket有数据准备就绪时,select返回通知应用程序,此时应用程序查找select监听的各个socket中哪个socket数据准备完成,执行后续操作。在这个过程中有个问题,应用程序还是需要挨个查询所有监听的socket查找数据准备就绪的socket,并且执行select调用时,还需要将全部监听的socket由用户空间复制到内核,执行效率不高,后续就产生了各种优化后的多路复用IO模型,如epoll。我们之后再单独详细分析。

AIO

NIO的过程是当操作系统数据准备好时通知应用程序,应用程序发起一起系统调用,将数据从内核复制到用户空间,然后应用程序读取数据做后续处理。异步调用采用了不同的方式,看下图:

从图中可以看到,AIO和NIO最大的区别在于,AIO是当数据准备好并且将数据从内核复制到用户空间的时候才会通知应用程序,应用程序可以继续执行,不需要阻塞,当收到数据准备完成通知时候,应用程序也不需要再发起一次系统调用取数据,直接去用户空间取数据即可。

本篇先捋清楚几种基础的IO模型,后续会展开详细分析。

epoll nio区别_什么是BIO,NIO与AIO相关推荐

  1. epoll nio区别_大厂面试系列(二)::NIO和Netty

    NIO和Netty面试题 NIO 阐述 NIO原理? BIO/NIO/AIO有什么区别?有那些实现? 讲讲NIO的原理与实现?NIO用到了哪个经典技术思想?JDK1.8中NIO有做什么优化 了解多路复 ...

  2. java nio使用_什么时候使用NIO?

    一.前言 学习了Java IO 和 NIO之后,肯定会问:我们到底什么时候该使用 IO,什么时候该使用 NIO? 在下文中我会尝试用例子阐述java NIO 和IO的区别,以及它们对你的设计会有什么影 ...

  3. Java传统的io和nio区别_Java中IO和NIO的本质和区别

    简介 终于要写到java中最最让人激动的部分了IO和NIO.IO的全称是input output,是java程序跟外部世界交流的桥梁,IO指的是java.io包中的所有类,他们是从java1.0开始就 ...

  4. bio nio aio区别_什么是BIO、NIO和AIO?

    周末午后,在家里面进行电话面试,我问了面试者几个关于IO的问题,其中包括什么是BIO.NIO和AIO?三者有什么区别?具体如何使用等问题,但是面试者回答的并不是很满意.于是我在面试评价中写道:&quo ...

  5. epoll nio区别_【总结】两种 NIO 实现:Selector 与 Epoll

    我想用这个话题小结下最近这一阶段的各种测试和开发.其实文章的内容主要还是想总结一下 NIO Socket ,以及两种不同操作系统实现 NIO 的方式, selector 和 epoll . 问题应该从 ...

  6. epoll nio区别_高性能网络服务器编程:为什么linux下epoll是最好,Netty要比NIO.2好?...

    基本的IO编程过程(包括网络IO和文件IO)是,打开文件描述符(windows是handler,java是stream或channel),多路捕获(Multiplexe,即select和poll和ep ...

  7. java nio 框架_几种Java NIO框架的比较(zz)

    问题:生活中工作中,会有人问我javaNIO框架里面 Netty Mina  xSocket Grizzly 等等哪个比较好? 在这里写一下自己的感受,也算是总结一下吧 在我的印象中.不管是什么NIO ...

  8. IO之 java中BIO NIO AIO原理、区别以及应用

    在本篇文章中,我们主要介绍一下java中的BIO NIO AIO,重点是NIO 先说一下同步.异步.阻塞和非阻塞. 简单来讲,同步和异步是针对内核和应用程序之间的交互而言的:阻塞和非阻塞其实是针对进程 ...

  9. bio nio aio区别_8分钟深入浅出搞懂BIO、NIO、AIO

    在高性能的IO体系设计中,BIO.NIO.AIO的概念,常常会让我们感到困惑不解.在Java面试中,我们也经常会被问到这个问题.譬如: BIO.NIO.AIO 的概念 同步/异步.阻塞/非阻塞的区别 ...

  10. nio和bio的原理_Java的BIO,NIO和AIO的区别于演进

    前言 Java里面的IO模型种类较多,主要包括BIO,NIO和AIO,每个IO模型都有不一样的地方,那么这些IO模型是如何演变呢,底层的原理又是怎样的呢? 本文我们就来聊聊. BIO BIO全称是Bl ...

最新文章

  1. 日志中的秘密 Windows登录类型都有哪些
  2. CSP认证202012-1期末预测之安全指数[C++题解]:简单题
  3. Unity3D学习笔记之九为场景添加细节(二)
  4. java代码实现链表_java单链表代码实现
  5. OA 办公系统 模块设计
  6. HTTP与HTTPS的安全性讨论
  7. ESP32,使用gitee搭建 ESP-IDF 开发框架
  8. cuSPARSE库:(四)不同矩阵格式在内存中的存储方式
  9. PHPStorm 调式JS /同时调式PHP和jS
  10. 善领dsa android正式版,善领DSA Android(安卓)正式版
  11. HYSBZ 3991 寻宝游戏
  12. dns解析失败的处理办法
  13. 如何用计算机将图片整成手绘画,【新手教程】如何将手绘作品转变成电子档,并让其更像“作品”?...
  14. 商家转账到零钱快速开通方法
  15. 五个网络游戏植入商品营销的案例
  16. Oracle 语法中的 INSERT INTO
  17. python 课后习题:项目二数据分析之《冰与火之歌》全五卷人物关系图
  18. (小记)matlab导出模糊控制器中的surface viewer和隶属度曲线
  19. TS报错:TS2532: Object is possibly ‘undefined‘.
  20. jquery change 事件

热门文章

  1. 标记分布学习LDL与多标记学习MLL以及单标记学习
  2. 基于TensorRT量化部署RepVGG模型
  3. 重磅直播|结构光3D相机光机核心技术及3D成像性能分析
  4. Unity3D笔记 愤怒的小鸟二 实现Play界面
  5. wpf对数据库简单操作
  6. 10个新鲜出炉的JQuery插件(ITEye)
  7. 智能优化算法:人工电场优化算法-附代码
  8. 【LeetCode】【数组】题号:*645,重复数字和缺失数字
  9. 从零基础入门Tensorflow2.0 ----二、5.2实战sklearn封装keras模型(超参数搜索)
  10. 从零基础入门Tensorflow2.0 ----一、3.1 实战深度神经网络