由于CPU和內(nèi)存的速度遠(yuǎn)遠(yuǎn)高于外設(shè)的速度,所以,在IO編程中,就存在速度嚴(yán)重不匹配的問題。舉個(gè)例子來說,比如要把100M的數(shù)據(jù)寫入磁盤,CPU輸出100M的數(shù)據(jù)只需要0.01秒,可是磁盤要接收這100M數(shù)據(jù)可能需要10秒,怎么辦呢?有兩種辦法:
- 第一種是CPU等著,也就是程序暫停執(zhí)行后續(xù)代碼,等100M的數(shù)據(jù)在10秒后寫入磁盤,再接著往下執(zhí)行,這種模式稱為同步IO;
- 另一種方法是CPU不等待,只是告訴磁盤,“您老慢慢寫,不著急,我接著干別的事去了”,于是,后續(xù)代碼可以立刻接著執(zhí)行,這種模式稱為異步IO。
一、同步和異步的區(qū)別
區(qū)別在于是否等待IO執(zhí)行的結(jié)果。
好比你去麥當(dāng)勞點(diǎn)餐,你說“來個(gè)漢堡”,服務(wù)員告訴你,對(duì)不起,漢堡要現(xiàn)做,需要等5分鐘,于是你站在收銀臺(tái)前面等了5分鐘,拿到漢堡再去逛商場(chǎng),這是同步IO。
你說“來個(gè)漢堡”,服務(wù)員告訴你,漢堡需要等5分鐘,你可以先去逛商場(chǎng),等做好了,我們?cè)偻ㄖ?,這樣你可以立刻去干別的事情(逛商場(chǎng)),這是異步IO。
二、優(yōu)缺點(diǎn)
很明顯,使用異步IO來編寫程序性能會(huì)遠(yuǎn)遠(yuǎn)高于同步IO,但是異步IO的缺點(diǎn)是編程模型復(fù)雜。想想看,你得知道什么時(shí)候通知你“漢堡做好了”,而通知你的方法也各不相同。如果是服務(wù)員跑過來找到你,這是回調(diào)模式,如果服務(wù)員發(fā)短信通知你,你就得不停地檢查手機(jī),這是輪詢模式??傊?,異步IO的復(fù)雜度遠(yuǎn)遠(yuǎn)高于同步IO。