Java中提供的IO有关的API,在文件处理的时候,其实依赖操作系统层面的IO操作实现的(关于Java对IO的三种封装,可见我的另一篇博客)

开门见山,Linux下的如中IO模型:阻塞IO模型,非阻塞IO模型,IO复用模型,信号驱动IO模型,异步IO模型,见下图

接下来一一讲解这5种模型

阻塞型IO:最简单的一种IO模型,简单理解就是死等,即进程或线程一直等待莫格条件,不满足则一直等待。

非阻塞型IO:应用进程与内核交互,目的未达到之前会直接返回,然后不断轮询,不停的去问内核数据是否准备好?如果发现准备好了,那就把数据拷贝到用户空间中。应用进程通过 recvfrom 调用不停的去和内核交互,直到内核准备好数据。如果没有准备好,内

核会返回error,应用进程在得到error后,过一段时间再发送recvfrom请求。在两次发送请求的时间段,进程可以先做别的事情。

信号驱动IO:我们会发现非阻塞型IO方式一遍一遍的轮询不如等内核把数据准备好,然后通知进程,当进程收到该通知时,便开始把数据拷贝到用户空间中。 即应用进程预先向内核注册一个信号处理函数,然后用户进程返回,并不阻塞,当内核数据准备就绪时会发送一个信号给进程,用户进程便在信号处理函数中开始把数据拷贝到用户空间中

IO复用模型:顾名思义,即将多个进程I/0注册到同一管道上,这里管道会统一和内核交互。当管道中的某一个请求需要好的数据准备好之后,进程再把对应的数据拷贝到用户空间中。 I/O多路转接是多了一个Select函数,多个进程的IO可以注册到同一个Select中,用户调用该Select。Select会监听所有注册好的I/O,如果所有被监听的I/O需要的数据都没有准备好,Select调用进程会阻塞。当任意一个I/O所需要的数据准备好之后,Select调用就

会返回,然后进程再通过recvfrom来进行数据拷贝。但实际上,它并未向内核注册信号处理函数,所以它并不是非阻塞的。

看到开篇的那张图,大家肯定会有疑问,为什么之前的这四种模型都是同步的呢?因为无论以上哪种模型,真正的数据拷贝过程都是同步的(自己的理解便是:所有的数据拷贝过程都是用户进程手动执行的)

那么我们来看真正异步执行的I/O模型:

异步I/O模型:应用进程把I/O请求传给内核后,完全由内核去操作文件拷贝。内核完成相关操作后,会发信号告诉应用进程本次I/O已经完成。用户进程发起aio_read操作之后,给内核传递描述符、缓冲区指针、缓冲区大小等,告诉内核进程当整个操作完成时,如何通知进程,然后就立刻去做其他事儿了。当内核收到aio_read后,会立刻返回,然后内核开始等待数据准备,数据准备好以后,直接把数据拷贝到用户控件,然后再通知进程本次IO已经完成。

各个模型的执行流程比较图如下图所示

