一、前言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