阻塞 非阻塞 同步 异步理解

在学习过程中总会遇到什么是阻塞?非阻塞?同步?异步?

他们之间到底有什么关系呢?今天去知乎上边看了一下,对其有了理解,现在就来说一下。

阻塞和非阻塞

从一个简单地读取文件的模型举例。

在发起读取文件的请求时,应用层会调用系统内核的 I/O接口。

如果应用层调用的是阻塞型I/O,那么在调用之后,应用层会立刻被挂起,一直处于等待数据返回的状态,直到系统内核从磁盘读取完数据并返回给应用层,应用层才用获得的数据进行接下来的操作。

 

如果调用的是非阻塞I/O,那么调用后,系统内核会立即返回(虽然数据还没返回)应用层不会被挂起,他可以做其他的操作。()

 

这是(脱离同步和异步之后)阻塞和非阻塞的区别。总的来说,是阻塞还是非阻塞,关注的是接口调用(发出请求)后等待数据返回的状态。被挂起无法执行其他操作的是阻塞型,可以立即去做其他的操作的是非阻塞型的。

 

   

 

 

同步和异步

阻塞和非阻塞解决了用用层等待数据返回时的状态,那系统内核获取到的数据到底是如何返回给应用层呢?这里不同类型的操作便体现了同步和异步。

 

对于同步型的调用,应用层需要自己去向系统内核问询,如果数据还未读取完,那此时读取文件的任务还未完成,应用层根据其阻塞和非阻塞的划分,挂起或者去做其他的事情(所以同步和异步不决定其等待数据返回时的状态),如果数据已经读取完毕那此时系统内核将数据返回给应用层,应用层可以用取得的数据做其他相关的事。

对于异步的调用,应用层无需主动向系统内核询问,在系统内核读取完文件之后,会主动通知应用层数据已经读取完毕,此时应用层即可接受返回的数据,再做其他的事情。

 

这便是(脱离阻塞和非阻塞来说)同步和异步的区别。也就是说,是否同步还是异步关注的是完成任务时消息通知的方式。由调用方盲目主动问询的方式是同步调用,由被调用方主动通知调用方任务已完成的方式是异步调用。

 

                    

 

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

同步有阻塞和非阻塞之分,异步没有,他一定是非阻塞的。

参考

https://www.cnblogs.com/aspirant/p/6877350.html?utm_source=itdadao&utm_medium=referral

posted @ 2018-04-11 17:47  雅森  阅读(104)  评论(0)    收藏  举报