阻塞IO, 非阻塞IO, 同步IO,异步IO 介绍


先说明几个概念

  • 用户空间与内核空间

    • 为了保证用户进程不能直接操作内核(kernel),保证内核的安全,操心系统将虚拟空间(内存)划分为两部分,一部分为内核空间,一部分为用户空间。
    • 针对linux操作系统而言,将最高的1G字节(从虚拟地址0xC0000000到0xFFFFFFFF),供内核使用,称为内核空间,而将较低的3G字节(从虚拟地址0x00000000到0xBFFFFFFF),供各个进程使用,称为用户空间。
  • 进程切换
    • 为了控制进程的执行,内核必须有能力挂起正在CPU上运行的进程,并恢复以前挂起的某个进程的执行。这种行为被称为进程切换。
  • 进程的阻塞
    • 正在执行的进程,由于期待的某些事件未发生,如请求系统资源失败、等待某种操作的完成、新数据尚未到达或无新工作做等,则由系统自动执行阻塞原语(Block),使自己由运行状态变为阻塞状态。可见,进程的阻塞是进程自身的一种主动行为,也因此只有处于运行态的进程(获得CPU),才可能将其转为阻塞状态。当进程进入阻塞状态,是不占用CPU资源的。
  • 文件描述符fd
    • 文件描述符(File descriptor)是计算机科学中的一个术语,是一个用于表述指向文件的引用的抽象化概念。
    • 文件描述符在形式上是一个非负整数。实际上,它是一个索引值,指向内核为每一个进程所维护的该进程打开文件的记录表。当程序打开一个现有文件或者创建一个新文件时,内核向进程返回一个文件描述符。在程序设计中,一些涉及底层的程序编写往往会围绕着文件描述符展开。但是文件描述符这一概念往往只适用于UNIX、Linux这样的操作系统。
  • 缓存 I/O
    • 缓存 I/O 又被称作标准 I/O,大多数文件系统的默认 I/O 操作都是缓存 I/O。在 Linux 的缓存 I/O 机制中,操作系统会将 I/O 的数据缓存在文件系统的页缓存( page cache )中,也就是说,数据会先被拷贝到操作系统内核的缓冲区中,然后才会从操作系统内核的缓冲区拷贝到应用程序的地址空间。
    • 缓存 I/O 的缺点:数据在传输过程中需要在应用程序地址空间和内核进行多次数据拷贝操作,这些数据拷贝操作所带来的 CPU 以及内存开销是非常大的。

阻塞 I/O(blocking IO)

  • 在linux中,默认情况下所有的socket都是blocking,一个典型的读操作流程大概是这样:
  • 个人理解:
    当程序(APP)发起一个read IO:
    1 . 调用系统call,这时内核(kernel)开始准备数据(例:socket等待客户端进入),这个过程会发生阻塞(block);
    2 . 应用程序和操作系统都在等待内核准备数据;
    3 . 当数据准备好后,从内核拷贝数据给用户(拷贝这个过程也是阻塞的)
    4 . 给进程返回一个拷贝完成,整个read IO完成;
  • blocking IO的特点就是在IO执行的两个阶段(准备数据、拷贝数据)都被block了。

非阻塞I/O(non-blocking IO)

  • linux下,可以通过设置socket使其变为non-blocking。当对一个non-blocking socket执行读操作时,流程是这个样子:

  • 个人理解:
    当(APP)发起一个read IO:
    1 . read调用系统的call,当内核数据没有准备好,立刻返回一个error;
    2 . 用户得到这个error可以知道数据还没准备好,于是,用户可以再次发送请求;
    3 . 当内核数据准备好了,并且再次收到用户请求,马上开始从内核拷贝数据给用户;
    4 . 拷贝完成,用户收到数据和一个return,read IO完成。

  • nonblocking IO的特点是用户进程需要不断的主动询问kernel数据好了没有。

多路复用I/O (multiplexing IO)

  • IO multiplexing就是我们说的select,poll,epoll,有些地方也称这种IO方式为event driven IO。select/epoll的好处就在于单个process就可以同时处理多个网络连接的IO。它的基本原理就是select,poll,epoll这个function会不断的轮询所负责的所有socket,当某个socket有数据到达了,就通知用户进程。

  • 个人理解
    当用户发起一个或多个read IO
    1 . 用户把一个或多个read IO交给select;
    2 . select负责轮询内核是否准备好数据;
    3 . 有任何一个准备好数据,select立刻返回;
    4 . 用户收到这个返回,调用系统call,内核收到请求,开始从内核拷贝数据给用户;
    5 . 拷贝完成,用户收到return,readIO完成。

  • I/O 多路复用的特点是通过一种机制一个进程能同时等待多个文件描述符,而这些文件描述符(套接字描述符)其中的任意一个进入读就绪状态,select()函数就可以返回。

异步 I/O(asynchronous IO)

  • inux下的asynchronous IO其实用得很少。先看一下它的流程:

    • 个人理解
      当用户发起一个read:
      1 . 发起请求,调用系统call,立刻收到返回;
      2 . 用户去干其他事情,read交给内核;
      3 . 内核完成数据准备,拷贝数据后,给用户一个signal;
      4 . 用户收到signal和数据,read操作完成
  • 相当于,用户到银行办理业务,递交资料后就不用管了;银行完成所有操作,直接将账单(数据)邮寄给用户,并给用户打电话(完成信号);期间用户可以做自己的事情。

