linux系統讀磁盤文件過程發生的事。

read過程 :磁盤數據——>內核態緩衝區(內核態數據可能寫回磁盤)——>用戶態緩衝區(用戶態數據可能被交換到交換區或寫回到內核態緩衝區)數組

個用戶態進程 會有一個文件描述符數組,進程每次open一個文件就會在數組中增長一個元素而且創建一個文件對象,其中文件對象中最重要的字段就是指向回調函數的指針,也就是對文件的操做方法。緩存

當發出open()調用時,經過文件名找到索引節點,而後open這個函數,創建了文件對象,其中文件對象中的操做文件的方法基本都基於文件系統定義的方法。然而一個文件能夠被多個進程open,所以會有多個文件對象,可是文件在內核態中的磁盤高速緩存區卻只有一個,所以就會出現多個進程操做同一個磁盤高速緩存,從而出現多個進程間緩存不一致的現象。函數

好比:spa

在從磁盤讀數據到緩存中時,因爲存在預讀的機制,進程1可能經過預讀把本身並不須要的頁讀到緩存中,而進程2剛好須要這個頁,所以進程2在磁盤高速緩存中找到了這個頁,但這個頁進程1卻並未對它進程IO,也就是說這個頁內沒有文件內容,當進程2檢測到此頁須要從新IO時,可因爲某種緣由,好比系統內存緊缺回收,進程1會將不髒的頁歸回內存,所以這個頁從高速緩存中刪除,因此進程2也就必須把這個頁框釋放掉,從新申請一個頁框,並鎖定該頁,開始IO。當IO結束後,就能夠把該頁內容拷貝到用戶緩衝區,但此時還存在問題,由於可能存在進程3以寫的方式打開該文件,並對該文件進行了刪減,致使該頁內容從磁盤中被刪掉,所以還須要進程2拷貝數據以前檢查該頁的索引在不在文件範圍內,若是不在就要釋放該頁。指針

相關文章
相關標籤/搜索