深入討論阻塞與非阻塞 同步與非同步的區別

2021-08-19 10:46:06 字數 1293 閱讀 9248

一、概念

非同步:某個事情需要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多路復用的乙個另外的稱呼。

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

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

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

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

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

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