同步與非同步,阻塞與非阻塞的區別

2022-03-20 06:53:52 字數 1465 閱讀 6061

原文:

1、概念剖析

相信很多從事linux後台開發工作的都接觸過同步&非同步、阻塞&非阻塞這樣的概念,也相信都曾經產生過誤解,比如認為同步就是阻塞、非同步就是非阻塞,下面我們先剖析下這幾個概念分別是什麼含義。

同步:

所謂同步,就是在發出乙個功能呼叫時,在沒有得到結果之前,該呼叫就不返回。也就是必須一件一件事做,等前一件做完了才能做下一件事。

例如普通b/s模式(同步):提交請求->等待伺服器處理->處理完畢返回 這個期間客戶端瀏覽器不能幹任何事

非同步:

非同步的概念和同步相對。當乙個非同步過程呼叫發出後,呼叫者不能立刻得到結果。實際處理這個呼叫的部件在完成後,通過狀態、通知和**來通知呼叫者。

例如 ajax請求(非同步): 請求通過事件觸發->伺服器處理(這是瀏覽器仍然可以作其他事情)->處理完畢

阻塞:

阻塞呼叫是指呼叫結果返回之前,當前執行緒會被掛起(執行緒進入非可執行狀態,在這個狀態下,cpu不會給執行緒分配時間片,即執行緒暫停執行)。函式只有在得到結果之後才會返回。

有人也許會把阻塞呼叫和同步呼叫等同起來,實際上他是不同的。對於同步呼叫來說,很多時候當前執行緒還是啟用的,只是從邏輯上當前函式沒有返回,它還會搶占cpu去執行其他邏輯,也會主動檢測io是否準備好。

非阻塞

非阻塞和阻塞的概念相對應,指在不能立刻得到結果之前,該函式不會阻塞當前執行緒,而會立刻返回。

再簡單點理解就是:

1. 同步,就是我呼叫乙個功能,該功能沒有結束前,我死等結果。

2. 非同步,就是我呼叫乙個功能,不需要知道該功能結果,該功能有結果後通知我(**通知)

3. 阻塞,就是呼叫我(函式),我(函式)沒有接收完資料或者沒有得到結果之前,我不會返回。

4. 非阻塞,就是呼叫我(函式),我(函式)立即返回,通過select通知呼叫者

同步io和非同步io的區別就在於:資料拷貝的時候程序是否阻塞

阻塞io和非阻塞io的區別就在於:應用程式的呼叫是否立即返回

綜上可知,同步和非同步,阻塞和非阻塞,有些混用,其實它們完全不是一回事,而且它們修飾的物件也不相同。

2、五種io模型

在了解了同步與非同步、阻塞與非阻塞概念後,我們來講講linux的五種io模型:

1)阻塞i/o(blocking i/o)

2)非阻塞i/o (nonblocking i/o)

3) i/o復用(select 和poll) (i/o multiplexing)

4)訊號驅動i/o (signal driven i/o (sigio))

5)非同步i/o (asynchronous i/o (the posix aio_functions))

其中前4種都是同步,最後一種才是非同步。

同步與非同步 阻塞與非阻塞區別

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

同步與非同步 阻塞與非阻塞區別

為了弄清這幾個概念還和同事討論了一番,然後還查了一些資料,總結一下。同步與非同步是在客戶端向服務端發請求的時候,客戶端做出的處理方式。同步 客戶端向服務端發出乙個請求,客戶端就一直在等著服務端的返回結果。非同步 客戶端向服務端發出乙個請求並向伺服器說 你處理完了通知我一聲哦,我就不在這兒一直等著了。...

阻塞非阻塞與同步非同步的區別

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