本文转载自网络。
如有侵权,请联系处理!
简介
参考《UNIX Network Programming Volume 1, ThirdEdition [Electronic resources] : The Sockets Networking API》
进程运行状态分为内核态和用户态两种。
对于文件读取:
第一步:等待数据准备
第二步:将数据从内核空间复制到用户空间中
对于socket:
第一步:等待网络上的数据到达,然后被复制到内核空间
第二步:将数据从内核空间复制到用户空间中
 
同步与异步
同步与异步关注的是进程与内核的交互。同步进程触发IO并等待或者轮询IO是否完成。 异步进程触发IO后直接返回,IO交给内核来处理,完成后内核通知进程IO完成。
 
阻塞与非阻塞
阻塞和非阻塞关注的是进程(线程)在等待调用结果时的状态。阻塞是指调用结果返回之前,当前进程(线程)会被挂起。非阻塞则相反,当前进程(线程)不会被挂起。
 
同步阻塞IO模型
 
进程执行recvfrom系统调用后进程阻塞,等待数据准备好,此时进程让出CPU。当数据准备好后,等待内核将数据复制到用户空间。复制完成后,recvfrom系统调用返回成功,进程解除阻塞。此模型特点是IO过程的两步都会等待。
 
同步非阻塞IO模型
 
进程执行recvfrom系统调用,如果数据还没有准备好,那么recvfrom系统调用返回一个错误。这个过程一直重复,直到数据准备好后,等待内核将数据复制到用户空间。复制完成后,recvfrom系统调用返回成功。此模型特点是,IO过程的第一步不需要等待,而是进程需要不断地询问内核数据是否准备好,此时进程不会让出CPU,而会一直占用CPU,浪费了大量的CPU资源,因此不常用。
 
多路复用IO模型
 
进程执行select系统调用后,进程阻塞。内核监控多个套接字,当某个套接字数据准备好了,则select系统调用返回。此时进程发起recvfrom系统调用,内核将数据复制到用户空间。复制完成后,recvfrom系统调用返回成功。此模型特点是,对于单个IO操作,和阻塞IO相比并没有什么不同。事实上,还更差一些。因为这里需要使用两个系统调用(select 和 recvfrom),而阻塞IO只调用了一个system call (recvfrom)。不过它适合于同时处理多个IO操作,当其中的任意一个进入可读状态,select系统调用就可以返回。在非阻塞IO中,不断地询问socket状态是通过用户进程去进行的,而在多路复用IO中,轮询每个socket状态是内核在进行的,这个效率要比用户进程高的多。
 
信号驱动IO模型
在信号驱动IO模型中,给某个的IO操作注册一个信号处理函数,进程发起sigaction系统调用,等待数据准备好,此时并不会阻塞,用户进程可以执行别的任务。当内核数据准备好了,就会发送一个信号给用户进程,用户进程接收到信号之后,便在信号处理函数中执行recvfrom系统调用,内核将数据复制到用户空间。复制完成后,recvfrom系统调用返回成功。这个模型并不是真正的异步,因为用户进程还要执行recvfrom系统调用,这一步需要等待。
 
异步IO模型
进程执行aio_read系统调用,该系统调用立即返回。具体的数据准备和复制全部由内核来完成,用户进程可以执行别的任务。
 
总结
同步有阻塞和非阻塞之分,异步没有,它一定是非阻塞的,所以不存在异步阻塞和异步非阻塞的说法。
多路复用和信号驱动,在处理业务逻辑上可以说有异步,但在IO操作层面上来说还是同步的。posix.1严格定义的异步IO是要求没有任何一点阻塞,而上述的前面四个(阻塞IO,非阻塞IO,IO复用,信号驱动)都不同程度阻塞了,而且都有一个共同的阻塞: 将数据从内核空间复制到进程空间。

