讀文件流程
- 進程調用庫函數向內核發起讀文件請求;
- 內核經過檢查進程的文件描述符定位到虛擬文件系統的已打開文件列表表項;
- 調用該文件可用的系統調用函數read();
- read()函數經過文件表項連接到目錄項模塊,根據傳入的文件路徑,在目錄項模塊中檢索,找到該文件的inode;
- 在inode中,經過文件內容偏移量計算出要讀取的頁;
- 經過inode找到文件對應的address_space;
- 在address_space中訪問該文件的頁緩存樹,查找對應的頁緩存結點:
(1)若是頁緩存命中,那麼直接返回文件內容;
(2)若是頁緩存缺失,那麼產生一個頁缺失異常,建立一個頁緩存頁,同時經過inode找到文件該頁的磁盤地址,讀取相應的頁填充該緩存頁;從新進行第6步查找頁緩存;
寫文件流程
前5步和讀文件一致,在address_space中查詢對應頁的頁緩存是否存在:node
- 若是頁緩存命中,直接把文件內容修改更新在頁緩存的頁中。寫文件就結束了。這時候文件修改位於頁緩存,並無寫回到磁盤文件中去;
- 若是頁緩存缺失,那麼產生一個頁缺失異常,建立一個頁緩存頁,同時經過inode找到文件該頁的磁盤地址,讀取相應的頁填充該緩存頁。此時緩存頁命中,進行第6步。
- 一個頁緩存中的頁若是被修改,那麼會被標記成髒頁。髒頁須要寫回到磁盤中的文件塊。有兩種方式能夠把髒頁寫回磁盤:
(1)手動調用sync()或者fsync()系統調用把髒頁寫回
(2)pdflush進程會定時把髒頁寫回到磁盤
- 同時注意,髒頁不能被置換出內存,若是髒頁正在被寫回,那麼會被設置寫回標記,這時候該頁就被上鎖,其餘寫請求被阻塞直到鎖釋放。