參考&部分**文章:
首先了解一下同步、非同步、阻塞與非阻塞
io分兩階段(一旦拿到資料後就變成了資料操作,不再是io):
1.資料準備階段
2.核心空間複製資料到使用者程序緩衝區(使用者空間)階段
在作業系統中,程式執行的空間分為核心空間和使用者空間。應用程式都是執行在使用者空間的,所以它們能操作的資料也都在使用者空間。
「阻塞」與"非阻塞"與"同步"與「非同步"不能簡單的從字面理解,提供乙個從分布式系統角度的回答。
1.同步與非同步
同步和非同步關注的是訊息通訊機制(synchronous communication/
asynchronous communication),同步與非同步是對應於呼叫者與被呼叫者,它們是執行緒之間的關係,兩個執行緒之間要麼是同步的,要麼是非同步的,
所謂同步,就是在發出乙個*呼叫*時,在沒有得到結果之前,該*呼叫*就不返回。但是一旦呼叫返回,就得到返回值了。
換句話說,就是由*呼叫者*主動等待這個*呼叫*的結果。
而非同步則是相反,*呼叫*在發出之後,這個呼叫就直接返回了,所以沒有返回結果。換句話說,當乙個非同步過程呼叫發出後,呼叫者不會立刻得到結果。而是在*呼叫*發出後,*被呼叫者*通過狀態、通知來通知呼叫者,或通過**函式處理這個呼叫。
典型的非同步程式設計模型比如node.js、ajax
舉個通俗的例子:
你打**問書店老闆有沒有《分布式系統》這本書,如果是同步通訊機制,書店老闆會說,你稍等,」我查一下",然後開始查啊查,等查好了(可能是5秒,也可能是一天)告訴你結果(返回結果)。
而非同步通訊機制,書店老闆直接告訴你我查一下啊,查好了打**給你,然後直接掛**了(不返回結果)。然後查好了,他會主動打**給你。在這裡老闆通過「回電」這種方式來**。
2.阻塞與非阻塞
阻塞和非阻塞關注的是程式在等待呼叫結果(訊息,返回值)時的狀態.
阻塞與非阻塞是對同乙個執行緒來說的,在某個時刻,執行緒要麼處於阻塞,要麼處於非阻塞,阻塞呼叫是指呼叫結果返回之前,當前執行緒會被掛起。呼叫執行緒只有在得到結果之後才會返回。
非阻塞呼叫指在不能立刻得到結果之前,該呼叫不會阻塞當前執行緒。
1同步阻塞方式:
傳送方傳送請求之後一直等待響應。
接收方處理請求時進行的io操作如果不能馬上等到返回結果,就一直等到返回結果後,才響應傳送方,期間不能進行其他工作。
2同步非阻塞方式:
傳送方傳送請求之後,一直等待響應。
接受方處理請求時進行的io操作如果不能馬上的得到結果,就立即返回,取做其他事情。
但是由於沒有得到請求處理結果,不響應傳送方,傳送方一直等待。
當io操作完成以後,將完成狀態和結果通知接收方,接收方再響應傳送方,傳送方才進入下一次請求過程。(實際不應用)
3非同步阻塞方式:
傳送方向接收方請求後,不等待響應,可以繼續其他工作。
接收方處理請求時進行io操作如果不能馬上得到結果,就一直等到返回結果後,才響應傳送方,期間不能進行其他操作。 (實際不應用)
4非同步非阻塞方式:
傳送方向接收方請求後,不等待響應,可以繼續其他工作。
接收方處理請求時進行io操作如果不能馬上得到結果,也不等待,而是馬上返回去做其他事情。
當io操作完成以後,將完成狀態和結果通知接收方,接收方再響應傳送方。(效率最高)
參考:
阻塞非阻塞與同步非同步
老張愛喝茶,廢話不說,煮開水。出場人物 老張,水壺兩把 普通水壺,簡稱水壺 會響的水壺,簡稱響水壺 1 老張把水壺放到火上,立等水開。同步阻塞 老張覺得自己有點傻 2 老張把水壺放到火上,去客廳看電視,時不時去廚房看看水開沒有。同步非阻塞 老張還是覺得自己有點傻,於是變高階了,買了把會響笛的那種水壺...
同步 非同步與阻塞 非阻塞
怎樣理解阻塞非阻塞與同步非同步的區別?嚴肅的回答 知乎 知乎這個問題下的各個回答,以及這篇blog已經講的很清楚了。也有提到同步阻塞,和非同步非阻塞是繫結的。但也有對同步非阻塞,和非同步非阻塞的模型的闡釋,特此記錄解釋。在這套解釋中,同步和非同步的語義不只是立即返回與否,還是獲取結果已完成的方式是通...
同步非同步與阻塞非阻塞
同步非同步,阻塞非阻塞他們針對的物件是不一樣的。對於呼叫者來說是阻塞跟非阻塞,被呼叫者是同步跟非同步。同步通訊和非同步通訊 阻塞與非阻塞 同步阻塞 非阻塞 多路io復用,都是同步io,非同步必定是非阻塞的。真正的非同步io需要cpu的深度參與。換句話說,只有使用者執行緒在操作io的時候根本不去考慮i...