檔案讀寫基本流程
阿新 • • 發佈:2019-01-26
讀檔案
1、程序呼叫庫函式向核心發起讀檔案請求;
2、核心通過檢查程序的檔案描述符定位到虛擬檔案系統的已開啟檔案列表表項;
3、呼叫該檔案可用的系統呼叫函式read()
3、read()函式通過檔案表項鍊接到目錄項模組,根據傳入的檔案路徑,在目錄項模組中檢索,找到該檔案的inode;
4、在inode中,通過檔案內容偏移量計算出要讀取的頁;
5、通過inode找到檔案對應的address_space;
6、在address_space中訪問該檔案的頁快取樹,查詢對應的頁快取結點:
(1)如果頁快取命中,那麼直接返回檔案內容;
(2)如果頁快取缺失,那麼產生一個頁缺失異常,建立一個頁快取頁,同時通過inode找到檔案該頁的磁碟地址,讀取相應的頁填充該快取頁;重新進行第6步查詢頁快取;
7、檔案內容讀取成功。
寫檔案
前5步和讀檔案一致,在address_space中查詢對應頁的頁快取是否存在:
6、如果頁快取命中,直接把檔案內容修改更新在頁快取的頁中。寫檔案就結束了。這時候檔案修改位於頁快取,並沒有寫回到磁碟檔案中去。
7、如果頁快取缺失,那麼產生一個頁缺失異常,建立一個頁快取頁,同時通過inode找到檔案該頁的磁碟地址,讀取相應的頁填充該快取頁。此時快取頁命中,進行第6步。
8、一個頁快取中的頁如果被修改,那麼會被標記成髒頁。髒頁需要寫回到磁碟中的檔案塊。有兩種方式可以把髒頁寫回磁碟:
(1)手動呼叫sync()或者fsync()系統呼叫把髒頁寫回
(2)pdflush程序會定時把髒頁寫回到磁碟
同時注意,髒頁不能被置換出記憶體,如果髒頁正在被寫回,那麼會被設定寫回標記,這時候該頁就被上鎖,其他寫請求被阻塞直到鎖釋放。