返回信息流阻塞:客户端向服务端发起请求,在请求执行返回之前,客户端一直在阻塞等待返回。
非阻塞:客户端向服务端发起请求,服务端立刻返回,客户端不断轮询去问服务端,直到服务端返回。
同步:客户端向服务端发起请求,在请求执行返回之前,客户端不做其他操作等待返回。(这跟阻塞有什么区别)
异步:客户端向服务端发起请求,服务端立刻返回,在请求执行完毕之后,服务端返回给客户端。
这是一条镜像帖。来源:北邮人论坛 / cpp / #97010同步于 2017/12/12
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
网络编程里阻塞、非阻塞和同步、异步怎么区分开,已经被弄晕了
birds
2017/12/12镜像同步7 回复
订阅后,新回复会通过你的通知中心匿名送达。
7 条回复
赞,谢谢同学,看了之后,还是没太明白,理解能力有限
【 在 intmain 的大作中提到: 】
: 看看这个是不是你想要的:
: https://segmentfault.com/a/1190000003063859
对于新人,这个确实是很迷惑的概念啊。
首先,阻塞和非阻塞,异步和同步,是不能并列的两个概念。而且它们之间是可以两两组合的,比如存在阻塞且异步,阻塞且同步,非阻塞且同步,非阻塞且同步。
然后,阻塞和非阻塞是对于IO来说的。存在阻塞IO调用和非阻塞IO调用。但是,在linux中,只有网络io存在非阻塞io,磁盘io是不存在非阻塞io的,即使你设了NON_BLOCK也没用。
比如,网络io中非阻塞调用指的是该调用会去查看内核socket的缓存区中有没有接受到数据,如果有则读取数据,没有就返回特定的标示。
但是,如果是网络io中的阻塞调用指的是,调用会同样查看内核socket的缓存区中有没有接受到数据,如果有就读取,没有就会阻塞等待,直到有数据为止,此时线程会进入阻塞状态,让出cpu。
那为什么在linux上磁盘io不实现非阻塞io呢?楼主可以想想磁盘io和网络io有什么异同。
接着,说说异步和同步。异步和同步其实是分布式系统,或者多核系统中的概念。在分布式系统领域,有一个有名的FLP impossible定理,说的是在一个异步通信系统中,没有一个算法能够让系统达成一致。
在同步通信中,请求发起方发起的请求,可能会有三种状态,返回成功,返回失败,超时。但是在异步通信系统中,只有返回成功,或者失败,但是不存在超时,可能会等待无限长,这就是异步系统。
而且,在异步系统中,对时间和消息顺序是没有要求的。但是,我们常遇见的说一个网络框架是同步的,或者异步的,更多的指的是编程模型。你可以简单的理解为,自己做的就是同步,交给别人做的就是异步。
最后,这里写的可能还不够细,如果楼主有需要,我有空的话写篇博客细说下。