当前位置: 首页 > news >正文

IO的学习笔记 - 同步,异步,阻塞,非阻塞

       这几天花了些时间研究IO的相关概念,记录下自己的一些学习思考。

       网上太多的文章都是你抄我,我抄你,真正是害人不浅。在这里特别介绍一篇好文:《IO - 同步,异步,阻塞,非阻塞(亡羊补牢篇)》 

       总结下自己的学习心得:

       一. 网络IO都必须经历的两个阶段:

       对于一个network IO (这里我们以read举例),它会涉及到两个系统对象,一个是调用这个IO的process (or thread),另一个就是系统内核(kernel)。当一个read操作发生时,它会经历两个阶段:

       1 等待数据准备 (Waiting for the data to be ready)

       2 将数据从内核拷贝到进程中 (Copying the data from the kernel to the process)

       这两个阶段是所有IO模型都会经历的,他们的区别也体现在这两个阶段的不同。

        二. 阻塞IO和非阻塞IO的区别

        阻塞IO在操作全部进行完之前会一直block进程。

        非阻塞IO在内核准备数据时,会马上返回,不会block住进程

        三. 同步与异步的区别

        英文介绍:

          A synchronous I/O operation causes the requesting process to be blocked until that I/O operation completes;(同步)
          An asynchronous I/O operation does not cause the requesting process to be blocked;
 (异步)

        阻塞IO,非阻塞IO都是属于同步,这里是玩了一个“文字游戏”:

          “有人可能会说,non-blocking IO并没有被block啊。这里有个非常“狡猾”的地方,定义中所指的”IO operation”是指真实的IO操作,就是例子中的recvfrom这个system call。non-blocking IO在执行recvfrom这个system call的时候,如果kernel的数据没有准备好,这时候不会block进程。但是,当kernel中数据准备好的时候,recvfrom会将数据从kernel拷贝到用户内存中,这个时候进程是被block了,在这段时间内,进程是被block的。而asynchronous IO则不一样,当进程发起IO 操作之后,就直接返回再也不理睬了,直到kernel发送一个信号,告诉进程说IO完成。在这整个过程中,进程完全没有被block”

      四. 举例

      最后,再举几个不是很恰当的例子来说明这四个IO Model:

      有A,B,C,D四个人在钓鱼:

      A用的是最老式的鱼竿,所以呢,得一直守着,等到鱼上钩了再拉杆;(阻塞IO)

      B的鱼竿有个功能,能够显示是否有鱼上钩,所以呢,B就和旁边的MM聊天,隔会再看看有没有鱼上钩,有的话就迅速拉杆;(非阻塞IO)

      C用的鱼竿和B差不多,但他想了一个好办法,就是同时放好几根鱼竿,然后守在旁边,一旦有显示说鱼上钩了,它就将对应的鱼竿拉起来;(IO多路复用(I/O multiplexing))

      D是个有钱人,干脆雇了一个人帮他钓鱼,一旦那个人把鱼钓上来了,就给D发个短信。 (异步IO)

转载于:https://www.cnblogs.com/lengyuhong/archive/2011/08/18/2145009.html

相关文章:

  • Qt Creator 的 error: collect2: ld returned 1 exit status 问题
  • C++ 类的本质 札记
  • 【转】【翻译】Orx官方教程:4.(anim)动画
  • Android之Providing Resources(提供资源)
  • SAP ECC Web Dynpro ICM Config...
  • 算法之美:排序
  • 基于dedup技术的远程相似文件同步
  • 在Silverlight中对多个异步任务的调用
  • OGC标准介绍 4
  • POJ1991 Turning in Homework——贪心+动态规划——Pku1991
  • 在不影响页面内容的情况下来减少站点的页面输出量、增加页面的访问速度。...
  • c#缓存介绍(转)
  • SQL表达式结果集的小数精度
  • 随机取数据算法性能比较
  • 2010年7月微软最有价值专家(MVP)当选名单
  • 4个实用的微服务测试策略
  • Angular 4.x 动态创建组件
  • ESLint简单操作
  • FastReport在线报表设计器工作原理
  • learning koa2.x
  • Transformer-XL: Unleashing the Potential of Attention Models
  • 从PHP迁移至Golang - 基础篇
  • 从零开始的无人驾驶 1
  • 反思总结然后整装待发
  • 力扣(LeetCode)21
  • 名企6年Java程序员的工作总结,写给在迷茫中的你!
  • 前嗅ForeSpider教程:创建模板
  • 前嗅ForeSpider中数据浏览界面介绍
  • 人脸识别最新开发经验demo
  • 【运维趟坑回忆录】vpc迁移 - 吃螃蟹之路
  • 机器人开始自主学习,是人类福祉,还是定时炸弹? ...
  • ​LeetCode解法汇总2304. 网格中的最小路径代价
  • # Java NIO(一)FileChannel
  • #NOIP 2014# day.1 T3 飞扬的小鸟 bird
  • #QT(智能家居界面-界面切换)
  • #Z2294. 打印树的直径
  • #调用传感器数据_Flink使用函数之监控传感器温度上升提醒
  • #考研#计算机文化知识1(局域网及网络互联)
  • #我与Java虚拟机的故事#连载05:Java虚拟机的修炼之道
  • ${factoryList }后面有空格不影响
  • (delphi11最新学习资料) Object Pascal 学习笔记---第8章第2节(共同的基类)
  • (二)斐波那契Fabonacci函数
  • (附源码)ssm跨平台教学系统 毕业设计 280843
  • (附源码)计算机毕业设计ssm本地美食推荐平台
  • (剑指Offer)面试题41:和为s的连续正数序列
  • (转)mysql使用Navicat 导出和导入数据库
  • .NET(C#) Internals: as a developer, .net framework in my eyes
  • .net实现头像缩放截取功能 -----转载自accp教程网
  • .Net下C#针对Excel开发控件汇总(ClosedXML,EPPlus,NPOI)
  • /bin、/sbin、/usr/bin、/usr/sbin
  • @javax.ws.rs Webservice注解
  • @软考考生,这份软考高分攻略你须知道
  • [ C++ ] STL---string类的使用指南
  • [Android] Implementation vs API dependency
  • [Bada开发]初步入口函数介绍