通俗易懂理解阻塞和非阻塞,同步与异步

什么是阻塞和非阻塞,同步与异步?

  • 阻塞/非阻塞:描述的是调用者调用方法后的状态,比如:线程A调用了B方法,A线程处于阻塞状态。
  • 同步/异步:描述的方法跟调用者间通信的方式,如果不需要调用者主动等待,调用者调用后立即返回,然后方法本身通过回调,消息通知等方式通知调用者结果,就是异步的。如果调用方法后一直需要调用者一直等待方法返回结果,那么就是同步的

 

我没听明白,你可不可以说人话?

  • 阻塞/非阻塞:描述的是发起请求的人的状态,比如:我在银行发起取钱请求后,一直处于排队的阻塞状态,在队伍中等待,什么都不能做。后来银行改取号机制,我取了号之后,知道到我取钱还早着呢。我就出去剪个头发,回来顺便买瓶冰阔落霍,这就是非阻塞。
  • 同步/异步:代表的是请求被完成的方式,如果最终还是由我完成的,那么就是同步的,如果不是由我完成的,而是别人完成后通知我的就是异步的。你的取钱操作最终还是由你自己递上银行卡身份证、输入密码,这就是同步的。异步就是你给你妈妈说一声,你要取钱。然后躺床上打着游戏,钱就送到你手上了。

 

一般有三种情况

  • 同步阻塞:银行排队取钱。排队什么都不能干,阻塞;钱还是自己取,同步。
  • 同步非阻塞:银行排号取钱。等号期间,可以自己做自己的事,非阻塞;钱还是自己取,同步。
  • 异步非阻塞:你妈妈给你把钱取回来了。你可以做自己的事,非阻塞;钱是取好,直接把钱给你,异步。

那有没有异步阻塞呢?钱都是取好送给你的,你要阻塞在那干嘛呢?

 

接下来再看一个IO例子,加深印象。

首先,我们要知道一次IO的过程必然会有三个角色的参与

  1. 应用程序

  2. 内核

  3. 数据

以一次数据的读取为例,应用程序是没有办法直接操纵硬件设备的,只有通过内核才能跟硬件交互。当网卡接收到数据之后,此时数据在网卡中,需要内核将网卡中的数据读取到内核空间中,再从内核空间拷贝到用户空间,这个时候应用程序才拿到数据,读取数据结束。

类比于IO过程中的三个角色

  • 应用程序

  • 内核

  • IO的数据

对于应用程序而言,最终始要读取到数据。

应用程序的IO,就相当于应用程序发起了一个IO请求(以读取数据为例),此时需要进行一次系统调用,内核由用户态切换到内核态,内核开始跟硬件设备进行交互并从硬件设备中读取数据,此时可能硬件设备还没有接收到数据,所以内核函数一直阻塞,直到数据到达才进行返回。这就是同步阻塞模型

应用程序的IO,当应用程序发起了一次读取数据的请求,还是会发起系统调用,但是此时内核根据硬件中是否有数据执行不同的操作,如果有数据,那么将数据拷贝到用户空间,如果没有数据也会返回一个标志,比如-1,应用程序在轮询期间并没有一直阻塞,而是可以进行执行。这就是同步非阻塞

类比应用程序的IO,应用程序只需要发起一次读取数据的请求,接下来就等着内核将数据拷贝到用户空间,并且内核将数据拷贝完成后会通知应用程序,在整个过程中程序可以继续往下执行。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值