之前看《UNIX網(wǎng)絡(luò)編程》時(shí),對(duì)于Linux IO 模式的理解總覺得不夠徹底唯鸭。最近借著看spp源碼的機(jī)會(huì),對(duì)這部分知識(shí)進(jìn)行了相關(guān)梳理订讼。以下討論內(nèi)容的背景是Linux環(huán)境下的網(wǎng)絡(luò)IO迟赃。
網(wǎng)絡(luò)IO:網(wǎng)絡(luò)IO涉及網(wǎng)絡(luò)上數(shù)據(jù)的傳輸混弥,其顯著特點(diǎn)是IO的時(shí)延比較大磕仅。一次網(wǎng)絡(luò)IO過程(read 操作)通晨暮椋可分解為倆個(gè)操作過程搅吁,1威创、等待數(shù)據(jù)準(zhǔn)備就緒(填充內(nèi)核緩存) 2、將數(shù)據(jù)從內(nèi)核拷貝到用戶進(jìn)程空間
阻塞和非阻塞:正在執(zhí)行的進(jìn)程谎懦,由于期待某些事情的發(fā)送肚豺,而無法繼續(xù)工作的時(shí)候,自動(dòng)執(zhí)行系統(tǒng)阻塞原語(yǔ)界拦,使自己處于阻塞狀態(tài)吸申。進(jìn)程進(jìn)入阻塞狀態(tài)是不占用CPU資源。阻塞和非阻塞是針對(duì)當(dāng)數(shù)據(jù)沒有準(zhǔn)備好的時(shí)候【步驟1】,進(jìn)程采取的策略截碴。
同步和異步:同步是指進(jìn)程進(jìn)行IO 操作的時(shí)候會(huì)阻塞(這里的阻塞特指當(dāng)數(shù)據(jù)準(zhǔn)備好的情況下梳侨,進(jìn)程一定會(huì)等數(shù)據(jù)拷貝完成后再進(jìn)行后續(xù)執(zhí)行流。這里的IO操作特指將數(shù)據(jù)從內(nèi)核拷貝到用戶進(jìn)程)隐岛;異步是指當(dāng)進(jìn)程發(fā)起IO操作后猫妙,就直接返回了,直到kernel發(fā)送信號(hào)告訴進(jìn)程IO完成了聚凹,這種模式割坠,進(jìn)程在整個(gè)過程中完全沒有被阻塞。同步和異步是針對(duì)當(dāng)數(shù)據(jù)從內(nèi)核拷貝的用戶空間這段時(shí)間內(nèi)【步驟2】妒牙,進(jìn)程采取的策略彼哼。
正因?yàn)榫W(wǎng)絡(luò)IO操作需要經(jīng)歷兩個(gè)階段,linux系統(tǒng)區(qū)分了下面五種網(wǎng)絡(luò)模型湘今。
阻塞IO
阻塞IO的操作流程如下圖:
阻塞模式的特點(diǎn)是:直到數(shù)據(jù)準(zhǔn)備好敢朱,阻塞步驟1; 直到數(shù)據(jù)拷貝完成摩瞎,阻塞步驟2拴签;
非阻塞IO
非阻塞IO的操作流程如下圖:
非阻塞模式的特點(diǎn)是:如果數(shù)據(jù)沒有準(zhǔn)備好則返回,不阻塞步驟1旗们; 直到數(shù)據(jù)拷貝完成蚓哩,阻塞步驟2;(由于不阻塞步驟1上渴,因此需要用戶進(jìn)程不斷主動(dòng)詢問kernel數(shù)據(jù)是否準(zhǔn)備好了)
IO多路復(fù)用
IO多路復(fù)用的操作流程如下圖:
IO多路復(fù)用的特點(diǎn)是:直到數(shù)據(jù)準(zhǔn)備好(多路中岸梨,只要有一路準(zhǔn)備好就算是有數(shù)據(jù)),阻塞步驟1稠氮;直到數(shù)據(jù)拷貝完成曹阔,阻塞步驟2;和阻塞IO不同地地方在于:1隔披、IO多路復(fù)用步驟1在代理系統(tǒng)調(diào)用處阻塞(select赃份,epoll等)而不是read系統(tǒng)調(diào)用處阻塞 2、IO多路復(fù)用同時(shí)監(jiān)控多路奢米,只要有一路數(shù)據(jù)準(zhǔn)備完畢抓韩,其代理系統(tǒng)調(diào)用就返回。
信號(hào)驅(qū)動(dòng)IO
信號(hào)驅(qū)動(dòng)IO的操作流程如下:
信號(hào)驅(qū)動(dòng)IO的主要特點(diǎn)是: 預(yù)先告知內(nèi)核當(dāng)某個(gè)socket有數(shù)據(jù)的時(shí)候通知進(jìn)程恃慧,不阻塞步驟1;用戶進(jìn)程讀取數(shù)據(jù)园蝠,阻塞步驟2.
異步IO
異步IO的操作流程如下:
異步操作的特點(diǎn)是: 調(diào)用后馬上返回,不阻塞步驟1痢士,不阻塞步驟2; 內(nèi)核完成步驟1和步驟2后給用戶進(jìn)程發(fā)送signal彪薛,告訴用戶進(jìn)程read操作完成了茂装。
所以,阻塞善延、非阻塞少态、IO多路復(fù)用模式、信號(hào)驅(qū)動(dòng)IO都是同步模式易遣; 只有異步IO模式是異步彼妻。判斷阻塞、非阻塞看步驟1是否會(huì)被阻塞豆茫;判斷同步和異步侨歉,看步驟2是否會(huì)被阻塞。