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

LudwigWuuu發表於2019-01-19

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

由於同步非同步,阻塞非阻塞都學習了有一段時間了。慢慢了快忘了,所以乾脆趁著寒假把知識點都撿起來,寫出來。

在上一篇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的時候對整個系統自頂向下理解的更加通透。這種東西在我看來一通百通,一招鮮吃遍天,哈哈。

相關文章