Linux下磁碟的IO的各種機制

2021-08-15 23:32:07 字數 1766 閱讀 1252

要說linux下的io過程,就要先說下linux的位址空間問題,首先,linux有一段虛擬記憶體,以32位x86系統為例,虛擬記憶體為2^32 即4g的記憶體空間,核心將這4g的空間分為兩個部分,

高位的1g位元組

(從虛位址0xc0000000到0xffffffff)

供核心使用,稱為

「核心空間」。而較低的3g位元組(從虛位址0x00000000到0xbfffffff),供各個程序使用,稱為「使用者空間」。因為每個程序可以通過系統呼叫進入核心,因此,linux核心空間由系統內的所有程序共享。於是,從具體程序的角度來看,每個程序可以擁有4g位元組的虛擬位址空間(也叫虛擬記憶體)。(這裡順便提一下程序的上下文切換,當核心

掛起乙個程序,並儲存該程序當時在記憶體中所反映出的狀態或

從記憶體中恢復下乙個要執行的程序,恢復該程序原來的狀態到暫存器,返回到其上次暫停的執行**然後繼續執行。這個過程就會引起程序的上下文切換,程序上下文切換智慧型發生在核心態)

在經典io過程中,會有一塊核心緩衝區和使用者緩衝區,核心緩衝區在核心空間,在記憶體中,用於核心程式,做為讀自或寫往硬體的資料緩衝區,

使用者緩衝區在使用者空間,在記憶體中,用於使用者程式,做為讀自或寫往硬體的資料緩衝區。

在linux下磁碟io過程不是簡單的乙個讀寫,傳統的io方式,以read(),write()為例,其實linux內部完成了很多次資料拷貝,當我們要read(),write()乙個fd的時候,首先要將資料從磁碟中拷貝到核心空間的頁快取中,然後再將頁快取的資料拷貝到使用者空間來,同理,write()乙個fd的時候,也會將資料先寫入核心空間的頁快取,然後再寫入磁碟,如下圖。

還有一種是同步io方式,本質上與傳統io方式沒有什麼不同,只是同步io保證資料寫入磁碟後才算io過程完成,而傳統io將資料寫入核心的高速緩衝區就算io完成了

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

mmap()的作用是對映檔案描述符和指定檔案的(off_t off)區域至呼叫程序的(addr,addr *len)的記憶體區域,如下圖所示:

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

linux下測試磁碟的讀寫IO速度

有時候我們在做維護的時候,總會遇到類似於io特別高,但不能判定是io瓶頸還是軟體引數設定不當導致熱盤的問題.這時候通常希望能知道磁碟的讀寫速度,來進行下一步的決策.下面是兩種測試方法 1 使用hdparm命令 這是乙個是用來獲取ata ide硬碟的引數的命令,是由早期linux ide驅動的開發和維...

Linux下io磁碟排程策略

i o 排程演算法再各個程序競爭磁碟i o的時候擔當了裁判的角色。他要求請求的次序和時機做最優化的處理,以求得盡可能最好的整體i o效能。在linux下面列出4種排程演算法 cfq completely fair queuing 完全公平的排隊 elevator cfq 這是預設演算法,對於通用伺服...

LINUX下磁碟IO效能監測分析

linux下磁碟io效能監測分析 2011 08 16 18 10 23 標籤 效能監測分析 linux 磁碟io 休閒suse linux 這兩天發現一台測試用的伺服器經常負載很高,但cpu和記憶體消耗卻很少,很是奇怪,經過診斷發現是由於大容量的測試資料導致高併發下的磁碟io消耗比較大,由於快取是...