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. Boost.Foreach

    BOOST_FOREACH简化了C++的循环遍历序列元素. 支持的序列类型:Boost.Range识别的序列 STL容器 数组 Null-terminated String std::pair of ...

  2. CSS3: border-radius边框圆角详解

    border-radius 基本语法: border-radius : none | <length>{1,4} [/ <length>{1,4} ]? 取值范围: <l ...

  3. redis存储对象,实体类新加字段空指针问题处理

    redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合).zset(sorted set ...

  4. Oracle 基础 游标

    一:游标的基本原理 游标用来处理从数据库中检索的多行记录(使用SELECT语句).利用游标,程序可以逐个地处理和遍历一次检索返回的整个记录集. 为了处理SQL语句,Oracle将在内存中分配一个区域, ...

  5. Oracle 11g R2 for Win7旗舰版(64位)的安装步骤

    1.下载Oracle 11g R2 for Windows的版本 下载地址:http://www.oracle.com/technetwork/database/enterprise-edition/ ...

  6. 初识 Asp.Net内置对象之Application对象

    Application对象 Applocation对象用于共享应用程序级信息,即多个用户可以共享一个Applocation对象. 用户在请求Asp.Net文件时,将启动应用程序并且创建Applicat ...

  7. hihocoder 1082 然而沼跃鱼早就看穿了一切(字符串替换)

    时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 fjxmlhx每天都在被沼跃鱼刷屏,因此他急切的找到了你希望你写一个程序屏蔽所有句子中的沼跃鱼(“marshtomp”,不区 ...

  8. Macbook之安装opencv

    link:http://www.mobileway.net/2015/02/14/install-opencv-for-python-on-mac-os-x/

  9. Sql 求比率 类型 影响 结果

  10. MVC常用 ActionResult

    1.EmptyResult 2.ContentResult 3.FileResult 4.JavaScriptResult 5.JsonResult 6.HttpStatusCodeResult 7. ...