Linux 核心快取區和write行為

2021-09-08 01:28:22 字數 1946 閱讀 1313

《unix環境高階程式設計》

應用緩衝技術能很明顯的提高系統效率。核心與外圍裝置的資料交換,核心與使用者空間的資料交換都是比較費時的,使用緩衝區就是為了優化這些費時的操作。其實核心到使用者空間的操作本身是不buffer的,是由i/o庫用buffer來優化了這個操作。比如read本來從核心讀取資料時是比較費時的,所以一次取出一塊,以避免多次陷入核心。

核心緩衝區的主要思想就是一次讀入大量的資料放在緩衝區,需要的時候從緩衝區取得資料。

管理員模式和使用者模式之間的切換需要消耗時間,但相比之下,磁碟的i/o操作消耗的時間更多,為了提高效率,核心也使用緩衝區技術來提高對磁碟的訪問速度。磁 盤是資料塊的集合,核心會對磁碟上的資料塊做緩衝。核心將磁碟上的資料塊複製到核心緩衝區中,當乙個使用者空間中的程序要從磁碟上讀資料時,核心一般不直接 讀磁碟,而是將核心緩衝區中的資料複製到程序的緩衝區中。當程序所要求的資料塊不在核心緩衝區時,核心會把相應的資料塊加入到請求佇列,然後把該程序掛 起,接著為其他程序服務。一段時間之後(其實很短的時間),核心把相應的資料塊從磁碟讀到核心緩衝區,然後再把資料複製到程序的緩衝區中,最後喚醒被掛起的程序。

注:理解核心緩衝區技術的原理有助於更好的掌握系統呼叫read&write,read把資料從核心緩衝區複製到程序緩衝區,write把資料從程序緩衝區複製到核心緩衝區,它們不等價於資料在核心緩衝區和磁碟之間的交換

從理論上講,核心可以在任何時候寫磁碟,但並不是所有的write操作都會導致核心的寫動作。核心會把要寫的資料暫時存在緩衝區中,積累到一定數量後再一 次寫入。有時會導致意外情況,比如斷電,核心還來不及把核心緩衝區中的資料寫道磁碟上,這些更新的資料就會丟失。

應用核心緩衝技術導致的結果是:提高了磁碟的i/o效率;優化了磁碟的寫操作;需要及時的將緩衝資料寫到磁碟

write行為

從write()呼叫返回時,核心已經將緩衝區所提供的資料到核心的緩衝區,但是無法保證資料已經寫出到其預定的目的地。的確,寫入呼叫返回的速度實在太快了,可能沒有時間完成該項目的工作。處理器和硬碟之間的效能差異使得此類令人頭痛的行為顯而易見。

事實上,如果使用者空間應用程式發出write()系統呼叫,linux核心會先進行若干檢查,接著將資料複製進緩衝區。稍後,核心會在後台收集所有 「髒」(有資料寫入)緩衝區(內容跟相應磁碟塊不同的所有緩衝區),將它們安排成最佳順序,接著寫進磁碟。這讓寫入呼叫的執行快如閃電,幾乎立即返回,這 也讓核心可以將寫入操作延後到較空閒的時段再進行,並且是多筆寫入操作會整批一起進行。

延後進行的寫入操作並不會改變posix的語義。舉例來說,資料剛寫入緩衝區而尚未寫回磁碟,此時如果發出讀取請求,此請求可從緩衝區得到滿足,而 且不會因此而讀取到地盤上的舊資料。此行為會實際提高效能,因為讀取請求可從記憶體中的緩衝區得到滿足,而不必從磁碟。當讀取和寫入請求如預期般交替出現 時,結果也和預期一樣,也就是說,資料被寫回磁碟之前系統不會崩潰!即使應用程式相信寫入請求已經成功完成了,但事實上資料尚未寫回磁碟。

延後寫入的另乙個問題是無法安排寫入順序,儘管應用程式可能會安排寫入請求的順序,好讓他們能夠按照特定的順序寫回磁碟,核心會以它認為合適的方式 重新安排寫入請求的順序,主要是基於新能的考慮。除非系統崩潰,否則這通常不是乙個問題,因為所有緩衝區最後都會寫回磁碟,所以一切都很好。即使如此,絕 大多數的應用程式實際上並不關心寫入請求的順序。

延遲寫入必須**的最後乙個問題是匯報i/o錯誤。寫回磁碟期間可能會發生任何無法向發出寫入請求的程序匯報的i/o錯誤,例如磁碟驅動器故障。的 確,緩衝區與這些程序毫無關係。假如有多個程序「弄髒」(將資料寫入)單一緩衝區,而這些程序可能在資料寫入緩衝區之後並且在資料寫回磁碟之前先借宿了。

核心會試圖盡量降低延後寫入的風險,為了確保資料可以被及時寫出,核心未緩衝區設立了乙個時間上限,而且會在時間超過上限之前寫出所有「髒」緩衝 區。使用者可通過/proc/sys/vm/dirty_expire_centiseconds來設定此值,此值以釐秒(百分之一秒)為單位。

linux核心之遍歷線性區

寫本篇部落格的意思仍然是想要獲得指定程序的所有開啟檔案路徑,但是與之前的方式並不相同,1 獲得指定程序的task struct 2.獲得記憶體描述符mm struct獲得線性區,根據線性區的vm file確定該線性區指向的是檔案記憶體 include include include include ...

使用者程序緩衝區和核心緩衝區

常常聽到有程式設計師會跟你討論 我們在讀寫檔案的時候,系統是有快取的 但實際上有一部分人把使用者程序緩衝區和系統空間的緩衝區的概念混淆了,包括這兩種緩衝區的用法和所要解決的問題,還有其它類似的概念。本文就來區分一下不同的緩衝區概念 主要針對類unix平台 使用者程序和作業系統的關係 首先我用一張圖來...

Linux核心編譯和替換核心

linux核心支援多種架構。該篇小記是筆者第一次針對已有的核心配置檔案來編譯核心的,比如arm系列的博通bcm,海思hisi,恩智浦i.mx6ull 本次是針對博通bcm2709 defconfig來編譯核心的。本次是針對博通bcm2709 defconfig來編譯核心 安裝交叉編譯工具鏈 安裝nc...