本文转载自网络。
如有侵权,请联系处理!
简介
参考《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. 喵的Unity游戏开发之路 - 在球体上行走

    很多童鞋没有系统的Unity3D游戏开发基础,也不知道从何开始学.为此我们精选了一套国外优秀的Unity3D游戏开发教程,翻译整理后放送给大家,教您从零开始一步一步掌握Unity3D游戏开发. 本文不 ...

  2. 90%的开发都没搞懂的CI和CD!

    据IDC统计,2017年,DevOps的全球软件市场已达到约39亿美元的水平,预计到2022年市场将达到80亿美元左右! 在敏捷软件开发环境中,工作模型和操作需要对公司不断变化的需求具有超级灵活的能力 ...

  3. 如何利用微博客进行seo赚钱营销

    http://www.wocaoseo.com/thread-130-1-1.html       我们知道做SEO就是用人的思维来模仿搜索引擎的习惯,尽量适应seo的规则,并按照搜索引擎的规则和习惯 ...

  4. TCP/IP网络编程之socket交互流程

    一.概要 本篇文章主要讲解基于.net中tcp/ip网络通信编程.在自我进步的过程中记录这些内容,方便自己记忆的同时也希望可以帮助到大家.技术的进步源自于分享和不断的自我突破. 技术交流QQ群:580 ...

  5. openCV - 3. Mat对象

    Mat对象与IplImage对象.Mat对象使用.Mat定义数组 Mat对象与IplImage对象 Mat对象OpenCV2.0之后引进的图像数据结构.自动分配内存.不存在内存泄漏的问题,是面向对象的 ...

  6. 复制一个Python全部环境到另一个环境

    导出此环境下安装的包的版本信息清单  pip freeze > requirements.txt   联网,下载清单中的包到all-packet文件夹 [root@localhost ~]# p ...

  7. .Net 单元测试框架xUnit使用

    使用前需要导入下面的NuGet包:(不然可能会导致测试代码无法运行) .net版本 .net core3.1 Moq这个包只有需要Mock的时候才需要导入(不清楚Mock的话可以留言或自行百度) 开始 ...

  8. 我用 Java 8 写了一段逻辑,同事直呼看不懂,你试试看。。

    业务背景 首先,业务需求是这样的,从第三方电商平台拉取所有订单,然后保存到公司自己的数据库,需要判断是否有物流信息,如果有物流信息,还需要再进行上传. 而第三方接口返回的数据是 JSON 格式的,其中 ...

  9. 跨平台C# UI库

    https://github.com/AvaloniaUI/Avalonia https://www.cnblogs.com/leolion/p/7144896.html https://github ...

  10. 简单对比了一下MonoXml与SystemXml在Unity下的表现

    测试代码 public class NewBehaviourScript : MonoBehaviour { // Use this for initialization void Start () ...