(转载)IO模型的更多相关文章

  1. [转载] 高性能IO模型浅析

    转载自http://www.cnblogs.com/fanzhidongyzby/p/4098546.html 服务器端编程经常需要构造高性能的IO模型,常见的IO模型有四种: (1)同步阻塞IO(B ...

  2. [转载] 网络IO模型

    转载自http://blog.csdn.net/zhoudaxia/article/details/8974779 同步(synchronous) IO和异步(asynchronous) IO,阻塞( ...

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

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

  4. (转载) Linux五种IO模型

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

  5. 深入理解JAVA I/O系列六:Linux中的IO模型(转载的文章非常值得学习)

    From:http://www.cnblogs.com/dongguacai/p/5770287.html IO模型 linux系统IO分为内核准备数据和将数据从内核拷贝到用户空间两个阶段. 这张图大 ...

  6. linux基础编程:IO模型:阻塞/非阻塞/IO复用 同步/异步 Select/Epoll/AIO(转载)

      IO概念 Linux的内核将所有外部设备都可以看做一个文件来操作.那么我们对与外部设备的操作都可以看做对文件进行操作.我们对一个文件的读写,都通过调用内核提供的系统调用:内核给我们返回一个file ...

  7. 【转载】高性能IO模型浅析

    服务器端编程经常需要构造高性能的IO模型,常见的IO模型有四种: (1)同步阻塞IO(Blocking IO):即传统的IO模型. (2)同步非阻塞IO(Non-blocking IO):默认创建的s ...

  8. 【转载】5种网络IO模型

    同步(synchronous) IO和异步(asynchronous) IO,阻塞(blocking) IO和非阻塞(non-blocking)IO分别是什么,到底有什么区别?这个问题其实不同的人给出 ...

  9. 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. 网络 ...

随机推荐

  1. 关于Junit4 和 Junit5.4

    1.    Junit5.4 主要是用于Maven框架 , 对普通类的测试是不可以的. 如这个, junit4可以, junit5.4不可以. 2. Junit不可以使用 static 静态方法. 关 ...

  2. 用python导入20个G的json数据到Mysql数据库

    整体思路参考资料:https://blog.csdn.net/layman2016/article/details/79252499 作业:有一个16个G的跟疫情相关的json新闻大数据(articl ...

  3. windows版redis报错:本地计算机上的Redis服务启动后停止

    解决 1.如果需要临时启动Redis 使用命令:redis-server.exe   redis.windows.conf   --maxheap 200m 说明:200m是指定最大堆内存是200m, ...

  4. playable

    探索TimelinePlayableAPI,让Timeline为所欲为 https://blog.csdn.net/qq826364410/article/details/80534892 Playa ...

  5. Matrix4x4

    Unity3D开发之Matrix4x4矩阵变换 https://www.cnblogs.com/hewei2012/p/4190282.html Matrix4x4 4x4矩阵 http://wiki ...

  6. mysql必知必会——GROUP BY和HAVING

    mysql必知必会——GROUP BY和HAVING 创建表结构 create table `employ_info` ( `id` int(11) NOT NULL AUTO_INCREMENT, ...

  7. pyqt 设置QTabWidget标签页不可选

    pyqt 设置QTabWidget标签页不可选 for i in range(1,7): self.tabWidget.setTabEnabled(i,False)i-对应标签页的位数

  8. 剑指 Offer 55 - I. 二叉树的深度

    题目描述 输入一棵二叉树的根节点,求该树的深度.从根节点到叶节点依次经过的节点(含根.叶节点)形成树的一条路径,最长路径的长度为树的深度. 例如: 给定二叉树 [3,9,20,null,null,15 ...

  9. 转载: Nginx 通览

    转载地址:https://developer.51cto.com/art/201912/608365.htm Nginx 简介 Nginx 是一个免费.开源.高性能.轻量级的 HTTP 和反向代理服务 ...

  10. leetcode刷题-67二进制求和

    题目 给你两个二进制字符串,返回它们的和(用二进制表示). 输入为 非空 字符串且只包含数字 1 和 0. 示例 1: 输入: a = "11", b = "1" ...