MySQL阻塞与等待区别_怎样理解阻塞非阻塞与同步异步的区别?

简单来说:

对于阻塞IO、非阻塞IO、IO复用和信号驱动IO,都是调用read()去执行IO操作(以read()为例),read()是从kernel buffer读取数据到用户进程app buffer(如果kernel buffer没有数据,才从磁盘加载),读取过程需要CPU参与,所以内核夺走进程的CPU去完成IO,而进程则一直被阻塞。

从现象上来说,在read()时,在kernel buffer和app buffer之间进行数据同步的过程中,进程一直被阻塞,所以这几种IO模型都是同步的模型。

异步IO,比如aio_read(),调用它时,进程自己不会阻塞,且会让内核在后台占用CPU去维护kernel buffer到app buffer之间的数据同步(而不是抢占进程CPU使其睡眠),所以才叫异步。

更严谨的解释:阻塞和非阻塞,体现在当前进程是否可执行,是否能获取到CPU。

当阻塞和非阻塞的概念体现在IO模型上:阻塞IO:从开始发起IO操作开始就阻塞,直到IO完成才返回,所以进程会立即进入睡眠态

非阻塞IO:发起IO操作时,如果当前数据已就绪,则切换到内核态由内核完成数据拷贝(从kernel buffer拷贝到app buffer),此时进程被阻塞,因为它的CPU已经被内核抢走了

如果发起IO操作时数据未就绪,则立即返回而不阻塞,即进程继续享有CPU,可以继续任务。但进程不知道数据何时就绪,所以通常会采用轮循代码(比如while循环)不断判断数据是否就绪,当数据最终就绪后,轮循判断通过,开始执行真正的IO操作,于是切换到内核态,此过程进程仍然被阻塞同步和异步,考虑的是两边数据是否同步(比如kernel buffer和app buffer之间数据是否同步)。同步和异步的区别体现在两边数据尚未完成同步时的行为。同步:在保持两边数据同步的过程中,调用read()的进程被阻塞,由内核抢占其CPU去完成数据同步,直到两边数据同步,进程才被唤醒

异步:在保持两边数据同步的过程中,由内核默默地在后台完成数据同步(如果不理解,可认为是单独开了一个内核线程负责数据同步),内核不会抢占进程的CPU,所以进程自身不被阻塞,当内核完成两端数据同步时,通知进程已同步完成或直接开启一个线程分支去执行指定的回调函数

另外,同步和异步的概念是广义的,因为它是由现象到技术的概念。对应的,上面描述同步异步时的【内核】术语也是广义的,不局限于操作系统内核,它也可以是浏览器内核,或语言的解释器,或语言的虚拟机,只要有总管进程负责进程/线程等资源的调度和管理,都可以实现同步和异步的状态维护。

详细参考:彻底搞懂IO模型:五种IO模型透彻分析​junmajinlong.com

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值