non-blocking IO和asynchronous IO的区别:

  • 在non-blocking IO中,虽然进程大部分时间都不会被block,但是它仍然要求进程去主动的check,并且当数据准备完成以后,也需要进程主动的再次调用recvfrom来将数据拷贝到用户内存。而asynchronous IO则完全不同。它就像是用户进程将整个IO操作交给了他人(kernel)完成,然后他人做完后发信号通知。在此期间,用户进程不需要去检查IO操作的状态,也不需要主动的去拷贝数据。

文档

<wiz_tmp_tag id="wiz-table-range-border" contenteditable="false" style="display: none;">

转载于:https://www.cnblogs.com/limich/p/7477119.html

阻塞IO, 非阻塞IO, 同步IO,异步IO相关推荐

  1. python gevent模块 下载_Python协程阻塞IO非阻塞IO同步IO异步IO

    Python-协程-阻塞IO-非阻塞IO-同步IO-异步IO 一.协程 协程又称为微线程 CPU 是无法识别协程的,只能识别是线程,协程是由开发人员自己控制的.协程可以在单线程下实现并发的效果(实际计 ...

  2. python网络编程基础(线程与进程、并行与并发、同步与异步、阻塞与非阻塞、CPU密集型与IO密集型)...

    python网络编程基础(线程与进程.并行与并发.同步与异步.阻塞与非阻塞.CPU密集型与IO密集型) 目录 线程与进程并行与并发同步与异步阻塞与非阻塞CPU密集型与IO密集型 线程与进程 进程 前言 ...

  3. IO:同步,异步,阻塞,非阻塞

    IO - 同步,异步,阻塞,非阻塞 都是老生常谈的东西,多通读几遍,理解透彻! 实际上同步与异步是针对应用程序与内核的交互而言的.同步过程中进程触发IO操作并等待(也就是我们说的阻塞)或者轮询的去查看 ...

  4. IO中的阻塞、非阻塞、同步、异步概念分析详解

    目录 1.什么是I/O编程 2.阻塞.非阻塞.同步.异步分析 2.1 什么是同步.异步 2.2 什么是阻塞和非阻塞 2.3 阻塞.非阻塞和同步.异步的区别 2.4 编程实现 3.参考文献 1.什么是I ...

  5. Linux IO - 同步,异步,阻塞,非阻塞

    From:http://blog.csdn.net/historyasamirror/article/details/5778378 同步/异步,阻塞/非阻塞概念深度解析:http://blog.cs ...

  6. setstate是同步还是异步_谈谈 IO模型:同步、异步、阻塞、非阻塞

    同步/异步.阻塞/非阻塞 说的是一回事儿吗? 同步/异步.阻塞/非阻塞 你能通俗易懂的讲清楚吗? Java 中的 BIO.NIO.AIO 你了解吗? Socket 编程你还会吗? Linux 操作系统 ...

  7. 网络IO之阻塞、非阻塞、同步、异步总结

    1.前言 在网络编程中,阻塞.非阻塞.同步.异步经常被提到.unix网络编程第一卷第六章专门讨论五种不同的IO模型,Stevens讲的非常详细,我记得去年看第一遍时候,似懂非懂,没有深入理解.网上有详 ...

  8. IO复用\阻塞IO\非阻塞IO\同步IO\异步IO

    本文是对<UNIX网络编程卷1>第6章的总结. 一.            什么是IO复用? 它是内核提供的一种同时监控多个文件描述符状态改变的一种能力:例如当进程需要操作多个IO相关描述 ...

  9. 阻塞和非阻塞、同步和异步 、五种IO模型

    阻塞和非阻塞,同步和异步 1 例子 故事:老王烧开水. 出场人物:老张,水壶两把(普通水壶,简称水壶:会响的水壶,简称响水壶). 老王想了想,有好几种等待方式 1.老王用水壶煮水,并且站在那里,不管水 ...

最新文章

  1. freemarker基本语法及实例
  2. 如何看待团队合作这件事?
  3. 《从paxos到zookeeper》学习笔记(一)
  4. 【图像分割应用】医学图像分割(三)——肿瘤分割
  5. Linux系统(四)LVS集群负载均衡NAT模式
  6. Linux / sudo、su、sudo su、sudo -i 使用和区别
  7. 如何以学习单片机为契机,逐步成为优秀的工程师
  8. excel表转换成txt导入
  9. 小程序分包---组件化开发框架wepyjs的分包
  10. 学习计划Current(2019.4.23)
  11. CentOS_6.x安装VNC_Server
  12. 通过Downward API传递pod元数据
  13. golang之web编程入门
  14. COMSOL 计算流体动力学模型仿真案例(更新中)
  15. 苹果wifi网速慢怎么办_无线WiFi满格网速却很慢怎么办 如何提升网速【详解】
  16. 济南技工学校计算机,济南华力科技技工学校
  17. shell之数学运算
  18. MySQL 推荐书目
  19. Jetpack Compose 初体验(上),retrofit原理面试
  20. 在Outlook2007中设置QQ邮箱为IMAP/SMTP服务器

热门文章

  1. 关闭eureka注册中心
  2. php7.4 微信小程序获取手机号
  3. 一不小心,老司机又翻车了
  4. 用Tensorflow搭建预测磁盘性能的机器学习模型
  5. 如何改变Myeclipse编辑区背景色(转)
  6. 20145328 《信息安全系统设计基础》第2周学习总结
  7. Raid及mdadm命令
  8. CDH5.X完全卸载步骤
  9. HLG 1334 最好的心情[lis 变形]
  10. 错误契约(FaultContract)与异常处理(转)