同步 非同步 阻塞 非阻塞

2022-08-09 02:42:11 字數 926 閱讀 7835

同步與非同步主要是從訊息通知機制的角度來說的。

所謂同步就是說乙個任務的完成需要依賴另乙個任務,只有當被依賴的任務完成後,依賴的任務才能算完成,只是一種可靠的任務序列。所謂非同步就是不需要等待被依賴的任務完成,只是通知被依賴的任務要完成什麼工作,依賴的任務也立即執行,只要自己完成了整個任務就算完成了。

當乙個同步呼叫發出後,呼叫者要一直等待返回訊息通知後,才能進行後續的執行;當乙個非同步呼叫發出後,呼叫者不能立刻得到返回訊息,實際處理這個呼叫的部件在完成後,通過狀態、通知和**來通知呼叫者。如果使用狀態來通知的話,那麼呼叫者需要每隔一定時間檢查一次,效率比較低;如果使用通知或者**的方式,則效率很高。

阻塞與非阻塞這兩個概念與程式等待訊息時的狀態有關,也就是說阻塞與非阻塞主要是程式(執行緒)等待訊息通知時的狀態角度來說的。

阻塞呼叫是指呼叫結果返回之前,當前執行緒會被掛起,一直處於等待訊息通知,不能執行其他業務。

非阻塞和阻塞的概念相反,指在不能立刻得到結果之前,該函式不會阻塞當前執行緒,而會立刻返回,雖然表面上非阻塞可以明顯提高cpu的利用率,但是也帶來了另一種後果就是系統的執行緒切換增加。增加的cpu執行時間能不能補償系統的切換成本需要好好評估。

很多人可能會把同步呼叫和阻塞呼叫等同起來,其實他們是不一樣的:

對於同步呼叫來講,很多當前執行緒可能還是啟用的,只是從邏輯上講當前函式沒有返回而已,此時這個執行緒可能也會處理其他的訊息,如果這個執行緒在等待當前函式返回的同時還在執行其他的訊息處理,這種情況就叫做同步非阻塞,如果沒有執行其他的訊息處理,而是處於掛起等待狀態,那麼就叫做同步阻塞。

對於阻塞呼叫來講,則當前執行緒就會被掛起等待當前函式退出。

綜上所述,同步和非同步僅僅是關注訊息如何通知的機制,而阻塞和非阻塞是等待訊息通知時的狀態。也就是說在同步的情況下,是由處理訊息者自己去等待訊息是否被觸發,而非同步的情況下是由觸發機制來通知處理訊息者,所以在非同步機制中,處理訊息者和觸發機制之間就需要乙個連線的橋梁。

阻塞,非阻塞,非同步,同步

之前一直對這個概念理不太清楚,今天看到一篇文章感覺不錯 本文 老張愛喝茶,廢話不說,煮開水。出場人物 老張,水壺兩把 普通 水壺,簡稱水壺 會響的水壺,簡稱響水壺 1 老張把水壺放到火上,立等水開。同步阻塞 老張覺得自己有點傻 2 老張把水壺放到火上,去客廳看電視,時不時去廚房看看水開沒有。同步非阻...

同步 非同步 阻塞 非阻塞

故事 老王燒開水。出場人物 老張,水壺兩把 普通水壺,簡稱水壺 會響的水壺,簡稱響水壺 老王想了想,有好幾種等待方式 1.老王用水壺煮水,並且站在那裡,不管水開沒開,每隔一定時間看看水開了沒。同步阻塞 老王想了想,這種方法不夠聰明。2.老王還是用水壺煮水,不再傻傻的站在那裡看水開,跑去寢室上網,但是...

同步 非同步 阻塞 非阻塞

故事 老王燒開水。出場人物 老張,水壺兩把 普通水壺,簡稱水壺 會響的水壺,簡稱響水壺 老王想了想,有好幾種等待方式 1.老王用水壺煮水,並且站在那裡,不管水開沒開,每隔一定時間看看水開了沒。同步阻塞 老王想了想,這種方法不夠聰明。2.老王還是用水壺煮水,不再傻傻的站在那裡看水開,跑去寢室上網,但是...