對於linux中讀操做

關於文件的讀寫,實在是太過於複雜,細節太多,因此只能分析他的原理,細節牽涉太多。緩存

本文介紹文件的讀操做。spa

先說一下讀操做的輪廓。這個讀操做是從磁盤把數據讀入到內核緩衝區,數據在內核緩衝區被組織成radix_tree形式,而後在把這個緩衝區的內容拷貝到用戶緩衝區,用戶就能夠操做本身緩衝區內的數據了。對象

具體一點就是:索引

對於每一進程打開的文件,都擁有一個文件對象描述符,從文件對象描述符中能夠尋找到索引節點,從索引節點又能夠找到adress_space,這個對象就是文件在內存中的緩存。所以,每個打開此文件的進程都會這個adress_space 對象進行操做。進程

對於每一個給定的文件中的索引和要讀取的長度要檢查。內存

用戶會先從高速緩存中尋找它須要的頁,若是找到此頁,要檢查這個頁是否是最新的。所以要對此頁進行互斥訪問,但是在這以前有可能出現這種狀況:原理

這個頁也許是另外一個進程從文件中讀進來的頁,但並未第這個頁進行IO操做。所以他認爲頁中數據無效,須要從磁盤讀該頁,但是在進行讀以前,那個進程可能又要刪除此頁,因此此時須要進行檢查該頁還在不在內存中,若是不在,申請一物理頁框,並標記爲PG_locked ,表示鎖定,不能從內存中刪除此頁,由於要對此頁進行IO操做。如今能夠開始從磁盤讀內容填充此頁。數據

讀入此頁後並無萬事大吉,由於上文提到也許存在另外一個進程在操做此文件,並把它的修改內容寫回都了磁盤,所以就有可能出現刪減文件的機率,因此此時檢查若是發現   索引+長度,超出文件,那麼此頁是無效的,要釋放此頁。di

最後纔是將此頁拷貝到用戶態緩衝區。文件

相關文章
相關標籤/搜索