2011-09-06 75 views
2

我知道當您調用fwritefprintf或者其他任何寫入文件的函數時,內容不會立即刷新到磁盤,而是緩衝在內存中。操作系統如何爲文件執行緩衝

首先,OS在哪裏管理這些緩衝區以及如何管理這些緩衝區。其次,如果您寫入文件,然後讀入您編寫的內容,並假設操作系統在您寫入和讀取之間沒有刷新內容,如何知道它必須從緩衝區中返回讀取?它如何處理這種情況。

我想知道這一點的原因是我有興趣在用戶空間中實現自己的緩衝方案,而不是像OS那樣在內核空間中實現。也就是說,寫入文件將被緩存在用戶空間中,而實際寫入只會在某個點發生。通常,我還需要處理對仍在緩衝區中的內容調用read的情況。是否有可能在用戶空間中完成所有這些。

回答

4

首先,你在哪裏的OS管理這些緩衝器和

功能fwritefprintf這已經是完全在用戶空間使用標準輸入輸出緩衝區如何。緩衝區(可能)是靜態數組或可能是malloced內存。

它是如何知道它必須從它沒有,所以的更改不會看到緩衝

回讀。在調用基礎系統調用(write)之前(甚至在讀取之前)文件沒有真正發生。

是否有可能做這一切在用戶空間

不,這是不可能的。好消息是內核已經有了緩衝區所以你所做的每一個write都不是真的被翻譯成實際的文件寫入。它被推遲並在稍後執行。如果在此期間有人試圖從文件中讀取,那麼內核足夠聰明,可以從緩衝區中爲他提供服務。從TLPI

位:

當磁盤文件,讀取(工作)和write()系統調用 不直接ini- tiate磁盤訪問。相反,他們只是在用戶空間緩衝區和內核緩衝區緩存中的緩衝區之間複製數據 。

在磁盤文件上執行I/O時,從寫入() 的成功返回不能保證數據已傳輸到磁盤,因爲內核執行緩衝磁盤I/O以減少磁盤 活動和加速write()調用。 稍後,內核將其緩衝區寫入(刷新)到 磁盤。

如果在此期間,另一進程試圖讀取這些字節的 的文件,然後內核自動從 緩存提供數據,而不是從文件(過時的內容)。

因此,您可能想了解有關syncfsync

多級緩衝通常是不好的。 stdio緩衝區的原因很有用,它們可以最大限度地減少系統調用的執行次數。如果系統調用會更便宜,則無人再使用stdio緩衝區。

+0

cnicutar,thanx。但我認爲,出於我的目的,我可以使用stdio緩衝區概念,將寫入緩存在用戶空間中,然後再調用實際的寫入。因爲在我的情況下,寫操作不能立即執行。我每隔50毫秒左右檢查一次系統中的錯誤,只有在確定沒有錯誤時才寫入文件。請注意,我正在討論應用程序使用可靠性的庫,因此它應該適用於所有情況。也就是說,它不應該是特定於應用程序的。 – MetallicPriest

+0

@MetallicPriest從某種意義上講,它將重塑stdio。只要你不期望一致性(其他進程立即看到你的修改)應該沒問題。 – cnicutar

+0

因此,您的意思是,在用戶級別,當stdio尚未實際進行系統調用時,讀取仍保存在stdio寫入緩衝區中的內容將被返回以進行讀取? – MetallicPriest