from http://blog.csdn.net/whuqin/article/details/25735853 2014.05 應(yīng)用程序從網(wǎng)絡(luò)中拿數(shù)據(jù),要經(jīng)歷兩個(gè)階段:1、等待數(shù)據(jù)準(zhǔn)備好-分組到達(dá),被拷貝到內(nèi)核緩沖區(qū),組裝數(shù)據(jù)報(bào);2、數(shù)據(jù)從內(nèi)核緩沖區(qū)拷貝至用戶態(tài)應(yīng)用程序的緩沖區(qū)。Unix下五個(gè)I/O模型:
阻塞I/O:
進(jìn)程調(diào)用recvfrom,此系統(tǒng)調(diào)用直到數(shù)據(jù)報(bào)到達(dá)且拷貝到應(yīng)用緩沖區(qū)(或出錯(cuò))才返回。
非阻塞I/O:
應(yīng)用程序調(diào)用recvfrom時(shí)無數(shù)據(jù),內(nèi)核立馬返回錯(cuò)誤;有數(shù)據(jù),則拷貝數(shù)據(jù)到應(yīng)用緩沖區(qū)。一般應(yīng)用程序會(huì)循環(huán)調(diào)用recvfrom(輪詢),不斷查詢內(nèi)核數(shù)據(jù)是否準(zhǔn)備好,浪費(fèi)CPU。
I/O復(fù)用(select/poll/epoll,IO條件滿足時(shí)獲得通知):
應(yīng)用阻塞于select調(diào)用,等待數(shù)據(jù)報(bào)可讀。當(dāng)select返回套接口可讀條件時(shí),我們調(diào)用recvfrom將數(shù)據(jù)拷貝到應(yīng)用緩沖區(qū)。I/O復(fù)用對(duì)阻塞IO的好處是可以等待多個(gè)描述字準(zhǔn)備好。
信號(hào)驅(qū)動(dòng)I/O(SIGIO):
通過系統(tǒng)調(diào)用sigaction安裝一個(gè)信號(hào)處理程序(注冊信號(hào)),然后立即返回。數(shù)據(jù)報(bào)準(zhǔn)備好時(shí),內(nèi)核生成SIGIO信號(hào)通知信號(hào)處理程序,信號(hào)處理程序調(diào)用recvfrom取回?cái)?shù)據(jù)或者通知主循環(huán)自己來取數(shù)據(jù)。好處:半阻塞,數(shù)據(jù)到達(dá)之前,程序不阻塞,主循環(huán)可以繼續(xù)執(zhí)行,只是等待信號(hào)處理程序的通知(數(shù)據(jù)準(zhǔn)備好或者數(shù)據(jù)報(bào)準(zhǔn)備好讀)。
異步I/O(Posix.1的aio_和lio_系列函數(shù)):
與信號(hào)驅(qū)動(dòng)模型的區(qū)別-信號(hào)驅(qū)動(dòng)IO是由內(nèi)核通知何時(shí)可以啟動(dòng)一個(gè)IO操作,而異步IO模型是由內(nèi)核通知IO操作何時(shí)完成。我們調(diào)用aio_read函數(shù)告訴內(nèi)核描述字、緩沖區(qū)指針、緩沖區(qū)大小、文件偏移,并告訴內(nèi)核整個(gè)操作完成時(shí)何時(shí)通知我們。此系統(tǒng)調(diào)用立即返回,進(jìn)程不阻塞于等待IO完成。
異步IO很少使用,支持的系統(tǒng)較少。
I/O模型對(duì)比:
前4種I/O模型主要區(qū)別在第一階段,第二個(gè)階段基本相同(在數(shù)據(jù)從內(nèi)核拷貝到應(yīng)用程序緩沖區(qū)時(shí),進(jìn)程阻塞于recvfrom調(diào)用)。而異步I/O的兩個(gè)階段都不同于前4個(gè)模型。
同步I/O與異步I/O定義(Posix.1)比較:
同步I/O:同步I/O操作引起請(qǐng)求進(jìn)程阻塞,直到I/O操作完成。前四個(gè)模型阻塞I/O、非阻塞I/O、I/O復(fù)用模型和信號(hào)驅(qū)動(dòng)型I/O模型都是同步I/O模型。
異步I/O:異步I/O操作不引起請(qǐng)求進(jìn)程阻塞,因此只有兩階段都不阻塞的異步模型屬于異步I/O。
|