阻塞和非阻塞
從簡(jiǎn)單的開(kāi)始,我們以經(jīng)典的讀取文件的模型舉例术浪。(對(duì)操作系統(tǒng)而言虹菲,所有的輸入輸出設(shè)備都被抽象成文件。)
在發(fā)起讀取文件的請(qǐng)求時(shí)萌衬,應(yīng)用層會(huì)調(diào)用系統(tǒng)內(nèi)核的 I/O 接口饮醇。
如果應(yīng)用層調(diào)用的是阻塞型 I/O,那么在調(diào)用之后秕豫,應(yīng)用層即刻被掛起朴艰,一直出于等待數(shù)據(jù)返回的狀態(tài),直到系統(tǒng)內(nèi)核從磁盤讀取完數(shù)據(jù)并返回給應(yīng)用層混移,應(yīng)用層才用獲得的數(shù)據(jù)進(jìn)行接下來(lái)的其他操作祠墅。
如果應(yīng)用層調(diào)用的是非阻塞 I/O,那么調(diào)用后歌径,系統(tǒng)內(nèi)核會(huì)立即返回(雖然還沒(méi)有文件內(nèi)容的數(shù)據(jù))毁嗦,應(yīng)用層并不會(huì)被掛起,它可以做其他任意它想做的操作回铛。(至于文件內(nèi)容數(shù)據(jù)如何返回給應(yīng)用層狗准,這已經(jīng)超出了阻塞和非阻塞的辨別范疇。)
這便是(脫離同步和異步來(lái)說(shuō)之后)阻塞和非阻塞的區(qū)別茵肃∏怀ぃ總結(jié)來(lái)說(shuō),是否是阻塞還是非阻塞免姿,關(guān)注的是接口調(diào)用(發(fā)出請(qǐng)求)后等待數(shù)據(jù)返回時(shí)的狀態(tài)饼酿。被掛起無(wú)法執(zhí)行其他操作的則是阻塞型的,可以被立即「抽離」去完成其他「任務(wù)」的則是非阻塞型的胚膊。
同步和異步
阻塞和非阻塞解決了應(yīng)用層等待數(shù)據(jù)返回時(shí)的狀態(tài)問(wèn)題故俐,那系統(tǒng)內(nèi)核獲取到的數(shù)據(jù)到底如何返回給應(yīng)用層呢?這里不同類型的操作便體現(xiàn)的是同步和異步的區(qū)別紊婉。
對(duì)于同步型的調(diào)用药版,應(yīng)用層需要自己去向系統(tǒng)內(nèi)核問(wèn)詢,如果數(shù)據(jù)還未讀取完畢喻犁,那此時(shí)讀取文件的任務(wù)還未完成槽片,應(yīng)用層根據(jù)其阻塞和非阻塞的劃分何缓,或掛起或去做其他事情(所以同步和異步并不決定其等待數(shù)據(jù)返回時(shí)的狀態(tài));如果數(shù)據(jù)已經(jīng)讀取完畢还栓,那此時(shí)系統(tǒng)內(nèi)核將數(shù)據(jù)返回給應(yīng)用層碌廓,應(yīng)用層即可以用取得的數(shù)據(jù)做其他相關(guān)的事情。
而對(duì)于異步型的調(diào)用剩盒,應(yīng)用層無(wú)需主動(dòng)向系統(tǒng)內(nèi)核問(wèn)詢谷婆,在系統(tǒng)內(nèi)核讀取完文件數(shù)據(jù)之后,會(huì)主動(dòng)通知應(yīng)用層數(shù)據(jù)已經(jīng)讀取完畢辽聊,此時(shí)應(yīng)用層即可以接收系統(tǒng)內(nèi)核返回過(guò)來(lái)的數(shù)據(jù)纪挎,再做其他事情。
這便是(脫離阻塞和非阻塞來(lái)說(shuō)之后)同步和異步的區(qū)別跟匆。也就是說(shuō)异袄,是否是同步還是異步,關(guān)注的是任務(wù)完成時(shí)消息通知的方式玛臂。由調(diào)用方盲目主動(dòng)問(wèn)詢的方式是同步調(diào)用烤蜕,由被調(diào)用方主動(dòng)通知調(diào)用方任務(wù)已完成的方式是異步調(diào)用。