理解同步/异步和阻塞/非阻塞的区别

关于同步、异步与阻塞、非阻塞的理解

一、前言html

  前一段时间出去面试,被问到同步、异步与阻塞、非阻塞的区别。我一时半会没有想出来,做为一个工做三年的人来讲,实在很惭愧。我当时理解同步、异步属于两个进程中间的协做关系,例如使用浏览器访问一个网站,须要屡次请求服务端,才能加载完整个页面的内容。同步的操做以下:浏览器首先发送第一个请求,等待服务器回复后,再发送第二个请求,依次类推,直到全部请求完成。异步的操做以下:浏览器发送第一个请求,能够不用等待服务器返回,能够继续发送第二个请求。阻塞与非阻塞属于进程的API执行动做的方式,例如进行须要read数据,阻塞方式操做流程是:若是没有数据,则read会一直等着数据到来,才能进行后续的动做;而非阻塞则是read没有到数据后,则能够进行后续的动做,当有数据的时候再回来读取。一般linux网络API默认都是阻塞的,例如connect、send、recv等。回答后感受本身内心没有底,底层的关系究竟是什么样的,比较虚,没能深刻理解。linux

二、深刻理解分析  面试

  回来之后,赶忙上网好好查查,加深学习一下。这两个概念在工做中常常用到这些,例如在linux网络IO中涉及到以下模型:浏览器

(1)阻塞式IO服务器

(2)非阻塞式IO网络

(3)IO多路复用异步

(4)信号驱动IO学习

(5)异步IO网站

在知乎上面看到一些解释以下:spa

截图以下:

三、总结

  

  同步和异步针对应用程序来,关注的是程序中间的协做关系;阻塞与非阻塞更关注的是单个进程的执行状态。

同步:执行一个操做以后,等待结果,而后才继续执行后续的操做。

异步:执行一个操做后,能够去执行其余的操做,而后等待通知再回来执行刚才没执行完的操做。

阻塞:进程给CPU传达一个任务以后,一直等待CPU处理完成,而后才执行后面的操做。

非阻塞:进程给CPU传达任我后,继续处理后续的操做,隔断时间再来询问以前的操做是否完成。这样的过程其实也叫轮询。

   阻塞、非阻塞、多路IO复用,都是同步IO,异步一定是非阻塞的,因此不存在异步阻塞和异步非阻塞的说法。真正的异步IO须要CPU的深度参与。换句话说,只有用户线程在操做IO的时候根本不去考虑IO的执行所有都交给CPU去完成,而本身只等待一个完成信号的时候,才是真正的异步IO。因此,拉一个子线程去轮询、去死循环,或者使用select、poll、epool,都不是异步。

参考网址:

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

https://www.zhihu.com/question/27965282

http://www.smithfox.com/?e=191

https://zhuanlan.zhihu.com/p/21416728

http://blog.csdn.net/dinglang_2009/article/details/50461697

相关文章
相关标签/搜索