Unix下可用的5种I/O模型分别是:

  • 阻塞IO
  • 非阻塞IO
  • IO复用(select和poll)
  • 信号驱动式IO(SIGIO)
  • 异步IO(POSIX的aio系列函数)
 
阻塞式I/O模型: 
 
 
 
本例子中,我们吧recvfrom函数视为系统调用,为的是区分应用进程和内核,不论它是如何实现的。在上图中,进程调用recvfrom,其系统调用直到数据报到达且被复制到应用进程的缓存或者发生错误才会返回。进行在recvfrom开始到它返回的整段时间内是被阻塞的,recvfrom成功返回后,应用进程开始处理数据报。
 
在调用recvfrom到返回,可以分为两个过程:
  • 内核等待数据
  • 把数据从内核复制到用户空间。
 
可以看到使用阻塞式IO在进行在上面两个过程中都处于等待(阻塞)当中。后面讲到的其他模型和阻塞IO的区别就在于不同的方式处理上面两个进程。
 
非阻塞IO
 
 
 
非阻塞IO和阻塞IO的最大区别在于等待数据这个过程,在阻塞IO中内核处于等待数据的过程中,进程是处于阻塞状态的。而在非阻塞IO中不会阻塞,当数据报没有准备好的时候,会直接返回一个EWOULDBLOCK错误。应用程序像这样对一个非阻塞描述符循环调用recvfrom时,我们称之为轮询,但是持续轮询内核以查看某个操作是否就绪,往往浪费大量的cpu时间。
 
IO复用(select和poll)
 
 
相比阻塞IO,IO复用把等待数据和复制数据到用户缓存区两个操作分开做了,需要两次系统调用。这样看来IO复用不具有什么优势,事实上select的优势在于我们可以等待多个描述符就绪。(socket数据或者是文件数据)
 
JAVA中我们用到的select所对应的IO模型就是IO复用模型。
 
信号驱动式IO(SIGIO)
 
 
 
我们首先开启套接字的信号驱动式IO功能,并且通过sigaction系统调用安装一个信号处理函数,该系统调用立刻返回,我们的进行继续工作。
 
当数据准备好之后,内核就为该进程产生一个SIGIO信号,这个时候进程就知道数据准备好了,可以让内核进行复制数据到用户空间操作了。
 
这个模式比起阻塞IO来说,等待数据这步不需要阻塞。
 
 
异步IO(POSIX的aio系列函数)
 
 
 
应用程序先进行一次系统调度,告诉内核需要监听的描述符,缓存区指针,缓存区大小,文件偏移,该系统调度立马返回。待内核把数据准备好,并且复制到用户空间了,再通知进程,在异步IO中,进程完全不需要阻塞。
 
上面看到的四种模式,在复制数据到用户空间这个过程中,进程都需要阻塞的,唯独异步IO在这个过程中,不需要阻塞。
 
 
 
模型对比
 
 
POSIX把两个属于定义如下:
同步IO操作:导致请求进程阻塞,直到IO操作完成。
异步IO操作:不导致请求阻塞。
 
可以得出结论,阻塞IO,非阻塞IO,复用IO,信号驱动式IO都为同步IO操作,异步IO模型与POSIX的异步IO操作匹配。
 
 
select函数
 
 
 
简单介绍下入参,中间的三个参数readset,writeset,exceptset指定我们要让内核测试读,写和异常条件的描述符。 timeout指定的是超时时间。maxfdpl是最大描述符数。
 
那么什么情况下内核会认为描述符可读或者可写或者异常呢。如下图:
 
 
 
另外,POSIX定义的pselect函数把时间精度从微妙增加到纳秒级,并采用一个指向信号集的指针作为它的一个参数。当有信号需要捕获时,该参数能够让我们避免竞争条件。
 
poll函数提供类似于select的功能,不过能够为流设备提供额外的信息。
 
 
 
以上内容主要是《UNIUX网络编程》关于IO模型章节的一个笔记。
 

