linux 中阻塞與非阻塞 同步與非同步

2021-06-16 09:42:05 字數 1063 閱讀 8067

簡單點說: 阻塞就是幹不完不准回來, 非阻塞就是你先乾,我先看看有其他事沒有,完了告訴我一聲。

我們拿最常用的send和recv兩個函式來說吧。比如你呼叫send函式傳送一定的byte,在系統內部send做的工作其實只是把資料傳輸(copy)到tcp/ip協議棧的輸出緩衝區,它執行成功並不代表資料已經成功的傳送出去了,如tcp/ip協議棧沒有足夠的可用緩衝區來儲存你copy過來的資料的話,這時候就體現出阻塞和非阻塞的不同之處了:對於阻塞模式的socket,send函式將不返回,直到系統緩衝區有足夠的空間把你要傳送的資料copy過去以後才返回。而對於非阻塞的socket來說,send會立即返回,wsaewoulddblock告訴呼叫者說:"傳送操作被阻塞了!!!你想辦法處理吧。" 對於recv函式,同樣道理,該函式的內部工作機制其實是在等待tcp/ip協議棧的接收緩衝區通知它說:「嗨,你的資料來了。」對於阻塞模式的socket來說,如果tcp/ip協議棧的接收緩衝區沒有通知乙個結果給它,它就一直不返回,耗費著系統資源。對於非阻塞模式的socket,該函式會馬上返回,然後告訴你:wsaewoulddblock—"現在沒有資料,回頭再來看看" 。

在進行網路程式設計時,我們常常見到同步、非同步、阻塞和非阻塞四種呼叫方式。這些方式彼此概念並不好理解。下面是我對這些術語的理解。同步、非同步指的是通訊模式,而阻塞和非阻塞指的是在接收和傳送時是否等待動作完成才返回,所以不能混淆這四個詞。通訊的同步,主要是指客戶端在傳送請求後,必須得在服務端有回應後才傳送下乙個請求。所以這個時候的所有請求將會在服務端得到同步;其次是通訊的非同步,指客戶端在傳送請求後,不必等待服務端的回應就可以傳送下乙個請求,這樣對於所有的請求動作來說將會在服務端得到非同步,這條請求的鏈路就象是乙個請求佇列,所有的動作在這裡不會得到同步的。阻塞和非阻塞只是應用在請求的讀取和傳送。在實現過程中,如果服務端是非同步的話,客戶端也是非同步的話,通訊效率會很高,但如果服務端在請求的返回時也是返回給請求的鏈路時,客戶端是可以同步的,這種情況下,服務端是相容同步和非同步的。相反,如果客戶端是非同步而服務端是同步的也不會有問題,只是處理效率低了些。

在說到同步和非同步的區別之前我先舉乙個簡單的例子:

同步.一條馬路,只能開一輛車,等這個車開走了,才能開另一輛.

非同步.一條馬路,隨便開多少車.

同步與非同步 阻塞與非阻塞

設想一下這個情景,你列了個購物清單 a,b,c,d 去商店買東西,你向老闆詢店問有沒有你想要的a i o操作 於是老闆去倉庫檢視,這個時候假如你在前台等待老闆查詢結果回來那麼這種詢問等待的方式為同步,此時你相當於被掛起,是處於阻塞狀態的,而如果你沒有在前台等待老闆的查詢而是接著進店逛看有沒有你想要的...

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

同步與非同步阻塞與非阻塞 阻塞和非阻塞關注的是程式在等待呼叫結果 訊息,返回值 時的狀態.阻塞呼叫是指呼叫結果返回之前,當前執行緒會被掛起。呼叫執行緒只有在得到結果之後才會返回。非阻塞呼叫指在不能立刻得到結果之前,該呼叫不會阻塞當前執行緒。還是上面的例子,你打 問書店老闆有沒有 分布式系統 這本書,...

同步與非同步 阻塞與非阻塞

摘要 一直為同步非同步,阻塞非阻塞概念所困擾,特定總結了下,原來是這麼個意思 一直為同步非同步,阻塞非阻塞概念所困擾,特定總結了下 1 概念介紹 2 訊息通知ps 呼叫者獲取依賴服務非同步 結果一般有兩種方式 一種是主動去輪訓查詢非同步 的結果,一種呼叫依賴服務時傳入乙個callback方法或者 位...