2012-02-03 27 views
1

寫作時,我們使用C(Ubuntu的平臺和gcc編譯器)fopen()函數打開一個文件,並寫入它,並在內容直接寫入到文件所在或者是第一硬盤地址帶入主內存? 通過Linux中的C程序,文件可以從硬盤中的位置寫入或讀取的實際過程是什麼?文件到C程序

回答

1

在類似UNIX的系統中,通常在向磁盤上的文件寫入信息時有兩級緩存。

首先是在C運行時庫,它很可能是緩衝(除非您關閉緩存以某種方式)。您可以使用C調用如fflush來刷新這些緩衝區。

第二個是在操作系統級別,其中緩衝器被寫入到物理磁盤之前舉行。對fsync的調用可以強制將這些緩衝區刷新到磁盤。

2

C庫不會真正寫入磁盤。這是操作系統的工作。 C庫會對內核進行系統調用,將其寫入磁盤。它甚至可以實現一個緩衝區來減少系統調用的次數。並且內核還實施緩衝區來優化對磁盤的實際寫入。一般情況下,當你使用C時,你不會認爲這個級別太低。但是,您需要確保您已正確關閉文件。實際的磁盤管理是OS的工作。

The Design of the UNIX Operating System莫里斯J.巴赫包含Unix內核的很好的解釋。你可能會看起來像一個開始。

+0

那麼系統調用write()函數是如何執行寫入操作的,它是直接寫入硬盤還是實際進程?我懷疑內核系統調用代碼是否可以寫入直接到硬盤地址或不? – 2012-02-03 08:47:18

+0

恐怕答案會因內核不同而不同,從磁盤到磁盤也不同,我在這個領域的專家也不多。基本思想是內核將使用內存緩衝區,即write()不會立即寫入磁盤。當內核決定寫入最佳時,該緩衝區將被刷新到磁盤。每個磁盤都與一個磁盤控制器相關聯,這個磁盤控制器甚至可以有自己的緩衝區內核,磁盤控制器嘗試優化一些東西,如減少實際寫入次數,最大限度地減少磁頭的移動等。 – taskinoor 2012-02-03 09:26:38

+0

幾個谷歌搜索後,我發現這個:http://www.ibm.com/developerworks/linux/library/l -linux文件系統/。請仔細檢查高級體系結構部分。這可能會澄清你正在搜索的一些東西。 – taskinoor 2012-02-03 09:39:52