阻塞 非阻塞 同步 非同步

2021-08-27 04:02:14 字數 1508 閱讀 3366

一、阻塞、非阻塞:阻塞和非阻塞關注的是程式在等待呼叫結果(訊息,返回值)時的狀態.

eg1、應用程序請求i/o操作時,如果要訪問的資料未準備好,請求立即返回就是非阻塞,不立即返回就是阻塞。

簡單說就是做一件事如果不能立即獲得返回,需要等待,就是阻塞,否則就可以理解為非阻塞。

eg2、

阻塞呼叫:比如 socket 的 recv(),呼叫這個函式的執行緒如果沒有資料返回,它會一直阻塞著,也就是 recv() 後面的**都不會執行了,程式就停在 recv() 這裡等待,所以一般把 recv() 放在單獨的執行緒裡呼叫。

非阻塞呼叫:比如非阻塞socket 的 send(),呼叫這個函式,它只是把待傳送的資料複製到tcp輸出緩衝區中,就立刻返回了,執行緒並不會阻塞,資料有沒有發出去 send() 是不知道的,不會等待它發出去才返回的。

eg3、

阻塞呼叫是指呼叫結果返回之前,當前執行緒會被掛起。呼叫執行緒只有在得到結果之後才會返回。

非阻塞呼叫指在不能立刻得到結果之前,該呼叫不會阻塞當前執行緒。

二、同步、非同步:同步和非同步關注的是訊息通訊機制

同步與非同步是針對應用程式與核心的互動而言的。

同步過程中程序觸發io操作並等待或者輪詢的去檢視io操作是否完成。(沒有通知)

非同步過程中程序觸發io操作以後,直接返回,做自己的事情,io交給核心來處理,完成後核心通知程序io完成。(核心通知)

一般來說i/o模型可以分為:同步阻塞,同步非阻塞,非同步阻塞,非同步非阻塞io

舉例:**:

故事:老王燒開水。

出場人物:老張,水壺兩把(普通水壺,簡稱水壺;會響的水壺,簡稱響水壺)。

老王想了想,有好幾種等待方式

1.老王用水壺煮水,並且站在那裡,不管水開沒開,每隔一定時間看看水開了沒。-同步阻塞

老王想了想,這種方法不夠聰明。

2.老王還是用水壺煮水,不再傻傻的站在那裡看水開,跑去寢室上網,但是還是會每隔一段時間過來看看水開了沒有,水沒有開就走人。-同步非阻塞

老王想了想,現在的方法聰明了些,但是還是不夠好。

3.老王這次使用高大上的響水壺來煮水,站在那裡,但是不會再每隔一段時間去看水開,而是等水開了,水壺會自動的通知他。-非同步阻塞

老王想了想,不會呀,既然水壺可以通知我,那我為什麼還要傻傻的站在那裡等呢,嗯,得換個方法。

4.老王還是使用響水壺煮水,跑到客廳上網去,等著響水壺自己把水煮熟了以後通知他。-非同步非阻塞

老王豁然,這下感覺輕鬆了很多。

其實,這兩者存在本質的區別,它們的修飾物件是不同的。

阻塞和非阻塞是指程序訪問的資料如果尚未就緒,程序是否需要等待,簡單說這相當於函式內部的實現區別,也就是未就緒時是直接返回還是等待就緒。

而同步和非同步是指訪問資料的機制,同步一般指主動請求並等待i/o操作完畢的方式,當資料就緒後在讀寫的時候必須阻塞,

非同步則指主動請求資料後便可以繼續處理其它任務,隨後等待i/o操作完畢的通知,這可以使程序在資料讀寫時也不阻塞。

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

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

同步 非同步 阻塞 非阻塞

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

同步 非同步 阻塞 非阻塞

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