关于同步异步、阻塞非阻塞的一点个人理解

写在前面

本文是作者参考了诸多文章后所写,可能理解上有错误,在此抛砖引玉。
阻塞和非阻塞是指进程访问的数据如果尚未就绪,进程是否需要等待,也就是未就绪时是直接返回还是等待就绪。 而同步和异步是指访问数据的机制,同步一般指主动请求并等待I/O操作完毕的方式,当数据就绪后在读写的时候必须阻塞,异步则指主动请求数据后便可以继续处理其它任务,随后等待I/O,操作完毕的通知,这可以使进程在数据读写时也不阻塞。

1.同步

关于同步,我的理解是任务序列的顺序执行。比如现在有ABC三个任务,只有当A执行完的时候才能执行B,B执行完的时候才能执行C。

轮询

轮询指调用者隔段时间就要询问被调用函数执行完了么。
轮询的缺点就是每隔段时间询问比较耗资源,效率较低
举个例子,买奶茶。现在有三件事要做,1.店员做奶茶,2.你取奶茶。3.你打王者 店员正在做你的奶茶,你用等待的时间来打王者,但是每打10S王者,你就抬头询问店员做好没。没做好就继续打王者,做好了就取奶茶。其中,从低头打王者到抬头询问这个切换时间就是消耗的资源。

2.异步

异步与同步相对。异步则指主动请求数据后便可以继续处理其它任务,随后等待I/O,操作完毕的通知(被调用者执行结果之后再通知调用者。

2.1回调

异步调用后,调用者往往注册一个回调机制,当所等待的事件被触发后通过回调机制来通知调用者。
回调机制通常更为高效。
举个例子,还是上面的买奶茶,还是这三件事,但是这次你不再询问,由店员做好后通知你。当你点好奶茶,店员开始做时,你就去打王者,打啊打啊打,突然店员说,奶茶做好了,你就去取。无须来回切换。

3.阻塞

阻塞和非阻塞通常被用来形容多线程间的相互影响。当一个线程占用了临界区资源,那么其它需要使用这个资源的线程都必须在这个临界区上等待。等待会导致线程挂起,这样就形成了阻塞。如果占用资源的线程一直没有释放资源,那么其它的线程在这个临界区上都不能继续工作。
举个例子,买奶茶。现在有两件事要做,1.店员做奶茶,2.你取奶茶。 店员不做完奶茶你就永远需要在那等,做不了其他事。店员没有做完奶茶阻塞了你取奶茶。

4.非阻塞

非阻塞和阻塞的概念相对应,指在不能立刻得到结果之前,该函数不会阻塞当前线程,而会立刻返回。
比如IO操作中当调用read时,如果有数据收到,就返回数据,如果没有数据收到,就立刻返回一个错误,如EWOULDBLOCK。这样是不会阻塞线程了),
上下文网络io。

举个例子

老张爱喝茶,废话不说,煮开水。
出场人物:老张,水壶两把(普通水壶,简称水壶;会响的水壶,简称响水壶)。
1 老张把水壶放到火上,立等水开。(同步阻塞)
老张觉得自己有点傻
2 老张把水壶放到火上,去客厅看电视,时不时去厨房看看水开没有。(同步非阻塞)
老张还是觉得自己有点傻,于是变高端了,买了把会响笛的那种水壶。水开之后,能大声发出嘀~~~~的噪音。
3 老张把响水壶放到火上,立等水开。(异步阻塞)
老张觉得这样傻等意义不大
4 老张把响水壶放到火上,去客厅看电视,水壶响之前不再去看它了,响了再去拿壶。(异步非阻塞)
老张觉得自己聪明了。
所谓同步异步,只是对于水壶而言。
普通水壶,同步;响水壶,异步。
虽然都能干活,但响水壶可以在自己完工之后,提示老张水开了。这是普通水壶所不能及的。
同步只能让调用者去轮询自己(情况2中),造成老张效率的低下。
所谓阻塞非阻塞,仅仅对于老张而言。
立等的老张,阻塞;看电视的老张,非阻塞。
情况1和情况3中老张就是阻塞的,媳妇喊他都不知道。虽然3中响水壶是异步的,可对于立等的老张没有太大的意义。所以一般异步是配合非阻塞使用的,这样才能发挥异步的效用。——来源网络,作者不明。
作者:愚抄
链接:https://www.zhihu.com/question/19732473/answer/23434554
来源:知乎

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值