工作了有一段時(shí)間了麻车,但是今天看到這個(gè)問(wèn)題時(shí)自己先想了想缀皱,大概能明白同步和異步的區(qū)別,但是阻塞和非阻塞就想不清楚了绪氛,后來(lái)網(wǎng)上查閱了好多資料唆鸡,甚至好多資料里邊的解釋都是不一樣的涝影,下面我用用我能理解的最簡(jiǎn)單的語(yǔ)言給大家解釋一下這些區(qū)別枣察,僅供參考,如有不同意見(jiàn)燃逻,歡迎砸磚序目。
同步和異步:
同步和異步是在線程層次來(lái)說(shuō)的,同步的情況下,是由處理消息者自己去等待消息是否被觸發(fā),而異步的情況下是由觸發(fā)機(jī)制來(lái)通知處理消息者,同步和異步最大的區(qū)別就在于伯襟。一個(gè)需要等待猿涨,一個(gè)不需要等待。
比如廣播姆怪,就是一個(gè)異步例子叛赚。發(fā)起者不關(guān)心接收者的狀態(tài)澡绩。不需要等待接收者的返回信息
電話,就是一個(gè)同步例子俺附。發(fā)起者需要等待接收者肥卡,接通電話后,通信才開始事镣。需要等待接收者的返回信息
同步:發(fā)送一個(gè)請(qǐng)求,等待返回,然后再發(fā)送下一個(gè)請(qǐng)求
異步:發(fā)送一個(gè)請(qǐng)求,不等待返回,隨時(shí)可以再發(fā)送下一個(gè)請(qǐng)求
從圖中可以看出同步是發(fā)送一個(gè)消息步鉴,返回一個(gè)消息,在這之間不會(huì)做別的事璃哟,需要等待只是在等待消息返回氛琢,幾次發(fā)送消息是有順序的,這是一種可靠的任務(wù)序列随闪。要么成功都成功阳似,失敗都失敗。而異步是不需要等待被依賴的任務(wù)完成铐伴,只是通知被依賴的任務(wù)要完成什么工作障般,依賴的任務(wù)也立即執(zhí)行,只要自己完成了整個(gè)任務(wù)就算完成了盛杰。至于被依賴的任務(wù)最終是否真正完成挽荡,依賴它的任務(wù)無(wú)法確定,所以它是不可靠的任務(wù)序列即供。
同步可以避免出現(xiàn)死鎖定拟,讀臟數(shù)據(jù)的發(fā)生,一般共享某一資源的時(shí)候用逗嫡,如果每個(gè)人都有修改權(quán)限青自,同時(shí)修改一個(gè)文件,有可能使一個(gè)人讀取另一個(gè)人已經(jīng)刪除的內(nèi)容驱证,就會(huì)出錯(cuò)延窜,同步就會(huì)按順序來(lái)修改。
異步則是可以提高效率了抹锄,現(xiàn)在cpu都是雙核逆瑞,四核,異步處理的話可以同時(shí)做多項(xiàng)工作伙单,當(dāng)然必須保證是可以并發(fā)處理的获高。
這些都是對(duì)的。
下面來(lái)看網(wǎng)上的一個(gè)解釋:
同步和異步關(guān)注的是消息通信機(jī)制(synchronous communication/ asynchronous communication)
所謂同步吻育,就是在發(fā)出一個(gè)*調(diào)用*時(shí)念秧,在沒(méi)有得到結(jié)果之前,該*調(diào)用*就不返回布疼。但是一旦調(diào)用返回摊趾,就得到返回值了币狠。
換句話說(shuō),就是由*調(diào)用者*主動(dòng)等待這個(gè)*調(diào)用*的結(jié)果砾层。
而異步則是相反总寻,*調(diào)用*在發(fā)出之后,這個(gè)調(diào)用就直接返回了梢为,所以沒(méi)有返回結(jié)果渐行。換句話說(shuō),當(dāng)一個(gè)異步過(guò)程調(diào)用發(fā)出后铸董,調(diào)用者不會(huì)立刻得到結(jié)果祟印。而是在*調(diào)用*發(fā)出后,*被調(diào)用者*通過(guò)狀態(tài)粟害、通知來(lái)通知調(diào)用者蕴忆,或通過(guò)回調(diào)函數(shù)處理這個(gè)調(diào)用。
典型的異步編程模型比如Node.js
舉個(gè)通俗的例子:
你打電話問(wèn)書店老板有沒(méi)有《分布式系統(tǒng)》這本書悲幅,如果是同步通信機(jī)制套鹅,書店老板會(huì)說(shuō),你稍等汰具,”我查一下"卓鹿,然后開始查啊查,等查好了(可能是5秒留荔,也可能是一天)告訴你結(jié)果(返回結(jié)果)吟孙。
而異步通信機(jī)制,書店老板直接告訴你我查一下啊聚蝶,查好了打電話給你杰妓,然后直接掛電話了(不返回結(jié)果)。然后查好了碘勉,他會(huì)主動(dòng)打電話給你巷挥。在這里老板通過(guò)“回電”這種方式來(lái)回調(diào)。
阻塞和非阻塞
阻塞與非阻塞主要是從 CPU 的消耗上來(lái)說(shuō)的验靡,阻塞和非阻塞應(yīng)該是發(fā)生在消息的處理的時(shí)刻倍宾。阻塞其實(shí)就是等待,發(fā)出通知晴叨,等待結(jié)果完成凿宾。非阻塞屬于發(fā)出通知,立即返回結(jié)果兼蕊,沒(méi)有等待過(guò)程。
阻塞就是 CPU 停下來(lái)等待一個(gè)慢的操作完成 CPU 才接著完成其它的事件蚕。非阻塞就是在這個(gè)慢的操作在執(zhí)行時(shí) CPU 去干其它別的事孙技,等這個(gè)慢的操作完成時(shí)产禾,CPU 再接著完成后續(xù)的操作。雖然表面上看非阻塞的方式可以明顯的提高 CPU 的利用率牵啦,但是也帶了另外一種后果就是系統(tǒng)的線程切換增加亚情。增加的 CPU 使用時(shí)間能不能補(bǔ)償系統(tǒng)的切換成本需要好好評(píng)估。
打個(gè)比喻吧:司機(jī)開車在路上阻車了哈雏,如果采用阻塞模式楞件,則司機(jī)停下來(lái)什么事也不干,就眼巴巴地直等前面的車啟動(dòng)裳瘪,他繼續(xù)跟車土浸。如果采用非阻塞模式,則前面阻車后彭羹,司機(jī)停下來(lái)看報(bào)紙黄伊,聽音樂(lè),等前面車走動(dòng)后派殷,他再放下報(bào)紙还最,繼續(xù)跟車。
總結(jié):
同步異步是在線程層次來(lái)說(shuō)的毡惜,阻塞非阻塞是在cpu層次來(lái)說(shuō)的拓轻,層次不同
同步與異步:是自己去做這件事情,自己拿結(jié)果(同步)经伙,還是等別人做好了來(lái)通知有結(jié)果(異步)悦即,注意這里說(shuō)的是拿結(jié)果。通常異步效率比較高橱乱,因?yàn)椴挥玫却际幔叫时容^低,要等待泳叠。同步:發(fā)送一個(gè)請(qǐng)求,等待返回,然后再發(fā)送下一個(gè)請(qǐng)求作瞄,異步:發(fā)送一個(gè)請(qǐng)求,不等待返回,隨時(shí)可以再發(fā)送下一個(gè)請(qǐng)求
阻塞非阻塞區(qū)別在于完成一件事情時(shí),當(dāng)事情還沒(méi)有完成時(shí)危纫,處理這件事情的人除此之外還能不能再做別的事情宗挥;能的話就是非阻塞,不能就是阻塞种蝶。
轉(zhuǎn)