今天看了篇知乎討論,將非同步和非阻塞講的透徹;在這裡整理出來;
同步和非同步關注的是訊息通訊機制
同步,就是在發出乙個呼叫時,在沒有得到結果之前,該呼叫就不返回。但是一旦呼叫返回,就得到返回值了。
換句話說,就是由呼叫者主動等待這個呼叫的結果。
非同步則相反,呼叫在發出之後,這個呼叫就直接返回了,所以沒有返回結果。換句話說,當乙個非同步過程呼叫發出後,呼叫者不會立刻得到結果。而是在呼叫發出後,被呼叫者通過狀態、通知來通知呼叫者,或通過**函式處理這個呼叫。
阻塞和非阻塞關注的是程式在等待呼叫結果(訊息,返回值)時的狀態.
阻塞呼叫是指呼叫結果返回之前,當前執行緒會被掛起。呼叫執行緒只有在得到結果之後才會返回。
非阻塞呼叫指在不能立刻得到結果之前,該呼叫不會阻塞當前執行緒。當然,這就不知道呼叫是否完成,一般通過輪詢定期來探查呼叫是否完成;
在處理io的時候,阻塞和非阻塞都是同步;如:io多路復用(select/poll/epoll);
只有使用了特殊api,才是非同步io,如:linux的aio、windows的iocp .net的begininvoke/endinvoke;
你打**問書店老闆有沒有《分布式系統》這本書,如果是同步通訊機制,書店老闆會說,你稍等,」我查一下",然後開始查啊查,等查好了(可能是5秒,也可能是一天)告訴你結果(返回結果)。
而非同步通訊機制,書店老闆直接告訴你我查一下啊,查好了打**給你,然後直接掛**了(不返回結果)。然後查好了,他會主動打**給你。在這裡老闆通過「回電」這種方式來**。
你打**問書店老闆有沒有《分布式系統》這本書,你如果是阻塞式呼叫,你會一直把自己「掛起」,直到得到這本書有沒有的結果,如果是非阻塞式呼叫,你不管老闆有沒有告訴你,你自己先一邊去玩了, 當然你也要偶爾過幾分鐘check一下老闆有沒有返回結果。
在這裡阻塞與非阻塞與是否同步非同步無關。跟老闆通過什麼方式回答你結果無關。
另乙個有趣的例子:
老張愛喝茶,廢話不說,煮開水。
出場人物:老張,水壺兩把(普通水壺,簡稱水壺;會響的水壺,簡稱響水壺)。
1 老張把水壺放到火上,立等水開。(同步阻塞)
老張覺得自己有點傻
2 老張把水壺放到火上,去客廳看電視,時不時去廚房看看水開沒有。(同步非阻塞)
老張還是覺得自己有點傻,於是變高階了,買了把會響笛的那種水壺。水開之後,能大聲發出嘀~~~~的噪音。
3 老張把響水壺放到火上,立等水開。(非同步阻塞)
老張覺得這樣傻等意義不大
4 老張把響水壺放到火上,去客廳看電視,水壺響之前不再去看它了,響了再去拿壺。(非同步非阻塞)
老張覺得自己聰明了。
所謂同步非同步,只是對於水壺而言。
普通水壺,同步;響水壺,非同步。
雖然都能幹活,但響水壺可以在自己完工之後,提示老張水開了。這是普通水壺所不能及的。
同步只能讓呼叫者去輪詢自己(情況2中),造成老張效率的低下。
所謂阻塞非阻塞,僅僅對於老張而言。
立等的老張,阻塞;看電視的老張,非阻塞。
情況1和情況3中老張就是阻塞的,媳婦喊他都不知道。雖然3中響水壺是非同步的,可對於立等的老張沒有太大的意義。所以一般非同步是配合非阻塞使用的,這樣才能發揮非同步的效用。
非同步和非阻塞
web伺服器,撇開它對http協議封裝這些不談,我們在這裡只是關注它的工作方式。它的工作方式基本是這樣子的 來乙個連線請求,與其建立乙個連線,然後進行相應的資料傳輸,最後斷開連線。假如它是單程序單執行緒的,那麼乙個請求過來,成功建立連線之後。在這個請求結束之前,其它請求都沒有辦法再被處理了。這樣明顯...
同步 非同步 阻塞和非阻塞
同步 非同步 阻塞和非阻塞 在進行windowsapi winsock 網路程式設計時,我們常常見到同步 非同步 阻塞和非阻塞四種呼叫方式。這些方式其實都可以擴充套件為廣義的概念,幫助我們理解多執行緒,多程序,實時作業系統等更廣的概念。同步 synchronic 所謂同步,就是在發出乙個功能呼叫時,...
同步 非同步 阻塞和非阻塞
在進行網路程式設計時,我們常常見到同步 非同步 阻塞和非阻塞四種呼叫方式。這些方式彼此概念並不好理解。所謂同步,就是在發出乙個功能呼叫時,在沒有得到結果之前,該呼叫就不返回。按照這個定義,其實絕大多數函式都是同步呼叫 例如sin,isdigit等 但是一般而言,我們在說同步 非同步的時候,特指那些需...