同步、异步,阻塞、非阻塞理解

526 阅读6分钟

同步、异步,阻塞、非阻塞理解

由于同步异步,阻塞非阻塞都学习了有一段时间了。慢慢了快忘了,所以干脆趁着寒假把知识点都捡起来,写出来。

在上一篇Linux里五种I/O模型里学习到了Linux里面的五种I/O模型,其中提到了同步(synchronous)、异步(asynchronous)和阻塞(blocking)、非阻塞(non-blocking)的概念。之前困扰过我一段时间,既然提到了,就好好聊聊。

同步和异步是一组概念,阻塞和非阻塞是一组概念。大家不要搞混了,不要把同步和阻塞等价,也不要把异步和非阻塞等价(戏说不是胡说,改编不是乱编(滑稽))。在刚开始理解的时候很容易搞混,我们这样想,同步和异步是一种执行步骤宏观上的看,而阻塞和非阻塞则是一种执行步骤微观上的看,不知道这样大家能不能理解。

相应的可以组成同步阻塞,同步非阻塞,异步阻塞,异步非阻塞。

同步 synchronous 和异步 asynchronous

同步synchronous:

从宏观上看,有一组执行步骤,同步则是进程按着执行步骤一步一步的来。步骤一是什么?执行。步骤二是什么?执行。步骤三。。。直到执行完毕。

异步asynchronous

异步则就没那么多讲究了,有一组执行步骤,我想怎么来怎么来。我想先执行步骤九十九,那我就执行步骤九十九,接下来我又想执行步骤五,那我就执行步骤五,异步不讲究。

阻塞blocking和非阻塞non-blocking

阻塞blocking:

阻塞则就是,比如一个进程正在执行步骤五,只有进程把步骤五执行完毕后才能执行其他步骤。但是步骤五执行完毕需要一些条件,这时候正在执行的进程不满足这样的条件,怎么办呢?那我这个进程就只能阻塞在这里咯,等待条件满足。条件满足了后,进程步骤五执行完毕,则进程能够执行下一个步骤(同步和异步的不同就是下一个步骤的不同)关键是只有这一个步骤执行完毕,才能执行其他步骤。这就是阻塞

非阻塞non-blocking:

而非阻塞就是,我这个进程正在执行步骤五,但是条件不满足啊,怎么办呢?只有条件满足了步骤五才能被执行完了。既然非阻塞嘛,那进程就不执行你了,抛出一个Error,进程继续执行下一个步骤(进程对non-blocking Socket调用recvfrom(),数据未准备好,返回一个Error,进程继续向下执行)。

四种组合

在这里,我们模拟出一个人去银行办理业务,把人理解成为一个进程,把世界(银行取号机,柜员等其他啥的)理解成为内核。

同步阻塞

这里这个人就是我,我要去银行办理业务。很遗憾,这个银行很老了,没有取号机,只能在窗口前面一个个排队。每个窗口前面还有蛮多人(其他人-另外的进程)的。

我去银行办业务,执行步骤是什么?进入银行,找到排队人少的窗口,站着排队,办业务,走人。这样。 我要按同步阻塞来做啊。。怎么办呢?进入银行(很好),找到排队人少的窗口(也很好),排队。。好,我开始排队了,我就排队,啥都不干,我就站在排队,傻站着,不玩手机,不刷知乎,不看bilibili,我就站着排队(这时候就阻塞了)。好了,排到我了,办理业务(进程执行业务逻辑),然后就溜了。

这就是同步阻塞。

同步非阻塞

那同步非阻塞是个什么情况呢?还是之前的场景,按着同步的步骤来,进入银行,找到排队人少的窗口,站着排队。。这时候站在排队我干嘛傻站着,我刷下手机,和朋友聊聊天,看看银行里的电视机(这就是非阻塞,进程继续执行),总比傻站着强。时不时的看看前面人动没动,前面人没动我就不动(调用返回Error),动了我就往前走(调用成功,复制数据到用户空间)。办理业务(进程执行业务逻辑),溜了。

这就是同步非阻塞。

异步阻塞

这时候场景就不一样了,我进的是紧跟时代发展的银行(其实就是多了个取号机。。)。

那么我的主要步骤就是进入银行,取号,等待叫我的号,办理业务,走人。然后再加两个不相干的步骤来体现异步性:银行饮水机喝水,来个自拍。虽说异步是不按照步骤顺序来执行,但是,如果下一个步骤依赖于前一个步骤,那么就不得不按照同步的执行顺序来。

好的继续,这时候我是异步阻塞的情况下执行:首先我想着,先来个自拍再进入银行?或者进入银行再自拍?都可以没关系,我是异步的。那么进入银行,自拍,取号,等待叫我的号。。这时候,我阻塞了,我也是什么都不干,傻等着(阻塞),就等着广播喊我的号。叫到我了(内核置位信号,进程唤醒),去办理业务(进程执行业务逻辑),有点渴了,倒杯水喝喝,然后走人(或者进入银行了再喝水也行)。

这就是异步阻塞。

异步非阻塞

和异步阻塞场景一样,执行步骤到等待叫我的号,这时候我可以自己想干什么干什么,我也没有排队,不用时不时的看看前面排队的人动没动,我可以完全做自己想做的事情。相应的自拍和喝水也可以随意穿插到几个主要步骤之间,等着叫我号的时候我也能喝水自拍。然后直到广播叫到我的号,办理业务,然后就走了。

这就是异步非阻塞。

总结

以上就是我队同步、异步,阻塞、非阻塞的理解。我感觉是不是有时候美剧看的有点多了,书面语书面语完全没有按照规范来,就是心里想着啥就写出来,比较口语化。。有点扯远了哈,对这些概念的学习也能够加深对底层的一些设计的理解,能够再Code的时候对整个系统自顶向下理解的更加通透。这种东西在我看来一通百通,一招鲜吃遍天,哈哈。