IO操作其實(shí)可以分成兩個(gè)步驟,請(qǐng)求IO操作和執(zhí)行IO操作。一般的IO調(diào)用過(guò)程是這樣的:發(fā)起IO操作的請(qǐng)求,執(zhí)行IO操作,得到IO操作的結(jié)果,將結(jié)果返回給IO操作請(qǐng)求。
同步和異步同步和異步是一種通信機(jī)制,涉及到調(diào)用方和被調(diào)用方,關(guān)注的是IO操作的執(zhí)行過(guò)程及結(jié)果的返回方式,不同點(diǎn)在于雙方在這兩個(gè)方面的行為方式。如果調(diào)用方需要保持等待直到IO操作完成進(jìn)而通過(guò)返回獲得結(jié)果,則是同步的;如果調(diào)用方在IO操作的執(zhí)行過(guò)程中不需要保持等待,而是在操作完成后被動(dòng)的接受(通過(guò)消息或回調(diào))被調(diào)用方推送的結(jié)果,則是異步的。同步和異步,適合描述執(zhí)行IO操作的情境。
阻塞和非阻塞阻塞和非阻塞是一種調(diào)用機(jī)制,只涉及到調(diào)用方,關(guān)注的是IO操作的執(zhí)行狀態(tài),不同點(diǎn)在于請(qǐng)求IO操作后,針對(duì)IO操作的狀態(tài),調(diào)用方的行為方式。如果調(diào)用方等待IO操作完成后返回,則是阻塞的;如果調(diào)用方不需要等待IO操作完成就立即返回,則是非阻塞的,非阻塞的情況下,常常需要多次調(diào)用去check,才能獲得IO操作的結(jié)果。阻塞和非阻塞,適合描述發(fā)起IO操作請(qǐng)求的情境。
阻塞與非阻塞,和同步異步無(wú)關(guān),可以阻塞等待同步執(zhí)行過(guò)程完成,也可以阻塞等待異步執(zhí)行過(guò)程完成。根據(jù)以上理解,同步和異步,阻塞和非阻塞,是可以互相組合的。
同步阻塞調(diào)用者發(fā)起IO操作請(qǐng)求,等待IO操作完成再返回。IO操作的過(guò)程需要等待,操作執(zhí)行完成后返回結(jié)果。
同步非阻塞調(diào)用者發(fā)起IO操作請(qǐng)求,詢(xún)問(wèn)IO操作的狀態(tài),如果未完成,則立即返回;如果完成,則返回結(jié)果。IO操作的過(guò)程需要等待執(zhí)行完成才返回結(jié)果。
異步阻塞調(diào)用者發(fā)起IO操作請(qǐng)求,等待IO操作完成再返回。IO操作的過(guò)程不需要等待,操作完成后通過(guò)通知或回調(diào)獲得結(jié)果。
異步非阻塞調(diào)用者發(fā)起IO操作請(qǐng)求,詢(xún)問(wèn)IO操作的狀態(tài),如果未完成,則立即返回;如果完成,則返回結(jié)果。IO操作的過(guò)程不需要等待,操作完成后通過(guò)通知或回調(diào)獲得結(jié)果。