linux下的五种io模型,Linux下的五种IO模型相关推荐

  1. linux的socket模型有哪些,异步io 编程 Linux Socket五种I/O模型(zhuan(3)

    需要说明的是并非所有的Windows SocketsAPI在非阻塞模式下调用,都会返回WSAEWOULDBLOCK错误.例如,以非阻塞模式的套接字为参数调用bind()函数时,就不会返回该错误代码.当 ...

  2. linux的open的非组赛,Linux下的非阻塞IO库epoll

    今天看到一篇文章,对于epoll讲解的非常生动清晰,转载收藏一下,原文请点击here. 生活中的一个例子 假设你在大学中读书,要等待一个朋友来访,而这个朋友只知道你在A号楼,但是不知道你具体住在哪里, ...

  3. 基础服务器 IO 模型 Proactor 模型 Reactor 模型 IO 多路复用 异步 IO 模型 Linux 服务器开发 网络编程服务器模型

    本文主要记录服务器的 IO 模型的类型(从多路复用,异步 IO 讲到 Proactor Reactor 模型),包括 Real World nginx 和 apache ,kafka 等分析,配备自洽 ...

  4. linux下java写ftp服务器端,在Linux下部署网站(java环境部署)第五章 FTP服务器搭建...

    第五章 FTP服务器搭建 1.看看是否已经安装FTP服务器 service vsftpd start ftp localhost 如果不认识ftp命令是因为没有安装ftp的client包,需要拿安装光 ...

  5. linux 最快的,五种方式装Linux哪种最快

    mask宇 于 2012-05-20 00:46:44发表: 个人觉得硬盘的传输速率更快 所以悬着硬盘. Hoo_h 于 2012-05-20 00:18:54发表: 想尝试硬盘安装,用过光盘和U盘 ...

  6. linux 清空catalina.out日志 不需要重启tomcat(五种方法)【转】

    1.重定向方法清空文件 [root@localhost logs]# du -h catalina.out  查看文件大小 17M catalina.out [root@localhost logs] ...

  7. linux系统可以用autocad吗,在Linux操作系统下最佳的五款CAD软件

    以下为你介绍在 Linux 操作系统下最佳的五款 CAD(计算机辅助设计) 软件,部分附有在 Ubuntu 下的安装命令,是很多工程流程中不能缺少的一部分,CAD 常用于建筑.汽车零件设计.航天飞机研 ...

  8. linux服务器清除cdn,Linux服务器中查找并删除大文件的五种方法,Linux系统清除文件内容的命令分享...

    很多时候,在处理Linux终端中的文件时,您可能希望清除文件的内容,而无需使用任何Linux命令行编辑器打开它.怎么能实现这一目标?在本文中,我们将借助一些有用的命令,通过几种不同的方式清空文件内容. ...

  9. linux+Qt 下利用D-Bus进行进程间高效通信的三种方式

    linux+Qt 下利用D-Bus进行进程间高效通信的三种方式 原文链接: https://www.cnblogs.com/wwang/archive/2010/10/27/1862552.html ...

最新文章

  1. 阿里平头哥会和AMD一样成为令英特尔头痛的存在吗?
  2. php项目包导入项目,zend studio导入项目文件的图文操作
  3. Deepin v20依赖错误,检测更新失败解决办法
  4. Oracle数据库文件恢复与备份思路
  5. 机器学习中的数学知识(part3)--凸优化
  6. poj 2486 树形dp
  7. vba 正则表达式_VBA中正则表达式与数组结合的应用案例!
  8. 10.C++-构造函数初始化列表、类const成员、对象构造顺序、析构函数
  9. 走进COM组件系列(一)
  10. Angular官方教程采坑
  11. HTML在线visio进行简单布局,visio2007教程
  12. windows权限提升——烂土豆+dll劫持+引号路径+服务权限
  13. python winrar 密码_python+winrar 指令压缩文件
  14. html5 拖拽 编辑 插件,超给力 Vue.js 可视化H5拖拽编辑器Quark-H5
  15. 游戏运营杂谈之------达克效应的启示
  16. 一个好玩的小游戏——麻神之战
  17. angular学习-数据绑定
  18. 部分互联网公司及通信公司校招时间表及薪资(参考2017)
  19. 青岛方言发音对照表(内附英文释义)
  20. 高数之 左右极限求法

热门文章

  1. 安卓跑linux程序_Android下运行Linux可执行程序
  2. 高斯信道、单径Rayleigh信道和多径衰落信道下基带模型的多用户BPSK直接序列扩频系统MATLAB仿真(m序列、Gold序列和正交Gold序列)
  3. 【Error】IDEA报错:org.jetbrains.jps.builders.java.dependencyView.TypeRepr$PrimitiveType cannot be cast t
  4. linux shm_open,c – 如何更改shm_open路径?
  5. ListView常用属性、方法
  6. MySQL(一)基础操作
  7. 20155330 2016-2017-2 《Java程序设计》第五周学习总结
  8. 记录踩过的坑——代理IP
  9. 【JSP】JSP与oracle数据库交互案例
  10. [003]容器和动态数组的使用