2016-08-15 148 views
1

如果我的代碼執行類似fd = open("/dev/sdXY", ...)pwrite(fd, ...)/pread(fd, ...),那麼I/O操作是否會跳過緩衝區或磁盤緩存?假設/dev/sdXY是未掛載的格式化磁盤分區(ext4,ufs等)。pread/pwrite,緩衝區和磁盤緩存

我問,因爲需要在我正在處理的應用程序中授予連續的文件存儲空間,並且我讀到實現它的唯一方法就是執行類似於我所描述的操作。但是,如果這會導致丟失緩衝區,磁盤緩存或其他有用的功能,我可能會刪除對連續存儲的需求。

我也很困惑,如果我需要重新實現低級別的東西,因爲分區已經被格式化爲文件系統。我讀到這是RAW磁盤/分區的情況。我已經知道需要處理哪些塊是免費或正在使用的,文件和文件夾結構等,我已經在研究這個問題。

另一個問題:當我讀到fopen()/fread()/fwrite()和C++的文件流時,我只看到了有關緩衝區的信息。是不是隻有這些流和f*函數家族有某種緩衝區,不像open/write/read/pwrite/pread/etc?這個緩衝區是否與磁盤緩存相同或不同?

最後一個:HDD緩存是由自己的驅動器還是由文件系統(ext4,ufs等)處理?

回答

2

簡單的答案是'它取決於'。什麼是困難的特點是什麼依賴。

只需使用open()不會避免內核磁盤緩衝池。要做到這一點,你需要Linux上的特殊選項(O_DIRECT)。但是,使用open()確實避免使用隱藏的應用程序緩衝區;您可以選擇數據讀取或寫入的位置,而不需要任何中間副本。相比之下,f*函數家族確實有一個'隱藏'的應用程序緩衝區;數據經常被讀入與FILE *文件流關聯的I/O緩衝區,然後複製到您的應用程序緩衝區中。

如果您/dev/sdXY設備已格式化的文件系統,但要確保文件連續文件的存儲,你將不得不復制文件系統驅動的顯著部分,以確保您正確地分配空間。這不太可能是你的時間或精力的合理使用。是的,你需要重新實現各種低級別的磁盤空間管理 - 這將是完全不重要的。此外,ext4的實現將與ufs等的實現完全不同 - 因此,您真的可以爲自己裁減工作。

+0

謝謝。我認爲只需要處理哪些塊是壞的,自由的或正在使用的以及文件和文件夾結構。我還需要重新執行什麼? –

+0

這足以讓你忙一陣子,我想 - 這肯定會讓我忙一陣子。我不得不研究ext4文件系統以瞭解還有什麼需要擔心的。 _ [... 30秒的思考時間...]但是,我認爲這是一個日記文件系統,因此您需要知道日誌記錄的工作方式,以及如何更改手動分配的文件,而不會擾亂文件的連續性分配空間。我懷疑,現在我想,甚至有可能。 –

+0

硬盤本身可以存儲緩存 - 這是一個可以忽略的其他類型的袋子。硬盤應該讓它看起來沒有這樣的緩存 - 除了它可能比沒有這樣的緩存更好的性能。一旦寫入完成,寫入HDD的任何內容都應該是安全的,即使數據位於HDD緩存中,但實際上還不在磁盤上。 –