同步和異步
同步和異步是用戶線程與內(nèi)核交互的方式,關(guān)注的是消息通知機(jī)制,是如何通知調(diào)用者.
同步: synchronous
調(diào)用發(fā)出之后, 不會(huì)立即返回,一旦返回即是最終結(jié)果
異步:asynchronous
調(diào)用發(fā)出之后, 被調(diào)用方立即返回消息, 但返回的并非最終結(jié)果,被調(diào)用者通過(guò)狀態(tài)通知機(jī)制來(lái)通知調(diào)用者,或通過(guò)回調(diào)函數(shù)來(lái)處理結(jié)果
阻塞和非阻塞
阻塞和非阻塞是用戶線程調(diào)用內(nèi)核IO操作的方式,關(guān)注的是調(diào)用者等待被調(diào)用者返回調(diào)用結(jié)果時(shí)的狀態(tài)(即中間過(guò)程)
阻塞:block
調(diào)用結(jié)果返回之前,調(diào)用者會(huì)被掛起,可能轉(zhuǎn)為不可中斷睡眠,調(diào)用者只有在等到返回結(jié)果之后才會(huì)繼續(xù)處理新的請(qǐng)求.
非阻塞: nonblock
調(diào)用者在結(jié)果返回之前,不會(huì)被掛起,即調(diào)用不會(huì)被阻塞調(diào)用者
=====
I/O模型
阻塞式IO: blocking IO
同步阻塞IO模型是最簡(jiǎn)單的IO模型,用戶線程在內(nèi)核進(jìn)行IO操作時(shí)被阻塞,處理不可中斷睡眠,此過(guò)程中第一階段它要一直處于等待狀態(tài).
非阻塞式IO:nonblocking IO
第一階段它要盲等待(輪循),這種情況下, 會(huì)影響系統(tǒng)的整體性能,大量用戶請(qǐng)求的情況下, 會(huì)降低性能.
復(fù)用型IO: multiplexing IO
也被稱之為多路IO復(fù)用.其有selet(),poll(),select()等函數(shù),select()要求最多不能超過(guò)1024個(gè)調(diào)用,prefork就是基于select的多路利用模型, 其select幫調(diào)用者阻塞,調(diào)用者能接受其它請(qǐng)求,第二階段也會(huì)被阻塞(數(shù)據(jù)從內(nèi)核空間至用戶進(jìn)程空間的過(guò)程). 通常一個(gè)進(jìn)程只能處理一個(gè)IO,但web場(chǎng)景一般都是兩路IO(磁盤和網(wǎng)絡(luò)). 在內(nèi)核中有新的IO調(diào)用,當(dāng)調(diào)用者發(fā)起IO調(diào)用時(shí),內(nèi)核中有一個(gè)代理人(select,poll)幫其阻塞,并將請(qǐng)求轉(zhuǎn)換為內(nèi)核能理解的內(nèi)容.
事件驅(qū)動(dòng)式IO:signal driven IO
調(diào)用者發(fā)起調(diào)用后,被調(diào)用者收到請(qǐng)求后,立即返回收到消息(即在此動(dòng)作中,調(diào)用者向內(nèi)核注冊(cè)了一個(gè)函數(shù)),當(dāng)內(nèi)核處理完成后, 再通知調(diào)用者.第一階段非阻塞,第二階段是阻塞的.event模型也采用了此種IO機(jī)制. nginx也是采用了此種IO機(jī)制(并且還是邊緣觸發(fā),其也支持異步IO機(jī)制). 當(dāng)有IO調(diào)用已經(jīng)在內(nèi)核完成時(shí), 進(jìn)程正忙于處理其它請(qǐng)求,未能處理新到的IO事件,此時(shí)內(nèi)核將完成的事件存放于內(nèi)核某位置,進(jìn)程空閑時(shí)通過(guò)回調(diào)函數(shù)再進(jìn)行讀取.
異步IO
其由內(nèi)核完成兩個(gè)階段后,再通知調(diào)用者,其epoll()函數(shù)就是異步IO機(jī)制.
mmap機(jī)制
直接將磁盤的地址映射到內(nèi)存中,通知進(jìn)程過(guò)來(lái)讀取.
=======
一次完整的READ操作:
- 第一階段: 等待數(shù)據(jù)準(zhǔn)備好, 從磁盤到內(nèi)存中.
- 第二階段: 數(shù)據(jù)從內(nèi)核空間至進(jìn)程空間(此階段被理解為真正的IO調(diào)用)