阻塞与非阻塞,同步与异步的区别?

1.阻塞与非阻塞,同步与异步的区别?

  • Unix IO模型的语境下,同步和异步的区别在于数据拷贝阶段是否需要完全由操作系统处理。
  • 阻塞和非阻塞操作是针对发起IO请求操作后,是否有立刻返回一个标志信息而不让请求线程等待

在处理 IO 的时候,阻塞和非阻塞都是同步 IO。
只有使用了特殊的 API 才是异步IO

在这里插入图片描述
参考:

https://www.zhihu.com/question/19732473/answer/26101328

https://www.cnblogs.com/laowz/p/11111312.html

2.同步异步、阻塞非阻塞的区别

(1)同步与异步

  • 同步和异步关注的是消息通信机制
  • 因为异步IO把IO的操作给了内核,让内核去操作,同步IO的话,需要等待IO操作从内核态的数据缓冲区拷贝到用户态的数据缓冲区,所以此时的同步IO是阻塞的。
  • 异步IO的操作是由内核完成,同步IO的操作是由用户态的应用程序完成的。因为异步IO把IO的操作给了内核,让内核去操作,同步IO的话,需要等待IO操作从内核态的数据缓冲区拷贝到用户态的数据缓冲区,所以此时的同步IO是阻塞的

同步,就是在发出一个调用时,在没有得到结果之前,该调用就不返回。一旦调用返回,就得到返回值。
异步,就是调用在发出之后,这个调用就直接返回了,所以没有返回结果。被调用者通过状态、通知来通知调用者,或通过回调函数处理这个调用

如果把调用一个函数当做成完成一件事的角度看:
同步,就是自己亲自去完成一件事件。
异步,就是叫人代办,叫完人以后操作就返回,但是还不知道结果,等到那个人把事前办完了,才通过通知手段(回调函数等)通知你结果。

(2)阻塞与非阻塞

  • 阻塞和非阻塞关注的是程序在等待调用结果(消息,返回值)时的状态。
  • 阻塞IO和非阻塞IO的区别就在于:应用程序的调用是否立即返回。

从线程的发出调用的角度看:
阻塞,是指调用结果返回之前,当前线程会被挂起。调用线程只有在得到结果之后才会返回。
非阻塞,指在不能立刻得到结果之前,该调用不会阻塞当前线程。

从完成一件事前的角度看:
阻塞,就是在做一件事情的时候,在这一件事情还没有做完之前(还没有得到结果之前),不会做别的事情。
非阻塞,就是在做一件事情的时候,你要做的事情已经完成了,但是还没有出结果,在等待结果的时候,你去干别的事情。

简单来说就是是否在等待一件事情的结果的时候去干别的事情。

参考:

https://blog.zhenlanghuo.top/2017/05/20/%E5%90%8C%E6%AD%A5%E5%BC%82%E6%AD%A5%E3%80%81%E9%98%BB%E5%A1%9E%E9%9D%9E%E9%98%BB%E5%A1%9E%E7%9A%84%E5%8C%BA%E5%88%AB/
https://blog.csdn.net/crazy_tengt/article/details/79225913#commentsedit
相关推荐
©️2020 CSDN 皮肤主题: 数字20 设计师:CSDN官方博客 返回首页