5种IO模型的更多相关文章

  1. 简述linux同步与异步、阻塞与非阻塞概念以及五种IO模型

    1.概念剖析 相信很多从事linux后台开发工作的都接触过同步&异步.阻塞&非阻塞这样的概念,也相信都曾经产生过误解,比如认为同步就是阻塞.异步就是非阻塞,下面我们先剖析下这几个概念分 ...

  2. Atitit  五种IO模型attilax总结 blocking和non-blocking synchronous IO和asynchronous I

    Atitit  五种IO模型attilax总结 blocking和non-blocking synchronous IO和asynchronous I   1.1. .3 进程的阻塞1 1.2. 网络 ...

  3. 聊聊 Linux 中的五种 IO 模型

    本文转载自: http://mp.weixin.qq.com/s?__biz=MzAxODI5ODMwOA==&mid=2666538919&idx=1&sn=6013c451 ...

  4. Linux 下的五种 IO 模型

    概念说明 用户空间与内核空间 现在操作系统都是采用虚拟存储器,那么对32位操作系统而言,它的寻址空间(虚拟存储空间)为4G(2的32次方).操作系统的核心是内核,独立于普通的应用程序,可以访问受保护的 ...

  5. [转载] Linux五种IO模型

      转载:http://blog.csdn.net/jay900323/article/details/18141217     Linux五种IO模型性能分析   目录(?)[-] 概念理解 Lin ...

  6. 网络通信 --> Linux 五种IO模型

    Linux 五种IO模型 聊聊Linux 五种IO模型

  7. (四)五种IO模型

    基本概念 我们之前编写的套接字程序都是阻塞式的,其实这也是默认的形式.现在我们需要明确一些概念: 用户空间和内核空间 首先要明确,用户启动的应用程序在系统中以一个进程的形式存在,而无论对于网络数据还是 ...

  8. 2018.5.4 Unix的五种IO模型

    阻塞非阻塞和异步同步 同步和异步关注的是消息通信机制,关注两个对象之间的调用关系. 阻塞和非阻塞关注的是程序在等待调用结果(消息,返回值)时的状态,关注单一程序. Unix的五种IO模型 以下基于Li ...

  9. 【经典】5种IO模型 | IO多路复用

    上篇回顾:静态服务器+压测 3.2.概念篇 1.同步与异步 同步是指一个任务的完成需要依赖另外一个任务时,只有等待被依赖的任务完成后,依赖的任务才能算完成. 异步是指不需要等待被依赖的任务完成,只是通 ...

  10. Linux五种IO模型(同步 阻塞概念)

    Linux五种IO模型 同步和异步 这两个概念与消息的通知机制有关. 同步 所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回.比如,调用readfrom系统调用时,必须等待IO操 ...

随机推荐

  1. Spring MVC学习笔记 01

    applicationcontext.xml的配置 <?xml version="1.0" encoding="UTF-8" ?> <bean ...

  2. 从零开始学JAVA(02)-用Eclipse写hello World

    在安装好JAVA开发环境的前提下开始以下工作,以下文章参考http://blog.csdn.net/ojtojt/article/details/3476157文章,进行测试编写日记,内容版权归原作者 ...

  3. CSU 1552: Friends 图论匹配+超级大素数判定

    1552: Friends Time Limit: 3 Sec  Memory Limit: 256 MBSubmit: 163  Solved: 34[Submit][Status][Web Boa ...

  4. java.util Pattern 和 Mathcer

    1.测试给定的正则表达式是否匹配输入的字符串,这里该正则表达式只使用一次 private String regex ; private String input; @Before public voi ...

  5. 1.6.3 Uploading Data with Solr Cell using Apache Tika

    1. Uploading Data with Solr Cell using Apache Tika solr使用Apache Tika工程的代码提供了一个框架,用于合并所有不同格式的文件解析器为so ...

  6. C#泛型(C#_编程指南)CSDN学习整理笔记

    1.1. 泛型概述 2.0版C#语言和公共语言运行时(CLR)中增加了泛型.泛型将类型参数的概念引入.NETFramework,类型参数使得设计如下类和方法成为可能:这些类和方法将一个或多个类型的指定 ...

  7. JSONP跨域原理和jQuery.getJSON用法

    JSONP是一个非官方的协议,它允许在服务器端集成Script tags返回至客户端,通过javascript callback的形式实现跨域访问(这仅仅是JSONP简单的实现形式).本文主要介绍JS ...

  8. 剑指Offer46 求1+2+...+n

    /************************************************************************* > File Name: 46_Accumu ...

  9. JAVA备忘录

    本文主要是记录一下JAVA: 1.Arrays.的几个用法: fill:数组全部置一个数 sort:排序 binarySearch:二分查找 2.Map的用法: Map<Integer,Inte ...

  10. 504 Gateway Time-out 和 502 Bad Gateway相关处理

    若报:504 Gateway Time-out则与nginx有关 解决方案: #vim nginx.conf 添加以下代码: http{ fastcgi_connect_timeout 300; fa ...