系統(tǒng)調(diào)用
操作系統(tǒng)的主要功能是為管理硬件資源和為應(yīng)用程序開發(fā)人員提供良好的環(huán)境,但是計(jì)算機(jī)系統(tǒng)的各種硬件資源是有限的,因此為了保證每一個(gè)進(jìn)程都能安全的執(zhí)行轩勘。處理器設(shè)有兩種模式:“用戶模式”與“內(nèi)核模式”伞芹。一些容易發(fā)生安全問題的操作都被限制在只有內(nèi)核模式下才可以執(zhí)行,例如I/O操作占婉,修改基址寄存器內(nèi)容等泡嘴。而連接用戶模式和內(nèi)核模式的接口稱之為系統(tǒng)調(diào)用。
應(yīng)用程序代碼運(yùn)行在用戶模式下逆济,當(dāng)應(yīng)用程序需要實(shí)現(xiàn)內(nèi)核模式下的指令時(shí)酌予,先向操作系統(tǒng)發(fā)送調(diào)用請(qǐng)求磺箕。操作系統(tǒng)收到請(qǐng)求后,執(zhí)行系統(tǒng)調(diào)用接口抛虫,使處理器進(jìn)入內(nèi)核模式松靡。當(dāng)處理器處理完系統(tǒng)調(diào)用操作后,操作系統(tǒng)會(huì)讓處理器返回用戶模式建椰,繼續(xù)執(zhí)行用戶代碼雕欺。
進(jìn)程的虛擬地址空間可分為兩部分,內(nèi)核空間和用戶空間棉姐。內(nèi)核空間中存放的是內(nèi)核代碼和數(shù)據(jù)屠列,而進(jìn)程的用戶空間中存放的是用戶程序的代碼和數(shù)據(jù)。不管是內(nèi)核空間還是用戶空間伞矩,它們都處于虛擬空間中笛洛,都是對(duì)物理地址的映射。
應(yīng)用程序中實(shí)現(xiàn)對(duì)文件的操作過程就是典型的系統(tǒng)調(diào)用過程乃坤。
虛擬文件系統(tǒng)
一個(gè)操作系統(tǒng)可以支持多種底層不同的文件系統(tǒng)(比如NTFS, FAT, ext3, ext4)苛让,為了給內(nèi)核和用戶進(jìn)程提供統(tǒng)一的文件系統(tǒng)視圖,Linux在用戶進(jìn)程和底層文件系統(tǒng)之間加入了一個(gè)抽象層湿诊,即虛擬文件系統(tǒng)(Virtual File System, VFS)狱杰,進(jìn)程所有的文件操作都通過VFS,由VFS來適配各種底層不同的文件系統(tǒng)厅须,完成實(shí)際的文件操作仿畸。
通俗的說,VFS就是定義了一個(gè)通用文件系統(tǒng)的接口層和適配層朗和,一方面為用戶進(jìn)程提供了一組統(tǒng)一的訪問文件颁湖,目錄和其他對(duì)象的統(tǒng)一方法,另一方面又要和不同的底層文件系統(tǒng)進(jìn)行適配例隆。如圖所示:
虛擬文件系統(tǒng)主要模塊
1甥捺、超級(jí)塊(super_block),用于保存一個(gè)文件系統(tǒng)的所有元數(shù)據(jù)镀层,相當(dāng)于這個(gè)文件系統(tǒng)的信息庫镰禾,為其他的模塊提供信息。因此一個(gè)超級(jí)塊可代表一個(gè)文件系統(tǒng)唱逢。文件系統(tǒng)的任意元數(shù)據(jù)修改都要修改超級(jí)塊吴侦。超級(jí)塊對(duì)象是常駐內(nèi)存并被緩存的。
2坞古、目錄項(xiàng)模塊备韧,管理路徑的目錄項(xiàng)。比如一個(gè)路徑 /home/foo/hello.txt痪枫,那么目錄項(xiàng)有home, foo, hello.txt织堂。目錄項(xiàng)的塊叠艳,存儲(chǔ)的是這個(gè)目錄下的所有的文件的inode號(hào)和文件名等信息。其內(nèi)部是樹形結(jié)構(gòu)易阳,操作系統(tǒng)檢索一個(gè)文件附较,都是從根目錄開始,按層次解析路徑中的所有目錄潦俺,直到定位到文件拒课。
- inode模塊,管理一個(gè)具體的文件事示,是文件的唯一標(biāo)識(shí)早像,一個(gè)文件對(duì)應(yīng)一個(gè)inode。通過inode可以方便的找到文件在磁盤扇區(qū)的位置肖爵。同時(shí)inode模塊可鏈接到address_space模塊扎酷,方便查找自身文件數(shù)據(jù)是否已經(jīng)緩存。
- 打開文件列表模塊遏匆,包含所有內(nèi)核已經(jīng)打開的文件。已經(jīng)打開的文件對(duì)象由open系統(tǒng)調(diào)用在內(nèi)核中創(chuàng)建谁榜,也叫文件句柄幅聘。打開文件列表模塊中包含一個(gè)列表,每個(gè)列表表項(xiàng)是一個(gè)結(jié)構(gòu)體struct file窃植,結(jié)構(gòu)體中的信息用來表示打開的一個(gè)文件的各種狀態(tài)參數(shù)帝蒿。
5、file_operations模塊巷怜。這個(gè)模塊中維護(hù)一個(gè)數(shù)據(jù)結(jié)構(gòu)葛超,是一系列函數(shù)指針的集合,其中包含所有可以使用的系統(tǒng)調(diào)用函數(shù)延塑,例如open绣张、read、write关带、mmap等侥涵。每個(gè)打開文件(打開文件列表模塊的一個(gè)表項(xiàng))都可以連接到file_operations模塊,從而對(duì)任何已打開的文件宋雏,通過系統(tǒng)調(diào)用函數(shù)芜飘,實(shí)現(xiàn)各種操作。
6磨总、address_space模塊嗦明,它表示一個(gè)文件在頁緩存中已經(jīng)緩存了的物理頁。它是頁緩存和外部設(shè)備中文件系統(tǒng)的橋梁蚪燕。如果將文件系統(tǒng)可以理解成數(shù)據(jù)源娶牌,那么address_space可以說關(guān)聯(lián)了內(nèi)存系統(tǒng)和文件系統(tǒng)奔浅。
由圖可以看出:
1、每個(gè)模塊都維護(hù)了一個(gè)X_op指針指向它所對(duì)應(yīng)的操作對(duì)象X_operations裙戏。
2乘凸、超級(jí)塊維護(hù)了一個(gè)s_files指針指向了“已打開文件列表模塊”,即內(nèi)核所有的打開文件的鏈表累榜,這個(gè)鏈表信息是所有進(jìn)程共享的营勤。
3、目錄操作模塊和inode模塊都維護(hù)了一個(gè)X_sb指針指向超級(jí)塊壹罚,從而可以獲得整個(gè)文件系統(tǒng)的元數(shù)據(jù)信息葛作。
4、 目錄項(xiàng)對(duì)象和inode對(duì)象各自維護(hù)了指向?qū)Ψ降闹羔槻荩梢哉业綄?duì)方的數(shù)據(jù)赂蠢。
5、已打開文件列表上每一個(gè)file結(jié)構(gòu)體實(shí)例維護(hù)了一個(gè)f_dentry指針辨泳,指向了它對(duì)應(yīng)的目錄項(xiàng)虱岂,從而可以根據(jù)目錄項(xiàng)找到它對(duì)應(yīng)的inode信息。
6菠红、已打開文件列表上每一個(gè)file結(jié)構(gòu)體實(shí)例維護(hù)了一個(gè)f_op指針第岖,指向可以對(duì)這個(gè)文件進(jìn)行操作的所有函數(shù)集合file_operations。
7试溯、inode中不僅有和其他模塊關(guān)聯(lián)的指針蔑滓,重要的是它可以指向address_space模塊,從而獲得自身文件在內(nèi)存中的緩存信息遇绞。
8键袱、address_space內(nèi)部維護(hù)了一個(gè)樹結(jié)構(gòu)來指向所有的物理頁結(jié)構(gòu)page,同時(shí)維護(hù)了一個(gè)host指針指向inode來獲得文件的元數(shù)據(jù)摹闽。
進(jìn)程和虛擬文件系統(tǒng)交互
1蹄咖、內(nèi)核使用task_struct來表示單個(gè)進(jìn)程的描述符,其中包含維護(hù)一個(gè)進(jìn)程的所有信息付鹿。task_struct結(jié)構(gòu)體中維護(hù)了一個(gè) files的指針(和“已打開文件列表”上的表項(xiàng)是不同的指針)來指向結(jié)構(gòu)體files_struct比藻,files_struct中包含文件描述符表和打開的文件對(duì)象信息。
2倘屹、file_struct中的文件描述符表實(shí)際是一個(gè)file類型的指針列表(和“已打開文件列表”上的表項(xiàng)是相同的指針)银亲,可以支持動(dòng)態(tài)擴(kuò)展,每一個(gè)指針指向虛擬文件系統(tǒng)中文件列表模塊的某一個(gè)已打開的文件纽匙。
3务蝠、file結(jié)構(gòu)一方面可從f_dentry鏈接到目錄項(xiàng)模塊以及inode模塊,獲取所有和文件相關(guān)的信息烛缔,另一方面鏈接file_operations子模塊馏段,其中包含所有可以使用的系統(tǒng)調(diào)用函數(shù)轩拨,從而最終完成對(duì)文件的操作。這樣院喜,從進(jìn)程到進(jìn)程的文件描述符表亡蓉,再關(guān)聯(lián)到已打開文件列表上對(duì)應(yīng)的文件結(jié)構(gòu),從而調(diào)用其可執(zhí)行的系統(tǒng)調(diào)用函數(shù)喷舀,實(shí)現(xiàn)對(duì)文件的各種操作砍濒。
進(jìn)程 vs 文件列表 vs Inode
1、多個(gè)進(jìn)程可以同時(shí)指向一個(gè)打開文件對(duì)象(文件列表表項(xiàng))硫麻,例如父進(jìn)程和子進(jìn)程間共享文件對(duì)象爸邢;
2、一個(gè)進(jìn)程可以多次打開一個(gè)文件拿愧,生成不同的文件描述符杠河,每個(gè)文件描述符指向不同的文件列表表項(xiàng)。但是由于是同一個(gè)文件浇辜,inode唯一券敌,所以這些文件列表表項(xiàng)都指向同一個(gè)inode。通過這樣的方法實(shí)現(xiàn)文件共享(共享同一個(gè)磁盤文件)柳洋;
什么是緩存 I/O (Buffered I/O)
緩存 I/O 又被稱作標(biāo)準(zhǔn) I/O待诅,大多數(shù)文件系統(tǒng)的默認(rèn) I/O 操作都是緩存 I/O。在 Linux 的緩存 I/O 機(jī)制中膳灶,操作系統(tǒng)會(huì)將 I/O 的數(shù)據(jù)緩存在文件系統(tǒng)的頁緩存( page cache )中,也就是說立由,數(shù)據(jù)會(huì)先被拷貝到操作系統(tǒng)內(nèi)核的緩沖區(qū)中轧钓,然后才會(huì)從操作系統(tǒng)內(nèi)核的緩沖區(qū)拷貝到應(yīng)用程序的地址空間。緩存 I/O 有以下這些優(yōu)點(diǎn):
- 緩存 I/O 使用了操作系統(tǒng)內(nèi)核緩沖區(qū)锐膜,在一定程度上分離了應(yīng)用程序空間和實(shí)際的物理設(shè)備毕箍。
- 緩存 I/O 可以減少讀盤的次數(shù),從而提高性能道盏。
當(dāng)應(yīng)用程序嘗試讀取某塊數(shù)據(jù)的時(shí)候而柑,如果這塊數(shù)據(jù)已經(jīng)存放在了頁緩存中,那么這塊數(shù)據(jù)就可以立即返回給應(yīng)用程序荷逞,而不需要經(jīng)過實(shí)際的物理讀盤操作媒咳。當(dāng)然,如果數(shù)據(jù)在應(yīng)用程序讀取之前并未被存放在頁緩存中种远,那么就需要先將數(shù)據(jù)從磁盤讀到頁緩存中去涩澡。對(duì)于寫操作來說,應(yīng)用程序也會(huì)將數(shù)據(jù)先寫到頁緩存中去坠敷,數(shù)據(jù)是否被立即寫到磁盤上去取決于應(yīng)用程序所采用的寫操作機(jī)制:如果用戶采用的是同步寫機(jī)制( synchronous writes ), 那么數(shù)據(jù)會(huì)立即被寫回到磁盤上妙同,應(yīng)用程序會(huì)一直等到數(shù)據(jù)被寫完為止射富;如果用戶采用的是延遲寫機(jī)制( deferred writes ),那么應(yīng)用程序就完全不需要等到數(shù)據(jù)全部被寫回到磁盤粥帚,數(shù)據(jù)只要被寫到頁緩存中去就可以了胰耗。在延遲寫機(jī)制的情況下,操作系統(tǒng)會(huì)定期地將放在頁緩存中的數(shù)據(jù)刷到磁盤上芒涡。與異步寫機(jī)制( asynchronous writes )不同的是柴灯,延遲寫機(jī)制在數(shù)據(jù)完全寫到磁盤上的時(shí)候不會(huì)通知應(yīng)用程序,而異步寫機(jī)制在數(shù)據(jù)完全寫到磁盤上的時(shí)候是會(huì)返回給應(yīng)用程序的拖陆。所以延遲寫機(jī)制本身是存在數(shù)據(jù)丟失的風(fēng)險(xiǎn)的弛槐,而異步寫機(jī)制則不會(huì)有這方面的擔(dān)心。
緩存 I/O 的缺點(diǎn)
在緩存 I/O 機(jī)制中依啰,DMA 方式可以將數(shù)據(jù)直接從磁盤讀到頁緩存中乎串,或者將數(shù)據(jù)從頁緩存直接寫回到磁盤上,而不能直接在應(yīng)用程序地址空間和磁盤之間進(jìn)行數(shù)據(jù)傳輸速警,這樣的話叹誉,數(shù)據(jù)在傳輸過程中需要在應(yīng)用程序地址空間和頁緩存之間進(jìn)行多次數(shù)據(jù)拷貝操作,這些數(shù)據(jù)拷貝操作所帶來的 CPU 以及內(nèi)存開銷是非常大的闷旧。
對(duì)于某些特殊的應(yīng)用程序來說长豁,避開操作系統(tǒng)內(nèi)核緩沖區(qū)而直接在應(yīng)用程序地址空間和磁盤之間傳輸數(shù)據(jù)會(huì)比使用操作系統(tǒng)內(nèi)核緩沖區(qū)獲取更好的性能,下面提到的自緩存應(yīng)用程序就是其中的一種忙灼。
自緩存應(yīng)用程序( self-caching applications)
對(duì)于某些應(yīng)用程序來說匠襟,它會(huì)有它自己的數(shù)據(jù)緩存機(jī)制,比如该园,它會(huì)將數(shù)據(jù)緩存在應(yīng)用程序地址空間酸舍,這類應(yīng)用程序完全不需要使用操作系統(tǒng)內(nèi)核中的高速緩沖存儲(chǔ)器,這類應(yīng)用程序就被稱作是自緩存應(yīng)用程序( self-caching applications )里初。數(shù)據(jù)庫管理系統(tǒng)是這類應(yīng)用程序的一個(gè)代表啃勉。
自緩存應(yīng)用程序傾向于使用數(shù)據(jù)的邏輯表達(dá)方式,而非物理表達(dá)方式双妨;當(dāng)系統(tǒng)內(nèi)存較低的時(shí)候淮阐,自緩存應(yīng)用程序會(huì)讓這種數(shù)據(jù)的邏輯緩存被換出,而并非是磁盤上實(shí)際的數(shù)據(jù)被換出刁品。自緩存應(yīng)用程序?qū)σ僮鞯臄?shù)據(jù)的語義了如指掌泣特,所以它可以采用更加高效的緩存替換算法。自緩存應(yīng)用程序有可能會(huì)在多臺(tái)主機(jī)之間共享一塊內(nèi)存挑随,那么自緩存應(yīng)用程序就需要提供一種能夠有效地將用戶地址空間的緩存數(shù)據(jù)置為無效的機(jī)制群扶,從而確保應(yīng)用程序地址空間緩存數(shù)據(jù)的一致性。
對(duì)于自緩存應(yīng)用程序來說,緩存 I/O 明顯不是一個(gè)好的選擇竞阐。Linux 中的直接 I/O 技術(shù)非常適用于自緩存這類應(yīng)用程序缴饭,該技術(shù)省略掉緩存 I/O 技術(shù)中操作系統(tǒng)內(nèi)核緩沖區(qū)的使用,數(shù)據(jù)直接在應(yīng)用程序地址空間和磁盤之間進(jìn)行傳輸骆莹,從而使得自緩存應(yīng)用程序可以省略掉復(fù)雜的系統(tǒng)級(jí)別的緩存結(jié)構(gòu)颗搂,而執(zhí)行程序自己定義的數(shù)據(jù)讀寫管理,從而降低系統(tǒng)級(jí)別的管理對(duì)應(yīng)用程序訪問數(shù)據(jù)的影響幕垦。在下面一節(jié)中丢氢,我們會(huì)著重介紹 Linux 中提供的直接 I/O 機(jī)制的設(shè)計(jì)與實(shí)現(xiàn),該機(jī)制為自緩存應(yīng)用程序提供了很好的支持先改。
Linux 2.6 中的直接 I/O 技術(shù)
Linux 2.6 中提供的幾種文件訪問方式
所有的 I/O 操作都是通過讀文件或者寫文件來完成的疚察。在這里,我們把所有的外圍設(shè)備仇奶,包括鍵盤和顯示器貌嫡,都看成是文件系統(tǒng)中的文件。訪問文件的方法多種多樣该溯,這里列出下邊這幾種 Linux 2.6 中支持的文件訪問方式岛抄。
標(biāo)準(zhǔn)訪問文件的方式
在 Linux 中,這種訪問文件的方式是通過兩個(gè)系統(tǒng)調(diào)用實(shí)現(xiàn)的:read() 和 write()狈茉。當(dāng)應(yīng)用程序調(diào)用 read() 系統(tǒng)調(diào)用讀取一塊數(shù)據(jù)的時(shí)候夫椭,如果該塊數(shù)據(jù)已經(jīng)在內(nèi)存中了,那么就直接從內(nèi)存中讀出該數(shù)據(jù)并返回給應(yīng)用程序氯庆;如果該塊數(shù)據(jù)不在內(nèi)存中蹭秋,那么數(shù)據(jù)會(huì)被從磁盤上讀到頁高緩存中去,然后再從頁緩存中拷貝到用戶地址空間中去堤撵。對(duì)于寫數(shù)據(jù)操作來說仁讨,當(dāng)一個(gè)進(jìn)程調(diào)用了 write() 系統(tǒng)調(diào)用往某個(gè)文件中寫數(shù)據(jù)的時(shí)候,數(shù)據(jù)會(huì)先從用戶地址空間拷貝到操作系統(tǒng)內(nèi)核地址空間的頁緩存中去粒督,然后才被寫到磁盤上陪竿。但是對(duì)于這種標(biāo)準(zhǔn)的訪問文件的方式來說禽翼,在數(shù)據(jù)被寫到頁緩存中的時(shí)候屠橄,write() 系統(tǒng)調(diào)用就算執(zhí)行完成,并不會(huì)等數(shù)據(jù)完全寫入到磁盤上闰挡。Linux 在這里采用的是我們前邊提到的延遲寫機(jī)制( deferred writes )。
圖 1. 以標(biāo)準(zhǔn)的方式對(duì)文件進(jìn)行讀寫
同步訪問文件的方式
同步訪問文件的方式與上邊這種標(biāo)準(zhǔn)的訪問文件的方式比較類似,這兩種方法一個(gè)很關(guān)鍵的區(qū)別就是:同步訪問文件的時(shí)候浅侨,寫數(shù)據(jù)的操作是在數(shù)據(jù)完全被寫回磁盤上才算完成的智玻;而標(biāo)準(zhǔn)訪問文件方式的寫數(shù)據(jù)操作是在數(shù)據(jù)被寫到頁高速緩沖存儲(chǔ)器中的時(shí)候就算執(zhí)行完成了。
內(nèi)存映射方式
在很多操作系統(tǒng)包括 Linux 中,內(nèi)存區(qū)域( memory region )是可以跟一個(gè)普通的文件或者塊設(shè)備文件的某一個(gè)部分關(guān)聯(lián)起來的之拨,若進(jìn)程要訪問內(nèi)存頁中某個(gè)字節(jié)的數(shù)據(jù)茉继,操作系統(tǒng)就會(huì)將訪問該內(nèi)存區(qū)域的操作轉(zhuǎn)換為相應(yīng)的訪問文件的某個(gè)字節(jié)的操作。Linux 中提供了系統(tǒng)調(diào)用 mmap() 來實(shí)現(xiàn)這種文件訪問方式蚀乔。與標(biāo)準(zhǔn)的訪問文件的方式相比烁竭,內(nèi)存映射方式可以減少標(biāo)準(zhǔn)訪問文件方式中 read() 系統(tǒng)調(diào)用所帶來的數(shù)據(jù)拷貝操作,即減少數(shù)據(jù)在用戶地址空間和操作系統(tǒng)內(nèi)核地址空間之間的拷貝操作吉挣。映射通常適用于較大范圍派撕,對(duì)于相同長(zhǎng)度的數(shù)據(jù)來講,映射所帶來的開銷遠(yuǎn)遠(yuǎn)低于 CPU 拷貝所帶來的開銷睬魂。當(dāng)大量數(shù)據(jù)需要傳輸?shù)臅r(shí)候终吼,采用內(nèi)存映射方式去訪問文件會(huì)獲得比較好的效率。
直接 I/O 方式
凡是通過直接 I/O 方式進(jìn)行數(shù)據(jù)傳輸氯哮,數(shù)據(jù)均直接在用戶地址空間的緩沖區(qū)和磁盤之間直接進(jìn)行傳輸际跪,完全不需要頁緩存的支持。操作系統(tǒng)層提供的緩存往往會(huì)使應(yīng)用程序在讀寫數(shù)據(jù)的時(shí)候獲得更好的性能蛙粘,但是對(duì)于某些特殊的應(yīng)用程序垫卤,比如說數(shù)據(jù)庫管理系統(tǒng)這類應(yīng)用,他們更傾向于選擇他們自己的緩存機(jī)制出牧,因?yàn)閿?shù)據(jù)庫管理系統(tǒng)往往比操作系統(tǒng)更了解數(shù)據(jù)庫中存放的數(shù)據(jù)穴肘,數(shù)據(jù)庫管理系統(tǒng)可以提供一種更加有效的緩存機(jī)制來提高數(shù)據(jù)庫中數(shù)據(jù)的存取性能。
異步訪問文件的方式
Linux 異步 I/O 是 Linux 2.6 中的一個(gè)標(biāo)準(zhǔn)特性舔痕,其本質(zhì)思想就是進(jìn)程發(fā)出數(shù)據(jù)傳輸請(qǐng)求之后评抚,進(jìn)程不會(huì)被阻塞,也不用等待任何操作完成伯复,進(jìn)程可以在數(shù)據(jù)傳輸?shù)臅r(shí)候繼續(xù)執(zhí)行其他的操作慨代。相對(duì)于同步訪問文件的方式來說,異步訪問文件的方式可以提高應(yīng)用程序的效率啸如,并且提高系統(tǒng)資源利用率侍匙。直接 I/O 經(jīng)常會(huì)和異步訪問文件的方式結(jié)合在一起使用。
直接 I/O 的優(yōu)點(diǎn)
直接 I/O 最主要的優(yōu)點(diǎn)就是通過減少操作系統(tǒng)內(nèi)核緩沖區(qū)和應(yīng)用程序地址空間的數(shù)據(jù)拷貝次數(shù)叮雳,降低了對(duì)文件讀取和寫入時(shí)所帶來的 CPU 的使用以及內(nèi)存帶寬的占用想暗。這對(duì)于某些特殊的應(yīng)用程序,比如自緩存應(yīng)用程序來說帘不,不失為一種好的選擇说莫。如果要傳輸?shù)臄?shù)據(jù)量很大,使用直接 I/O 的方式進(jìn)行數(shù)據(jù)傳輸寞焙,而不需要操作系統(tǒng)內(nèi)核地址空間拷貝數(shù)據(jù)操作的參與储狭,這將會(huì)大大提高性能互婿。
直接 I/O 潛在可能存在的問題
直接 I/O 并不一定總能提供令人滿意的性能上的飛躍。設(shè)置直接 I/O 的開銷非常大辽狈,而直接 I/O 又不能提供緩存 I/O 的優(yōu)勢(shì)慈参。緩存 I/O 的讀操作可以從高速緩沖存儲(chǔ)器中獲取數(shù)據(jù),而直接 I/O 的讀數(shù)據(jù)操作會(huì)造成磁盤的同步讀刮萌,這會(huì)帶來性能上的差異 , 并且導(dǎo)致進(jìn)程需要較長(zhǎng)的時(shí)間才能執(zhí)行完懂牧;對(duì)于寫數(shù)據(jù)操作來說,使用直接 I/O 需要 write() 系統(tǒng)調(diào)用同步執(zhí)行尊勿,否則應(yīng)用程序?qū)?huì)不知道什么時(shí)候才能夠再次使用它的 I/O 緩沖區(qū)僧凤。與直接 I/O 讀操作類似的是,直接 I/O 寫操作也會(huì)導(dǎo)致應(yīng)用程序關(guān)閉緩慢元扔。所以躯保,應(yīng)用程序使用直接 I/O 進(jìn)行數(shù)據(jù)傳輸?shù)臅r(shí)候通常會(huì)和使用異步 I/O 結(jié)合使用。