2016-08-24 22 views
-1

我正在閱讀Mark Burgess的「The GNU C Programming Tutorial」。我所遇到的以下信息:瞭解低級文件例程

即使低水平FLE程序不使用BU FF e圈,一旦你調用write,您的數據可以立即從文件中讀取,它可能需要長達一分鐘之前您的數據被物理寫入磁盤。 (頁數:142)

首先,「在您的數據寫入磁盤之前可能需要一分鐘(一段時間)」true?

其次,當低級文件程序不使用緩衝爲什麼會延遲發生的呢?

+0

這本書是錯誤的。數據實際上在光盤上沒有特定的時間。但是,對於所有正常的文件IO來說都是如此。你可能想要了解操作系統。這本書是否說沒有任何緩衝**或僅僅是文件功能? – Olaf

+0

@Olaf:是的,這本書說低級文件例程中沒有緩衝的概念。 – NareshR

+0

_Sigh_再次仔細閱讀我的評論**!然後想想吧!然後谷歌(或任何你用來查找「Linux文件緩衝」)! – Olaf

回答

0

一個文件被稱爲緩衝,當其內容不輸出或直接輸入。而是將文件的字節寫入內存中的臨時緩衝區。

例如,如果你是從文件中讀取,你是從緩衝區中讀取。一旦讀取了緩衝區中的所有字符,就會從文件中補充新的字節。這種間接性的原因是,內存讀取比讀取硬盤快得多。

的通話readwrite是低層次的,並且不進行緩衝。 stdio.h調用如getcputc,請使用緩衝。這些更高級別的API只能調用低級別的API,因此必須補充緩衝區。

+0

我明白你說了什麼,但我的問題是爲什麼延遲發生? – NareshR

0

寫入硬盤比寫入RAM慢得多。當您寫入驅動器時,它將寫入內存,但不會立即寫入磁盤。直到部分內存需要被覆蓋以爲其他東西騰出空間之前,數據可能不會寫入磁盤。這被稱爲寫回緩存。

1

有,我可以發生/ O緩衝的兩個地方(至少 - 它不應該僅僅是兩個)。

一個在應用程序;使用FILE *的標準I/O功能使用緩衝I/O,除非使用setvbuf()來防止它。

另一個是在內核中。磁盤I/O通常進入內核緩衝池,並最終被內核寫入磁盤。有一些方法(Linux上的O_DIRECT;傳統Unix上的裸設備等)。關鍵是系統調用通常會寫入內核緩衝池。內核負責確保將數據安全正確地寫入磁盤(日記,..​​.)。 (a)您可能會向數據添加更多更改,(b)其他人可能需要讀取或寫入數據,(c)磁盤驅動器可能正忙碌在其1 TB存儲的另一端寫入其他內容,並且需要一段時間才能使寫入頭準備好接收數據,如果在編寫其他工作之前安排其他工作,系統的整體性能會更好將緩衝區更改爲磁盤。它將被寫入磁盤。它只是在沒有定義的時候,它可能是幾分之一秒或幾秒或更長時間,儘管大多數情況下不需要花費數分鐘時間將數據寫入磁盤。

這些天來,有可能也可以在RAID控制器緩存,也許在RAID設置裏面的單個磁盤,而且可能會有網絡緩衝太多,如果它是一個遠程安裝的文件系統。這些增加了額外的緩衝水平。

read()write()和相關的低級別I/O函數沒有任何客戶端(應用程序)緩衝 - 與標準C I/O函數不同。