Linux 2 6 中的直接 I O 技術

2021-09-06 10:22:01 字數 2291 閱讀 7589

linux 2.6 中提供的幾種檔案訪問方式

所有的 i/o 操作都是通過讀檔案或者寫檔案來完成的。在這裡,我們把所有的外圍裝置,包括鍵盤和顯示器,都看成是檔案系統中的檔案。訪問檔案的方法多種多樣,這裡列出下邊這幾種 linux 2.6 中支援的檔案訪問方式。

標準訪問檔案的方式

在 linux 中,這種訪問檔案的方式是通過兩個系統呼叫實現的:read() 和 write()。當應用程式呼叫 read() 系統呼叫讀取一塊資料的時候,如果該塊資料已經在記憶體中了,那麼就直接從記憶體中讀出該資料並返回給應用程式;如果該塊資料不在記憶體中,那麼資料會被從磁碟上讀到頁高快取中去,然後再從頁快取中拷貝到使用者位址空間中去。如果乙個程序讀取某個檔案,那麼其他程序就都不可以讀取或者更改該檔案;對於寫資料操作來說,當乙個程序呼叫了 write() 系統呼叫往某個檔案中寫資料的時候,資料會先從使用者位址空間拷貝到作業系統核心位址空間的頁快取中去,然後才被寫到磁碟上。但是對於這種標準的訪問檔案的方式來說,在資料被寫到頁快取中的時候,write() 系統呼叫就算執行完成,並不會等資料完全寫入到磁碟上。linux 在這裡採用的是我們前邊提到的延遲寫機制( deferred writes )。

圖1.以標準方式對檔案進行讀寫

同步訪問檔案的方式

同步訪問檔案的方式與上邊這種標準的訪問檔案的方式比較類似,這兩種方法乙個很關鍵的區別就是:同步訪問檔案的時候,寫資料的操作是在資料完全被寫回磁碟上才算完成的;而標準訪問檔案方式的寫資料操作是在資料被寫到頁高速緩衝儲存器中的時候就算執行完成了。

圖2.資料同步寫回磁碟

記憶體對映方式

在很多作業系統包括 linux 中,記憶體區域( memory region )是可以跟乙個普通的檔案或者塊裝置檔案的某乙個部分關聯起來的,若程序要訪問記憶體頁中某個位元組的資料,作業系統就會將訪問該記憶體區域的操作轉換為相應的訪問檔案的某個位元組的操作。linux 中提供了系統呼叫 mmap() 來實現這種檔案訪問方式。與標準的訪問檔案的方式相比,記憶體對映方式可以減少標準訪問檔案方式中 read() 系統呼叫所帶來的資料拷貝操作,即減少資料在使用者位址空間和作業系統核心位址空間之間的拷貝操作。對映通常適用於較大範圍,對於相同長度的資料來講,對映所帶來的開銷遠遠低於 cpu 拷貝所帶來的開銷。當大量資料需要傳輸的時候,採用記憶體對映方式去訪問檔案會獲得比較好的效率。

圖3.利用mmap代替read

直接 i/o 方式

凡是通過直接 i/o 方式進行資料傳輸,資料均直接在使用者位址空間的緩衝區和磁碟之間直接進行傳輸,完全不需要頁快取的支援。作業系統層提供的快取往往會使應用程式在讀寫資料的時候獲得更好的效能,但是對於某些特殊的應用程式,比如說資料庫管理系統這類應用,他們更傾向於選擇他們自己的快取機制,因為資料庫管理系統往往比作業系統更了解資料庫中存放的資料,資料庫管理系統可以提供一種更加有效的快取機制來提高資料庫中資料的訪問效能。

圖四.資料傳輸不經過作業系統核心緩衝區

非同步訪問檔案的方式

linux 非同步 i/o 是 linux 2.6 中的乙個標準特性,其本質思想就是程序發出資料傳輸請求之後,程序不會被阻塞,也不用等待任何操作完成,程序可以在資料傳輸的時候繼續執行其他的操作。相對於同步訪問檔案的方式來說,非同步訪問檔案的方式可以提高應用程式的效率,並且提高系統資源利用率。直接 i/o 經常會和非同步訪問檔案的方式結合在一起使用。

圖5.cpu處理其他任務和i/o操作可以重疊進行

Linux2 6核心 對塊IO層操作的討論

當乙個塊被調入記憶體時 也就是說,在讀入後或等待寫出時 它要儲存在緩衝區中。每個緩衝區與乙個塊對應,它相當於是磁碟塊在記憶體中的表示。塊包含乙個或多個扇區,但大小不能超過一頁,所以一頁可以容納乙個或多個記憶體塊。由於核心在處理資料時需要一些相關的控制資訊 比如塊屬於哪個裝置,塊對應於哪個緩衝區 所以...

linux2 6核心模組的編譯

首先將下面的程式寫進乙個hello1.c的檔案裡 vim hello1.c include linux module.h include linux kernel.h include linux init.h static int init lkp init void static void exi...

Linux2 6核心實現的是NPTL

nptl是乙個1 1的執行緒模型,即乙個執行緒對於乙個作業系統的排程程序,優點是非常簡單。而其他一些作業系統比如solaris則是mxn的,m對應建立的執行緒數,n對應作業系統可以執行的實體。n轉 全選 937 struct task struct pid,從字面上是process id,但其實是t...