IO的阻塞与非阻塞、同步与异步

同步与异步、阻塞与非阻塞的概念都是在IO的场合下。

IO操作中涉及的2个主要对象为程序进程、系统内核。以读操作为例,当一个IO读操作发生时,通常经历两个步骤:

  1,等待数据准备

  2,将数据从系统内核拷贝到操作进程中

  例如,在socket上的读操作,步骤1会等到网络数据包到达,到达后会拷贝到系统内核的缓冲区;步骤2会将数据包从内核缓冲区拷贝到程序进程的缓冲区中。

 

同步

      就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回。按照这个定义,其实绝大多数函数都是同步调用。当前线程一直处于运行状态。

      想象一个同步模式的场景:

      A 小明来找小刚借书:“小刚啊,你那本XXX借我看看”。 于是小刚就去找书,小明就等着看着小刚找书,如果小刚找到了,小明就拿到了书;如果小刚一直没找到,小明就一直等待着。


异步

      异步的概念和同步相对。当一个异步过程调用发出后,调用者不能立刻得到结果。
      B 一天小明来找小刚借书:“小刚啊,你那本XXX借我看看”,说完小明就去打球。而小刚记得了“借书给小明”的事,如果小刚记起该事,就去找书,找到就交给小明;如果小明忘记该事,小刚拿不到该书。


阻塞

       阻塞调用是指调用结果返回之前,当前线程会被挂起,函数只有在得到结果之后才会返回。如果没有数据的情况下调用该函数,则当前线程就会被挂起,直到有数据为止。

       想象一个阻塞模式的场景:

       C 一天小明来找小刚借书:“小刚啊,你那本XXX借我看看”。 于是小刚就去找书,小明就等着小刚找到的消息,如果小刚找到了,告诉小明“书找到了”。小明回过神来,开心得拿到书;如果小刚还是没找到了,小明继续等待,一直找到为止。


非阻塞

       和阻塞的概念相对应,指在不能立刻得到结果之前,该函数不会阻塞当前线程,而会立刻返回。

       想象一个非阻塞模式的场景:

       D 一天小明来找小刚借书:“嘿小刚,你那本XXX借我看看”。 小刚说:“我得找一会”,小明就去打球去了。如果小刚找到了,立刻通知小明“书找到了”,小明放下打球,立刻回去把书拿回来。如果小刚没找到了,也通知小明“书没找到了”,小明也放下打球,去处理下一步。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值