APUE第十四章高級(jí)I/O 筆記
Posted on 2011-12-27 10:17 Onway 閱讀(388) 評(píng)論(0) 編輯 收藏 引用 所屬分類(lèi): 使用說(shuō)明2011-12-19 第十四章 高級(jí)I/O
第一節(jié) 引言
1,高級(jí)I/O包括:
非阻塞I/O
記錄鎖
系統(tǒng)V流機(jī)制
I/O多路轉(zhuǎn)接
readv和writev函數(shù)
存儲(chǔ)映像I/O(mmap)
第二節(jié) 非阻塞I/O
1,低速系統(tǒng)調(diào)用是可能會(huì)使進(jìn)程永遠(yuǎn)阻塞的一類(lèi)系統(tǒng)調(diào)用。
2,雖然讀寫(xiě)磁盤(pán)文件會(huì)使調(diào)用者在短暫時(shí)間內(nèi)阻塞,但并不能將與磁盤(pán)I/O有關(guān)的系統(tǒng)調(diào)用視為“低速”。
3,對(duì)于一個(gè)給定的描述符有兩種方法對(duì)其指定非阻塞I/O:
a,如果調(diào)用open獲得描述符,則可指定O_NONBLOCK標(biāo)志
b,對(duì)于已經(jīng)打開(kāi)的一個(gè)描述符,則可調(diào)用fcntl,由該函數(shù)打開(kāi)O_NONBLOCK文件狀態(tài)標(biāo)志。
4,POSIX.1要求,對(duì)于一個(gè)非阻塞的描述符如果無(wú)數(shù)據(jù)可讀,則read返回-1,并且errno被設(shè)置為EAGAIN。
5,文件狀態(tài)標(biāo)志的更改影響同一文件表項(xiàng)的所有用戶(hù),但與通過(guò)其他文件表項(xiàng)對(duì)同一設(shè)備的訪(fǎng)問(wèn)無(wú)關(guān)。
第三節(jié) 記錄鎖
1,記錄鎖的功能是:當(dāng)一個(gè)進(jìn)程正在讀或修改文件的某個(gè)部分時(shí),它可以阻止其他進(jìn)程修改同一文件區(qū)。
2,fcntl記錄鎖的基本規(guī)則是:多個(gè)進(jìn)程在一個(gè)給定的字節(jié)上可以有一把共享的讀鎖,但是在一個(gè)給定的字節(jié)上只能有一個(gè)進(jìn)程獨(dú)用一把寫(xiě)鎖。進(jìn)一步而言,如果在一個(gè)給定的字節(jié)上已經(jīng)有一把或多把讀鎖,則不能在該字節(jié)上再加寫(xiě)鎖;如果一個(gè)字節(jié)上已經(jīng)有一把獨(dú)占性的寫(xiě)鎖,則不能對(duì)它再加任何的讀鎖。
3,上面說(shuō)明的兼容性規(guī)則適用于不同進(jìn)程提出的鎖請(qǐng)求,并不使用于單個(gè)進(jìn)程提出的多個(gè)鎖請(qǐng)求。
4,記錄鎖的自動(dòng)繼承和釋放有三條規(guī)則:
a,當(dāng)一個(gè)進(jìn)程終止時(shí),它鎖建立的鎖全部釋放;任何時(shí)候關(guān)閉一個(gè)描述符時(shí),該進(jìn)程通過(guò)這一描述可以引用的文件上的任何一把鎖都被釋放。
b,由fork產(chǎn)生的子進(jìn)程不繼承父進(jìn)程鎖設(shè)置的鎖。
c,在執(zhí)行exec后,新程序可以繼承原執(zhí)行程序的鎖。
5,在接近文件尾端加鎖或解鎖時(shí)需要特別小心。
6,建議性鎖對(duì)非合作進(jìn)程是不起作用的。
7,linux中,使用強(qiáng)制性鎖需要在文件系統(tǒng)掛載的時(shí)候mount命令加上_omand選項(xiàng)以打開(kāi)該機(jī)制。
8,對(duì)于一個(gè)特定文件打開(kāi)其設(shè)置組ID位,并關(guān)閉其組執(zhí)行位,則對(duì)該文件開(kāi)始了強(qiáng)制性鎖機(jī)制。
第四節(jié) STREAMS(看不懂啊!)
1,STREAMS是系統(tǒng)V提供的構(gòu)造內(nèi)核設(shè)備驅(qū)動(dòng)程序和網(wǎng)絡(luò)協(xié)議包的一種通用方法。
2,流在用戶(hù)進(jìn)程和設(shè)備驅(qū)動(dòng)程序之間提供了一條全雙工通路。流無(wú)需和實(shí)際硬件設(shè)備直接會(huì)話(huà),流也可以用來(lái)構(gòu)造偽設(shè)備驅(qū)動(dòng)程序。
3,在Linux中,STREAMS子系統(tǒng)是可用的,但是用戶(hù)必須自行將該子系統(tǒng)安裝到系統(tǒng)中,通常它默認(rèn)為不包括在系統(tǒng)中。
第五節(jié) I/O多路轉(zhuǎn)接
1,I/O多路轉(zhuǎn)接:先構(gòu)造一張有關(guān)描述符的列表,然后調(diào)用一個(gè)函數(shù),直到這些描述符中的一個(gè)已準(zhǔn)備好進(jìn)行I/O操作時(shí),該函數(shù)才返回。在返回時(shí),它告訴進(jìn)程哪些進(jìn)程已經(jīng)好可以進(jìn)行I/O。這些函數(shù)即select和pselect函數(shù)。
2,poll函數(shù)類(lèi)似于select,但是其程序員接口則有所不同。
3,雖然poll函數(shù)可用于任何類(lèi)型的文件描述符,但它起源于系統(tǒng)V,所以poll與STREAMS系統(tǒng)緊緊相關(guān)。
4,poll和select函數(shù)在被信號(hào)中斷后都不會(huì)被重啟動(dòng),即使啟用了SA_RESTART函數(shù)。
第六節(jié) 異步I/O
1,select和poll對(duì)任意描述符都能工作。
2,在系統(tǒng)V派生的系統(tǒng)中,異步I/O只對(duì)STREAMS設(shè)備和STREAMS管道起作用。在BSD派生的系統(tǒng)中,異步I/O只對(duì)終端和網(wǎng)絡(luò)起作用。
第七節(jié) readv和writev函數(shù)
1,readv和writev函數(shù)用于在一次函數(shù)調(diào)用中讀寫(xiě)多個(gè)非連續(xù)緩沖區(qū)。
第八節(jié) readn和writen函數(shù)
1,readn和writen函數(shù)并非任何標(biāo)準(zhǔn)的組成部分。
2,注意read,write函數(shù)返回值小于要求值的情況。
第九節(jié) 存儲(chǔ)映射I/O
1,存儲(chǔ)映射I/O使一個(gè)磁盤(pán)文件與存儲(chǔ)空間中的一個(gè)緩沖區(qū)相映射。
2,將一個(gè)普通文件復(fù)制到另一個(gè)普通文件中時(shí),存儲(chǔ)映射I/O比較快。但是有一些限制,例如,不能用其在某些設(shè)備(如網(wǎng)絡(luò)設(shè)備或終端設(shè)備)之間進(jìn)行復(fù)制,并且在對(duì)被復(fù)制的文件進(jìn)行映射后,也要注意該文件的長(zhǎng)度是否改變。
第十節(jié) 小結(jié)
PS:這章在STREAMS一節(jié)糾結(jié)了好久還是沒(méi)看懂,其他的也只是基本看了個(gè)概念。期間也跳到第十五章看了一下前幾節(jié)。

