精华内容
下载资源
问答
  • 自从发布《你管这破玩意叫 IO 多路复用》之后,我发现读者问得最多的问题是,可不可以写篇文章解释下什么是同步异步,阻塞非阻塞,老是傻傻分不清。我一开始也是非常困惑,尤其是看网上一些“生动形...

    自从发布《你管这破玩意叫 IO 多路复用》之后,我发现读者问得最多的问题是,可不可以写篇文章解释下什么是同步异步阻塞非阻塞,老是傻傻分不清。

    我一开始也是非常困惑,尤其是看网上一些“生动形象”的例子,比如烧水壶。

    但现在我感觉这个问题又没什么好说的,不知道是不是我理解得有点肤浅,那我试着解释一下。

    同步和异步,描述的是调用者,要不要主动等待函数的返回值。

    这个就是同步

    public static void main() {
        int result = doSomeThing();
    }
    

    这个就是异步

    public static void main() {
        new Thread(() -> {
            int result = doSomeThing();    
        })
    }

    当然,异步可以配合回调机制,但这就和同步异步本身的区别没啥关系了,添枝加叶的东西而已。

    再说阻塞和非阻塞,描述的是函数本身,在等待某一事件的结果时,是将线程挂起,还是立即返回一个未就绪等信息。

    一般都是描述 IO 等,也别想其他的了,比如一个读取磁盘数据的函数。

    这个就是阻塞

    public void int read(byte[] buffer) {
        while(磁盘未就绪) {
            将当前线程挂起并让出 CPU;
        }
        // 此时磁盘已就绪
        真正去读数据到 buffer 中
        return 读到的字节数;
    }

    这个就是非阻塞

    public void int read(byte[] buffer) {
        if(磁盘未就绪) {
            // 立刻返回
            return -1;
        }
        真正去读数据到 buffer 中
        return 读到的字节数;
    }
    

    至于这个函数被调用者用同步还是异步的方式调用,都不影响这个函数本身是阻塞还是非阻塞的性质。

    好了,我觉得到这里就解释清楚了,真没啥说的呀。

    至于特别多的人有困惑的地方,我总结出可能有三点。

    第一,分不清语境

    比如阻塞这个词,用法太多了,你看下面这些句子。

    这个函数是阻塞的。

    这是个阻塞函数。

    这个方法调用的过程中因为有 IO 事件被阻塞了。

    这个函数阻塞了主线程。

    这些句子要是真的纠结起来,那就坏了,总有你觉得怪怪的地方。

    因为用这个词的人,可能仅仅是表达出一个,该线程因为某些事让出了 CPU 资源暂时不往下走了的意思,即可。

    而且事实也是如此,没人细抠这个词究竟表示个啥意思。

    至于你还是纠结怎么办呢?建议你看一看一个函数在最最最最底层,到底是怎么阻塞的,也就是怎么让出 CPU 资源的,源码长什么样子。

    这里我也写过一篇文章带你看内核源码去解释这个问题,叫《究竟什么是阻塞》

    我相信你看完之后,如果真的理解了,就再也不会纠结这些句子啥意思了,自己用阻塞这个词也会随性起来,你会觉得一顿花里胡哨解释阻塞不阻塞的那些人好不可思议。

    第二,分不清层级

    比如 epoll 这个函数,它是 IO 多路复用的一个系统调用函数,好多人背诵 IO 模型八股文的时候都受过它的折磨。

    你会看到有的地方说,epoll 底层实现 IO 事件响应时,是异步的,这也是同 select 和 poll 的一个区别。

    你又会看到有的地方说,epoll 是同步非阻塞 IO,因为多路复用在 IO 模型里就是站在同步非阻塞的地方嘛,那 epoll 也是多路复用那自然是同步的呀,刚刚怎么说是异步的呢。

    然后你又会看到,说 netty 是是一个 IO 框架,是异步 IO 模型,可是 netty 底层用的就是 epoll 啊,那 epoll 也是异步的咯。

    我天,一会说异步,一会又说同步,一会又说异步,到底他喵的是啥啊?

    这就是层级问题了。

    先不拿同步异步说,这个第三点的时候再讲,先拿阻塞和非阻塞说。

    一个函数是非阻塞的,那我用另一个函数把它包起来,对外提供一个阻塞的函数可不可以?

    当然可以。

    // 这是个非阻塞的函数
    public void int read(byte[] buffer) {
        if(磁盘未就绪) {
            // 立刻返回
            return -1;
        }
        真正去读数据到 buffer 中
        return 读到的字节数;
    }
    
    // 包一层,变成阻塞的
    public void int read2(byte[] buffer) {
        int result;
        while((result = read(buffer)) == -1) {
            将线程挂起并让出 CPU 资源
        }
        // 此时已读到数据
        return result;
    }
    

    顺便说一句,IO 多路复用里的 select 就是这么玩的,只不过人家是一组 IO 事件,这里只是一个。

    我再包一层新函数,对外又提供了一个非阻塞的函数,可不可以?

    当然也可以,所以你看到说啥啥啥同步异步阻塞非阻塞时,一定要知道人家在说哪一层。

    不谈哪一层就开始和别人争论这个东西是阻塞还是非阻塞,同步还是异步,基本都是在耍流氓。

    关于 epoll 的原理,我是理解不到太深,如果你有耐心,可以看飞哥带你一行一行源码读 epoll 的文章,《深度揭秘 epoll 是如何实现 IO 多路复用的》

    第三,随意一点嘛

    有的时候,意思对了就行,你看有的人会说,select,poll,epoll 这些函数都是同步的,IO 有就绪的时候才会返回,没有的时候会一直阻塞在那里直到有就绪的返回为止。

    那照我刚刚说的,同步异步是描述调用者是否主动等待返回值,阻塞非阻塞才是描述函数本身要立即返回还是将线程挂起一会

    那就不对了呀,怎么能说 select 这些函数是同步的呢?应该说他们是阻塞的呀。

    路走窄了呀兄弟,很多技术交流是没那么在乎这些细节的,意思对了就行。

    而且 select 这种函数确实是阻塞的,而且调用方是要关心人家的返回值,并且在后面的逻辑中用到的,那只能用同步方式调用啊。

    当然,关心返回结果,也可以异步调用,然后注册一个回调函数来关心返回后的逻辑,但人家 select 没提供回调函数注册的功能啊。

    哦当然,也可以通过像 Java 的 Future 这种方式异步获取返回值,但没必要啊。

    所以,当有人说 select 是同步函数,也没啥毛病,表达的意思对了就行。

    ----- 华丽的分割线 ----

    千言万语,总结成一句话就是,当你底层的细节达到了源码级的理解后,所有这些词你将不再纠结,也不再困惑,而且很多时候,知道意思对了就行,至于说阻塞非阻塞、同步异步,甚至是等待、挂起、让出,这些词也是表达的意思丢了就行,一切在源码面前,都不再是秘密。

    建议多读源码,少看垃圾博文。

    所以其实如果你老是困惑这几个词的区别,其实你缺乏的可能是对底层的一些系统了解

    然后解决这个问题的唯一办法就是花时间把底下的东西搞清楚,搞得模模糊糊的地方就去抠源码,一点点抠就完事了,别怕耽误时间。你耽误的时间,在后面遇到问题的时候,都会给你找回来的。

    而且这个东西不能一口吃成个胖子,我以前就老想着一口吃个胖子,想尽快把一个大块问题看懂,但反而耽误时间,总是一遍遍从头看起。

    后来就老实了,一点点看,看懂一点再看下一个点,发现会越来越快的。

    同时这个公众号也希望能一直保持,给大家讲最本质的东西,不浮于表面,我们一起努力吧!

    展开全文
  • 在程序运行的过程中,由于被操作系统的调度算法控制,程序会进入几个状态:就绪,运行和阻塞。就绪(Ready)状态:当进程已分配到除CPU以外的所有必要的资源,只要获得处理机便可立即执行,这时的进程状态称为就绪状态...

    一、状态介绍

    在了解其他概念之前,我们首先要了解进程的几个状态。在程序运行的过程中,由于被操作系统的调度算法控制,程序会进入几个状态:就绪,运行和阻塞。

    就绪(Ready)状态:当进程已分配到除CPU以外的所有必要的资源,只要获得处理机便可立即执行,这时的进程状态称为就绪状态。

    执行/运行(Running)状态当进程已获得处理机,其程序正在处理机上执行,此时的进程状态称为执行状态。

    阻塞(Blocked)状态正在执行的进程,由于等待某个事件发生而无法执行时,便放弃处理机而处于阻塞状态。引起进程阻塞的事件可有多种,例如,等待I/O完成、申请缓冲区不能满足、等待信件(信号)等。

    二、同步和异步

    所谓同步就是一个任务的完成需要依赖另外一个任务时,只有等待被依赖的任务完成后,依赖的任务才能算完成,这是一种可靠的任务序列。要么成功都成功,失败都失败,两个任务的状态可以保持一致。

    所谓异步是不需要等待被依赖的任务完成,只是通知被依赖的任务要完成什么工作,依赖的任务也立即执行,只要自己完成了整个任务就算完成了。至于被依赖的任务最终是否真正完成,依赖它的任务无法确定,所以它是不可靠的任务序列。

    2.1 例子

    比如我去银行办理业务,可能会有两种方式:

    第一种 :选择排队等候;

    第二种 :选择取一个小纸条上面有我的号码,等到排到我这一号时由柜台的人通知我轮到我去办理业务了;

    第一种:前者(排队等候)就是同步等待消息通知,也就是我要一直在等待银行办理业务情况;

    第二种:后者(等待别人通知)就是异步等待消息通知。在异步消息处理中,等待消息通知者(在这个例子中就是等待办理业务的人)往往注册一个回调机制,在所等待的事件被触发时由触发机制(在这里是柜台的人)通过某种机制(在这里是写在小纸条上的号码,喊号)找到等待该事件的人。

    三、阻塞和非阻塞

    阻塞和非阻塞这两个概念与程序(线程)等待消息通知(无所谓同步或者异步)时的状态有关。也就是说阻塞与非阻塞主要是程序(线程)等待消息通知时的状态角度来说的

    3.1 例子

    继续上面的那个例子,不论是排队还是使用号码等待通知,如果在这个等待的过程中,等待者除了等待消息通知之外不能做其它的事情,那么该机制就是阻塞的,表现在程序中,也就是该程序一直阻塞在该函数调用处不能继续往下执行。

    相反,有的人喜欢在银行办理这些业务的时候一边打打电话发发短信一边等待,这样的状态就是非阻塞的,因为他(等待者)没有阻塞在这个消息通知上,而是一边做自己的事情一边等待。

    注意:同步非阻塞形式实际上是效率低下的,想象一下你一边打着电话一边还需要抬头看到底队伍排到你了没有。如果把打电话和观察排队的位置看成是程序的两个操作的话,这个程序需要在这两种不同的行为之间来回的切换,效率可想而知是低下的;而异步非阻塞形式却没有这样的问题,因为打电话是你(等待者)的事情,而通知你则是柜台(消息触发机制)的事情,程序没有在两种不同的操作中来回切换。

    四、同步/异步和阻塞/非阻塞

    4.1 同步阻塞形式

    效率最低。拿上面的例子来说,就是你专心排队,什么别的事都不做。

    4.2 异步阻塞形式

    如果在银行等待办理业务的人采用的是异步的方式去等待消息被触发(通知),也就是领了一张小纸条,假如在这段时间里他不能离开银行做其它的事情,那么很显然,这个人被阻塞在了这个等待的操作上面。

    异步操作是可以被阻塞住的,只不过它不是在处理消息时阻塞,而是在等待消息通知时被阻塞。

    4.3 同步非阻塞形式

    实际上是效率低下的。

    想象一下你一边打着电话一边还需要抬头看到底队伍排到你了没有,如果把打电话和观察排队的位置看成是程序的两个操作的话,这个程序需要在这两种不同的行为之间来回的切换,效率可想而知是低下的。

    4.4 异步非阻塞形式

    效率更高,

    因为打电话是你(等待者)的事情,而通知你则是柜台(消息触发机制)的事情,程序没有在两种不同的操作中来回切换。

    比如说,这个人突然发觉自己烟瘾犯了,需要出去抽根烟,于是他告诉大堂经理说,排到我这个号码的时候麻烦到外面通知我一下,那么他就没有被阻塞在这个等待的操作上面,自然这个就是异步+非阻塞的方式了。

    很多人会把同步和阻塞混淆,是因为很多时候同步操作会以阻塞的形式表现出来,同样的,很多人也会把异步和非阻塞混淆,因为异步操作一般都不会在真正的IO操作处被阻塞。

    【编辑推荐】

    【责任编辑:武晓燕 TEL:(010)68476606】

    点赞 0

    展开全文
  • FPGA阻塞非阻塞

    2021-04-08 11:31:58
    在always @(posedge clk)块里,非阻塞是并行赋值,无先后顺序,a得到b的值,同时把当前值赋值给c。 实现的结果是:一个时钟到来后,a=b;c=a赋值前的值。 阻塞与非阻塞是对于赋值过程而言的,阻塞表现为顺序执行,...

    阻塞:a=b;c=a;
    在always @(posedge clk)块里,阻塞是顺序赋值,有先后顺序,a先得到b的值,然后再把新值赋值给c。
    实现的结果是:一个时钟到来后,a=b=c;

    非阻塞:a<=b;c<=a;
    在always @(posedge clk)块里,非阻塞是并行赋值,无先后顺序,a得到b的值,同时把当前值赋值给c。
    实现的结果是:一个时钟到来后,a=b;c=a赋值前的值。

    阻塞与非阻塞是对于赋值过程而言的,阻塞表现为顺序执行,第一行代码完成才能继续往下走;非阻塞表现为并行执行,第一行与第二行代码同时执行。

    展开全文
  • 无论阻塞式IO还是非阻塞式IO,都是同步IO模型 同步阻塞:你把衣服都到洗衣机洗,然后看着洗衣机洗碗,洗好后再去晾衣服(你就干等,啥都不做,堵塞在那) 但你要的结果只是晾衣服,你等待的这个过程就是阻塞 同步...

    洗衣机洗衣服例子

    无论阻塞式IO还是非阻塞式IO,都是同步IO模型

    同步阻塞:你把衣服都到洗衣机洗,然后看着洗衣机洗碗,洗好后再去晾衣服(你就干等,啥都不做,堵塞在那)
    但你要的结果只是晾衣服,你等待的这个过程就是阻塞

    同步非阻塞:你把衣服丢到洗衣机洗,然后可以去做其它事,比如玩游戏看电视之类的,但你要定时去卫生间看看洗衣机有没有洗完,洗完后再去晾衣服

    异步阻塞:把衣服丢到洗衣机洗,然后看着洗衣机洗完,再去晾(先说一下,生活中你会这样么?所以说几乎没有这个情况,没这个说法,可以忽略)用异步就不会出现阻塞这种情况!

    异步非阻塞:你把衣服丢到洗衣机,你可以去做其它事,洗衣机洗好后自动晾衣服,晾好后放个音乐提示你衣服晾好了

    因为有了IO操作才会有阻塞,才会出现同步和异步。因为有大量IO操作,才会有高并发的设计,如果只是纯CPU运算,不涉及到CPU对外围IO设备的读写,那么就不存在高并发设计

    那么对CPU而言,开一个线程计算和开100个线程计算,只会徒增CPU切换时间,当然这种情况下也不存在所谓的阻塞、非阻塞、同步和异步。所谓的高性能就是如何在处理大量IO的情况下,让CPU去干更多的正事

    展开全文
  • 阻塞 当前线程因为等待某个不能被立即执行的操作而陷入等待状态 非阻塞 当前线程不会因为等待一个不能被立即执行的操作而停止执行后面的代码 总结 同步容易阻塞 异步不容易阻塞 但是也不完全如此,异步也可以阻塞。...
  • 异步同步阻塞非阻塞并发:同一时刻,单cpu只执行一个任务并行:多CPU同时执行不同任务同步和异步对结果而言:同步:上一个任务必须执行完,下一步才能执行异步:下一步的操作不需要等待上一步的完成同步和异步同步和...
  • 阻塞非阻塞与同步异步的区别 原文地址:https://www.zhihu.com/question/19732473/answer/241673170 IO 概念区分 四个相关概念: 同步(Synchronous) 异步( Asynchronous) 阻塞( Blocking ) 非阻塞( Nonblocking) ...
  • 阻塞和非阻塞是针对于进程在访问数据的时候,根据 IO 操作的就绪状态来采取的不同方式 总结一句简短的话,同步和异步是目的,阻塞与非阻塞是实现方式 2. 名词解释 2.1 同步 指的是用户进程触发 IO 操作并等待或者...
  • 文章目录一次网络请求所涉及的过程分析(用户态内核态的切换,同步异步阻塞非阻塞,tcp执行过程)同步异步阻塞非阻塞参考文章 一次网络请求所涉及的过程分析(用户态内核态的切换,同步异步阻塞非阻塞,tcp执行过程...
  • 文章目录阻塞与非阻塞阻塞IO非阻塞IO同步与异步同步IO异步IONIO与BIO的区别总结BIONIOAIO是啥?总结参考阅读 以下内容摘自:敖丙肝了一个月的Netty知识点 阻塞与非阻塞 阻塞和非阻塞操作是针对发起的IO请求操作后...
  • 同步异步阻塞非阻塞

    2021-01-23 18:07:54
    同步异步阻塞非阻塞 一、任务运行的三种状态 进程在运行的过程中不断地改变其运行状态 通常一个运行的进程必须具有三种状态:就绪态, 运行态, 阻塞态 1.就绪态 (Ready) 当进程已分配到除CPU以外的所有必要的资源后...
  • “阻塞”与"非阻塞"与"同步"与“异步"不能简单的从字面理解,提供一个从分布式系统角度的回答。 1.同步与异步 同步和异步关注的是消息通信机制 (synchronous communication/ asynchronous communication) 所谓同步,...
  • 非阻塞( Nonblocking) 同步异步关注的是通信方式,同步是得到结果后才返回调用。异步则是在调用发出后直接返回,通过其他方式告知结果。 阻塞是你收到结果前你啥都干不了,非阻塞则可以干其他事同时关注结果。 同步...
  • 在网络编程中,会经常出现异步、同步、阻塞、非阻塞,很容易混淆。或者在面试过程中,经常会被问到,但是概念容易混淆,很容易答不出来。相信看过此文之后,会彻底的了解。先不说概念,先举个例子。现在有个场景,...
  • 在程序运行的过程中,由于被操作系统的调度算法控制,程序会进入几个状态:就绪,运行和阻塞。就绪(Ready)状态:当进程已分配到除CPU以外的所有必要的资源,只要获得处理机便可立即执行,这时的进程状态称为就绪状态...
  • ## 大白话搞懂什么是同步/异步/阻塞/非阻塞> 异步/同步(被调用者),阻塞/非阻塞(调用者)https://mp.weixin.qq.com/s/TW82I31CVRbKOwJGnTTP8A原创:wangzenghuang[深夜里的程序猿](javascript:void(0);)*4月17日*!...
  • Qtimer 阻塞 非阻塞

    2021-05-11 17:26:00
    非阻塞 QTimer::singleShot(5000, this, = { qDebug()<< “AAA” ; } ); 阻塞: QThread::sleep(5); 阻塞(网上有说非阻塞,然而跟实验结果不一致??)
  • “阻塞”与"非阻塞"与"同步"与“异步"不能简单的从字面理解,提供一个从分布式系统角度的回答。1.同步与异步同步和异步关注的是消息通信机制 (synchronous communication/ asynchronous communication)所谓同步,...
  • socket的阻塞与非阻塞

    2021-04-11 12:35:37
    非阻塞模式3. 优缺点对比 阻塞(blocking)、非阻塞(non-blocking): Windows套接字在阻塞和非阻塞两种模式下执行I/O操作。在阻塞模式下,在I/O操作完成前,执行的操作函数一直等候而不会立即返回,该函数所在的...
  • 老张爱喝茶,废话不说,煮开水。...(同步非阻塞)老张还是觉得自己有点傻,于是变高端了,买了把会响笛的那种水壶。水开之后,能大声发出嘀~~~~的噪音。3 老张把响水壶放到火上,立等水开。(异步阻塞)老张觉得...
  • 测试文件 module zuseorno( input clk, input rst_n, output reg a, output reg b, output reg c, output reg d, output reg aa, output reg bb, output reg cc, ...always @(posedge clk or negedge...
  • 阻塞和非阻塞 阻塞:表示事情在没有得到返回,调用者不能去处理其他事情,直到调用返回,才能处理其他事情。 非阻塞:表示调用方不用等待返回才能处理其他事情,可以在调用没有返回的时候处理其他事情。 还是上面...
  • 阻塞模式Windows套接字在阻塞和非阻塞两种模式下执行I/O操作。在阻塞模式下,在I/O操作完成前,执行的操作函数一直等候而不会立即返回,该函数所在的线程会阻塞在这里。相反,在非阻塞模式下,套接字函数会立即返回...
  • 二、阻塞 非阻塞 阻塞和非阻塞这两个概念与程序(线程)等待消息通知时的状态有关(无所谓同步或者异步)。也就是说阻塞与非阻塞主要是程序(线程)等待消息通知时的状态角度来说的。 1.直观对比 阻塞:持续等待这个...
  • 等待任意一个子进程退出,如没有退出,一直阻塞等待; 阻塞:为了完成某一目的调用某一个功能,不具备完成条件,则一直等待; 调用之前有子进程退出,调用时就会立即处理 pid_t waitpid(pid_t childpid,int *...
  • 而要搞明白IO相关的概念,首先就得弄清楚同步与异步,阻塞与非阻塞到底是什么意思。 同步与异步 想要搞明白IO模型,就先得搞明白“同步”与“异步”的关系。 所谓的“ 同步 ”,比如说调用者去调用一个接口,这个...
  • IO的阻塞与非阻塞操作系统所谓IO的阻塞与非阻塞,是指当进行IO操作时,需要的资源不可用,这时程序的表现。阻塞IO将让程序处于等待状态,指导需要的资源可用;而非阻塞IO将直接返回,不等需要的资源可用。目前IO模型主要...
  • 1.概述对于设备文件,我们可以用阻塞和非阻塞的方式读写。在阻塞方式下,若设备不可读写,则该进程休眠,释放CPU资源;若设备文件可读写,则对设备文件进行读写。在非阻塞方式下,若设备不可读写,进程放弃读写,...
  • [并发、并行] [同步、异步] [阻塞、非阻塞] 多线程 并发 并发大家肯定平时经常提及,不管是app、web server并发无处不在。仔细看上面并发的字面意思,是指一个时间段内多个程序(任务)同时处于运行活动状态,而不是...
  • 通过一个很形象的例子来说明同步异步阻塞非阻塞。场景: 小明使用 chrome 下载一个软件。1. 同步阻塞小明使用 没有提醒功能的chrome 下载一个软件。小明 一直坐在电脑面前什么事也不做, 等待软件下载完成。阻塞:...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 468,762
精华内容 187,504
关键字:

阻塞非阻塞