文件讀寫底層原理

系統(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)行適配例隆。如圖所示:


image.png
虛擬文件系統(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è)文件附较,都是從根目錄開始,按層次解析路徑中的所有目錄潦俺,直到定位到文件拒课。

  1. inode模塊,管理一個(gè)具體的文件事示,是文件的唯一標(biāo)識(shí)早像,一個(gè)文件對(duì)應(yīng)一個(gè)inode。通過inode可以方便的找到文件在磁盤扇區(qū)的位置肖爵。同時(shí)inode模塊可鏈接到address_space模塊扎酷,方便查找自身文件數(shù)據(jù)是否已經(jīng)緩存。
  2. 打開文件列表模塊遏匆,包含所有內(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)奔浅。

image.png

由圖可以看出:

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è)已打開的文件纽匙。


image.png

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)行讀寫


image.png
同步訪問文件的方式

同步訪問文件的方式與上邊這種標(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é)合使用。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末澎语,一起剝皮案震驚了整個(gè)濱河市途事,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌擅羞,老刑警劉巖尸变,帶你破解...
    沈念sama閱讀 217,907評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異减俏,居然都是意外死亡召烂,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門娃承,熙熙樓的掌柜王于貴愁眉苦臉地迎上來奏夫,“玉大人,你說我怎么就攤上這事历筝⌒镏纾” “怎么了?”我有些...
    開封第一講書人閱讀 164,298評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵梳猪,是天一觀的道長(zhǎng)麻削。 經(jīng)常有香客問我,道長(zhǎng)春弥,這世上最難降的妖魔是什么呛哟? 我笑而不...
    開封第一講書人閱讀 58,586評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮惕稻,結(jié)果婚禮上竖共,老公的妹妹穿的比我還像新娘蝙叛。我一直安慰自己俺祠,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,633評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著蜘渣,像睡著了一般淌铐。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上蔫缸,一...
    開封第一講書人閱讀 51,488評(píng)論 1 302
  • 那天腿准,我揣著相機(jī)與錄音,去河邊找鬼拾碌。 笑死吐葱,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的校翔。 我是一名探鬼主播弟跑,決...
    沈念sama閱讀 40,275評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼防症!你這毒婦竟也來了孟辑?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,176評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤蔫敲,失蹤者是張志新(化名)和其女友劉穎饲嗽,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體奈嘿,經(jīng)...
    沈念sama閱讀 45,619評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡貌虾,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,819評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了裙犹。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片酝惧。...
    茶點(diǎn)故事閱讀 39,932評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖伯诬,靈堂內(nèi)的尸體忽然破棺而出晚唇,到底是詐尸還是另有隱情,我是刑警寧澤盗似,帶...
    沈念sama閱讀 35,655評(píng)論 5 346
  • 正文 年R本政府宣布哩陕,位于F島的核電站,受9級(jí)特大地震影響赫舒,放射性物質(zhì)發(fā)生泄漏悍及。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,265評(píng)論 3 329
  • 文/蒙蒙 一接癌、第九天 我趴在偏房一處隱蔽的房頂上張望心赶。 院中可真熱鬧,春花似錦缺猛、人聲如沸缨叫。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,871評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽耻姥。三九已至销钝,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間琐簇,已是汗流浹背蒸健。 一陣腳步聲響...
    開封第一講書人閱讀 32,994評(píng)論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留婉商,地道東北人似忧。 一個(gè)月前我還...
    沈念sama閱讀 48,095評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像丈秩,于是被迫代替她去往敵國和親橡娄。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,884評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • feisky云計(jì)算癣籽、虛擬化與Linux技術(shù)筆記posts - 1014, comments - 298, trac...
    不排版閱讀 3,849評(píng)論 0 5
  • 計(jì)算機(jī)系統(tǒng)漫游 代碼從文本到可執(zhí)行文件的過程(c語言示例):預(yù)處理階段挽唉,處理 #inlcude , #defin...
    willdimagine閱讀 3,584評(píng)論 0 5
  • 直接 I/O 的動(dòng)機(jī) 在介紹直接 I/O 之前筷狼,這一小節(jié)先介紹一下為什么會(huì)出現(xiàn)直接 I/O 這種機(jī)制瓶籽,即傳統(tǒng)的 I...
    taj3991閱讀 295評(píng)論 0 0
  • 一、I/O與CPU時(shí)間的比較 I/O 操作比在內(nèi)存中進(jìn)行數(shù)據(jù)處理任務(wù)所需時(shí)間更長(zhǎng)埂材,差別要以數(shù)量級(jí)計(jì)塑顺。許多程序員一門...
    YongSiv閱讀 765評(píng)論 0 1
  • 前言:在之前的面試中竖独,每每問到關(guān)于Java I/O 方面的東西都感覺自己吃了大虧..所以這里搶救一下..來深入的了...
    我沒有三顆心臟閱讀 2,495評(píng)論 0 21