什么是阻塞/非阻塞和同步/异步

本文深入探讨了同步/异步、阻塞/非阻塞的概念,澄清了常见的误解。同步与异步关注消息通信机制,而阻塞和非阻塞关注程序在等待结果时的状态。在进程间通信中,同步/异步和阻塞/非阻塞并非完全独立的维度,而是密切相关。阻塞/非阻塞主要体现在IO系统调用上,非阻塞IO和异步IO在处理高并发时能提高服务器的吞吐量,通过用户支持线程和非阻塞系统调用实现线程级别的IO并发,从而减少资源消耗和切换开销。

作者:萧萧
链接:https://www.zhihu.com/question/19732473/answer/241673170
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
IO 概念区分四个相关概念:同步(Synchronous)异步( Asynchronous)阻塞( Blocking )非阻塞( Nonblocking)这四个概念的含义以及相互之间的区别与联系,并不如很多网络博客所写的那么简单, 通过举一些什么商店购物, 买书买报的例子就能讲清楚。进程间通信的同步/异步, 阻塞/非阻塞首先强调一点, 网络上很多博文关于同步/异步, 阻塞非阻塞区别的解释其实都经不起推敲。 例如在 严肃 的这一高赞回答中 , 有如下解释(不准确):同步/异步关注的是消息通信机制 (synchronous communication/ asynchronous communication) 。
所谓同步,就是在发出一个调用时,在没有得到结果之前, 该调用就不返回。异步则是相反,调用在发出之后,这个调用就直接返回了,所以没有返回结果阻塞/非阻塞关注的是程序在等待调用结果(消息,返回值)时的状态.阻塞调用是指调用结果返回之前,当前线程会被挂起。调用线程只有在得到结果之后才会返回。非阻塞调用指在不能立刻得到结果之前,该调用不会阻塞当前线程。粗一看, 好像同步/ 非同步, 阻塞/非阻塞 是两种维度的概念, 可以分别对待, 但是稍微推敲一下就会发现上述的解释存在不妥之处。如果“同步”是发起了一个调用后, 没有得到结果之前不返回, 那它毫无疑问就是被“阻塞”了(即调用进程处于 “waiting” 状态)。如果“异步”调用发出了以后就直接返回了, 毫无疑问, 这个进程没有被“阻塞”。
所以, 上述的解释是不准确的。 让我们看一下《操作系统概念(第九版)》中有关进程间通信的部分是如何解释的:

翻译一下就是:进程间的通信是通过 send() 和 receive() 两种基本操作完成的。具体如何实现这两种基础操作,存在着不同的设计。
消息的传递有可能是阻塞的或非阻塞的 – 也被称为同步或异步的:阻塞式发送(blocking send). 发送方进程会被一直阻塞, 直到消息被接受方进程收到。非阻塞式发送(nonblocking send)。 发送方进程调用 send() 后, 立即就可以其他操作。阻塞式接收(blocking receive) 接收方调用 receive() 后一直阻塞, 直到消息到达可用。非阻塞式接受(nonblocking receive) 接收方调用 receive() 函数后, 要么得到一个有效的结果, 要么得到一个空值, 即不会被阻塞。上述不同类型的发送方式和不同类型的接收方式,可以自由组合。也就是说, 从进程级通信的维度讨论时, 阻塞和同步(非阻塞

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值