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

2021-09-24 07:33:20 字數 2089 閱讀 8943

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

同步和非同步是一組概念,阻塞和非阻塞是一組概念。大家不要搞混了,不要把同步和阻塞等價,也不要把非同步和非阻塞等價(戲說不是胡說,改編不是亂編(滑稽))。在剛開始理解的時候很容易搞混,我們這樣想,同步和非同步是一種執行步驟巨集觀上的看,而阻塞和非阻塞則是一種執行步驟微觀上的看,不知道這樣大家能不能理解。

相應的可以組成同步阻塞,同步非阻塞,非同步阻塞,非同步非阻塞。

從巨集觀上看,有一組執行步驟,同步則是程序按著執行步驟一步一步的來。步驟一是什麼?執行。步驟二是什麼?執行。步驟三。。。直到執行完畢。

非同步則就沒那麼多講究了,有一組執行步驟,我想怎麼來怎麼來。我想先執行步驟九十九,那我就執行步驟九十九,接下來我又想執行步驟五,那我就執行步驟五,非同步不講究。

阻塞則就是,比如乙個程序正在執行步驟五,只有程序把步驟五執行完畢後才能執行其他步驟。但是步驟五執行完畢需要一些條件,這時候正在執行的程序不滿足這樣的條件,怎麼辦呢?那我這個程序就只能阻塞在這裡咯,等待條件滿足。條件滿足了後,程序步驟五執行完畢,則程序能夠執行下乙個步驟(同步和非同步的不同就是下乙個步驟的不同)關鍵是只有這乙個步驟執行完畢,才能執行其他步驟。這就是阻塞

而非阻塞就是,我這個程序正在執行步驟五,但是條件不滿足啊,怎麼辦呢?只有條件滿足了步驟五才能被執行完了。既然非阻塞嘛,那程序就不執行你了,丟擲乙個error,程序繼續執行下乙個步驟(程序對non-blocking socket呼叫recvfrom(),資料未準備好,返回乙個error,程序繼續向下執行)。

在這裡,我們模擬出乙個人去銀行辦理業務,把人理解成為乙個程序,把世界(銀行取號機,櫃員等其他啥的)理解成為核心。

這裡這個人就是我,我要去銀行辦理業務。很遺憾,這個銀行很老了,沒有取號機,只能在視窗前面乙個個排隊。每個視窗前面還有蠻多人(其他人-另外的程序)的。

我去銀行辦業務,執行步驟是什麼?進入銀行,找到排隊人少的視窗,站著排隊,辦業務,走人。這樣。 我要按同步阻塞來做啊。。怎麼辦呢?進入銀行(很好),找到排隊人少的視窗(也很好),排隊。。好,我開始排隊了,我就排隊,啥都不幹,我就站在排隊,傻站著,不玩手機,不刷知乎,不看bilibili,我就站著排隊(這時候就阻塞了)。好了,排到我了,辦理業務(程序執行業務邏輯),然後就溜了。

這就是同步阻塞。

那同步非阻塞是個什麼情況呢?還是之前的場景,按著同步的步驟來,進入銀行,找到排隊人少的視窗,站著排隊。。這時候站在排隊我幹嘛傻站著,我刷下手機,和朋友聊聊天,看看銀行裡的電視機(這就是非阻塞,程序繼續執行),總比傻站著強。時不時的看看前面人動沒動,前面人沒動我就不動(呼叫返回error),動了我就往前走(呼叫成功,複製資料到使用者空間)。辦理業務(程序執行業務邏輯),溜了。

這就是同步非阻塞。

這時候場景就不一樣了,我進的是緊跟時代發展的銀行(其實就是多了個取號機。。)。

那麼我的主要步驟就是進入銀行,取號,等待叫我的號,辦理業務,走人。然後再加兩個不相干的步驟來體現非同步性:銀行飲水機喝水,來個**。雖說非同步是不按照步驟順序來執行,但是,如果下乙個步驟依賴於前乙個步驟,那麼就不得不按照同步的執行順序來。

好的繼續,這時候我是非同步阻塞的情況下執行:首先我想著,先來個**再進入銀行?或者進入銀行再**?都可以沒關係,我是非同步的。那麼進入銀行,**,取號,等待叫我的號。。這時候,我阻塞了,我也是什麼都不幹,傻等著(阻塞),就等著廣播喊我的號。叫到我了(核心置位訊號,程序喚醒),去辦理業務(程序執行業務邏輯),有點渴了,倒杯水喝喝,然後走人(或者進入銀行了再喝水也行)。

這就是非同步阻塞。

和非同步阻塞場景一樣,執行步驟到等待叫我的號,這時候我可以自己想幹什麼幹什麼,我也沒有排隊,不用時不時的看看前面排隊的人動沒動,我可以完全做自己想做的事情。相應的**和喝水也可以隨意穿插到幾個主要步驟之間,等著叫我號的時候我也能喝水**。然後直到廣播叫到我的號,辦理業務,然後就走了。

這就是非同步非阻塞。

以上就是我隊同步、非同步,阻塞、非阻塞的理解。我感覺是不是有時候美劇看的有點多了,書面語書面語完全沒有按照規範來,就是心裡想著啥就寫出來,比較口語化。。有點扯遠了哈,對這些概念的學習也能夠加深對底層的一些設計的理解,能夠再code的時候對整個系統自頂向下理解的更加通透。這種東西在我看來一通百通,一招鮮吃遍天,哈哈。

非同步,同步,阻塞,非阻塞個人理解

同步 所謂同步,就是函式在發出乙個功能呼叫過程時,在過程沒有完成結束前,函式也是得不到返回的。按照這個定義,其實絕大多數函式都是同步呼叫 例如sin,isdigit等 但是一般而言,我們在說同步 非同步的時候,特指的是那些需要其他部件協作或者需要一定時間完成的任務。最常見的例子就是 sendmess...

怎樣理解 同步 非同步 阻塞 非阻塞

老張愛喝茶,廢話不說,煮開水。出場人物 老張,水壺兩把 普通水壺,簡稱水壺 會響的水壺,簡稱響水壺 1 老張把水壺放到火上,立等水開。同步阻塞 老張覺得自己有點傻 2 老張把水壺放到火上,去客廳看電視,時不時去廚房看看水開沒有。同步非阻塞 老張還是覺得自己有點傻,於是變高階了,買了把會響笛的那種水壺...

同步 非同步 阻塞 非阻塞的理解

同步與非同步是針對應用程式與核心的互動而言的。同步過程中程序觸發io操作並等待或者輪詢的去檢視io操作是否完成。非同步過程中程序觸發io操作以後,直接返回,做自己的事情,io交給核心來處理,完成後核心通知程序io完成。應用程序請求i o操作時,如果資料未準備好,如果請求立即返回就是非阻塞,不立即返回...