本文转载自网络。
如有侵权,请联系处理!
简介
参考《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. 基于id3算法根据房价数据进行画图预测python

    根据已给的波士顿房价数据,对波斯顿房价进行预测.即,实现给出若干条件(如房间数.社区的低收入阶层的比率和镇上学生与教师数量比例的部分数据),要能说出给出的条件是否能够有效进行预测,如可以做有效预测,则 ...

  2. ASP.NET Core3.1使用IdentityServer4中间件系列随笔(五):创建使用[Code-授权码]授权模式的客户端

    配套源码:https://gitee.com/jardeng/IdentitySolution 本篇将创建使用[Code-授权码]授权模式的客户端,来对受保护的API资源进行访问. 1.接上一篇项目, ...

  3. 从零开始的SpringBoot项目 ( 三 ) 项目打包( war包篇 )

    pom.xml 修改打包类型 jar 改为 war 添加 tomcat 依赖 找到最右边的 Maven Projects,点击进去,选择需要打包的项目,并点击 install,就开始打包了,打包前先点 ...

  4. unimrcp plugin 分析

    摘要: unimrcp 访问媒体资源是通过插件实现,社区的代码给出了demo plugin,但是距离一个生产插件还是有一段的距离.这边文章介绍插件的整个逻辑过程,以及如何实现我们自己的插件.

  5. Mac上如何降级Java版本

    升级到了Java9,有些工具就不工作了.因此要降级到Java8.方法: /Library/Java/JavaVirtualMachines/下的高版本SDK即可

  6. Q20200511-01 翻转字符串

    需求:做一函数将字符串倒转过来 程序: package test4; public class Reverse { public static String reverse(String origin ...

  7. 转载:Redis主从复制与高可用方案

    转载自: https://www.cnblogs.com/lizhaojun-ops/p/9447016.html 原文链接:http://gudaoyufu.com/?p=1230 redis主从复 ...

  8. upstream--负载

    语法格式: upstream 负载名 { [ip_hash;] server ip:port  [weight=数字]  [down]; server ip:port  [weight=数字]; } ...

  9. python - 模块调用

    基础 调用模块常见的两种方法 import [模块名] from [模块名] import [属性/方法] 进阶用法 调用父级目录下模块 背景介绍 目录new2(b2.py)调用上级目录new1(b1 ...

  10. 单应用模式 - Layuiadmin单页版放入TP6.0的部署方案

    thinkphp6.0.3单应用模式.layuiadmin1.4.0单页版,不需要tp的视图驱动 1. 复制 src.start 两个文件夹 2. 粘贴到 thinkphp 的 public 目录下 ...