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

2021-08-27 22:21:26 字數 1293 閱讀 6782

一、概念

非同步:某個事情需要10s完成。而我只需要呼叫某個函式告訴***來幫我做(然後我再幹其他的事情)

同步:某個事情需要10s完成,我需要一直等它完成(等10s),再能繼續後面的工作。

阻塞:做某件事情,直到完成,除非超時

非阻塞:嘗試做,如果不能做,就不做(直接返回),如果能做,就做。

前兩者和後兩者不容易區分,不過前兩者更多的有涉及到多執行緒互動(訊息)的場景。

二、舉個例子

小李喝了想喝水,於是去煮開水。

1、小李把水壺放到爐子上,等待水燒開。(同步阻塞)

小李感覺這樣太費時間。

2、小李把水壺放到爐子上,去客廳看電視,時不時去廚房看看水開沒有。(同步非阻塞)

小李還是覺得自己這樣太累,於是買了把會響笛的那種水壺。水開之後,能發出聲音。

3、小李把響水壺放到爐子上,等待水壺發出聲音。(非同步阻塞)

覺得這樣傻等意義不大

5、小李把響水壺放到爐子上,去客廳看電視,水壺響之前不再去看它了,響了再去拿壺。(非同步非阻塞)

這樣真好。

三、深入理解

阻塞就是 recv/read的時候 socket接收緩衝區要是有資料就讀, 沒資料我就一直睡覺賴著不走,直到有資料來了讀完我才走。send/write的時候,要是傳送緩衝區滿了,沒有空間繼續傳送了我也一直睡覺賴著不走,直到傳送緩衝區騰出足夠的空間讓我把資料全部塞到傳送緩衝區裡我才走。(當然如果你通過setsockopt設定了讀寫超時,超時時間到了還是會返回-1和eagain,不再睡覺等待)

非阻塞就是recv/read的時候,要是接收緩衝區有資料我就讀完,沒有資料我直接帶著返回的-1和egain走人,絕不睡覺等待耽誤時間。write/send的時候, 要是傳送緩衝區有足夠的空間,就立刻把資料塞到傳送緩衝區去,然後走人,如果傳送快取區滿了,空間不足,那直接帶著返回的-1和eagain走人。

至於io多路復用,首先要理解的是,作業系統為你提供了乙個功能,當你的某個socket接收快取區有資料可讀,或者傳送緩衝區有空間可寫的時候,它可以給你乙個通知。這樣當配合非阻塞的socket使用時,只有當系統通知我哪個描述符可讀了,我才去執行read操作,可以保證每次read都能讀到有效資料而不做純返回-1和eagain的無用功。寫操作類似。作業系統的這個功能通過select/poll/epoll之類的系統呼叫函式來使用,這些函式都可以同時監視多個描述符的讀寫就緒狀況,這樣,多個描述符的i/o操作都能在乙個執行緒內完成,這就叫i/o多路復用,這裡的「復用」指的是復用同乙個執行緒。

至於事件驅動,其實是i/o多路復用的乙個另外的稱呼。

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

對於發生一次網路io,可以分為兩部分 1 等待資料 阻塞 執行緒一直阻塞等待資料。非阻塞 執行緒傳送請求後,不等待資料,通過輪詢 訊號量等方式去獲取資料是否準備好。2 將資料從核心複製到使用者空間 同步 執行緒自己把資料從核心複製到使用者空間,期間不能做其它事情,一直等待資料複製完畢。非同步 系統核...

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

在進行網路程式設計時,我們常常見到同步 非同步 阻塞和非阻塞四種呼叫方式。這些方式彼此概念並不好理解。下面是我對這些術語的區別。所謂同步,就是在發出乙個功能呼叫時,在沒有得到結果之前,該呼叫就不返回。按照這個定義,其實絕大多數函式都是同步呼叫 例如sin,isdigit等 但是一般而言,我們在說同步...

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

一 阻塞 與 非阻塞 與 同步 與 非同步 不能簡單的從字面理解,提供乙個從分布式系統角度的回答。1.同步與非同步同步和非同步關注的是訊息通訊機制 synchronous communication asynchronous communication 所謂同步,就是在發出乙個 呼叫 時,在沒有得到...