檔案緩衝

本主題涵蓋檔緩衝應用程式控制的各種考慮,也稱為未緩衝的檔案輸入/輸出 (I/O) 。 檔案緩衝通常是由系統在幕後處理,除非另有指定,否則會被視為 Windows 作業系統內 檔案快取 的一部分。 雖然有時會交換使用取和緩衝詞彙,但本主題在說明如何與系統緩衝處理 (緩衝處理) 的資料互動的內容中特別使用,在此主題中,其主要不在使用者模式應用程式的直接控制之外。

使用 CreateFile 函式開啟或建立檔案時,可以指定 FILE_FLAG_NO_BUFFERING 旗標,以停用讀取或寫入檔案之資料的系統快取。 雖然這可完整且直接控制資料 I/O 緩衝,但在檔案和類似裝置的情況下,必須考慮資料對齊需求。

注意

這項對齊資訊適用于裝置上的 I/O,例如支援搜尋的檔案,以及檔案位置指標的概念 (或 位移) 。 對於未搜尋的裝置,例如具名管道或通訊裝置,關閉緩衝可能不需要任何特定的對齊方式。 在該情況下,可能會因對齊而獲得的任何限制或效率都取決於基礎技術。

 

在簡單的範例中,應用程式會使用 FILE_FLAG_NO_BUFFERING 旗標開啟檔案以供寫入存取,然後使用應用程式內定義的資料緩衝區執行 WriteFile 函式的呼叫。 在此本機緩衝區中,在這些情況下,實際上是唯一存在此作業的檔案緩衝區。 由於實體磁片配置、檔案系統儲存體配置和系統層級檔案指標位置追蹤,除非本機定義的資料緩衝區符合下一節所討論的特定對齊準則,否則此寫入作業將會失敗。

注意

快取的討論不會考慮實體磁片本身上的任何硬體快取,這不保證在任何情況下都位於系統的直接控制範圍內。 這不會影響本主題中指定的需求。

 

如需 如何與其他 快取相關旗標互動FILE_FLAG_NO_BUFFERING的詳細資訊,請參閱 CreateFile

對齊和檔案存取需求

如先前所述,使用 以 FILE_FLAG_NO_BUFFERING開啟的檔案時,應用程式必須符合特定需求。 適用下列特定專案:

  • 檔案存取大小,包括 重迭 結構中的選擇性檔案位移,如果指定的話,必須為磁片區磁區大小的整數倍數位節。 例如,如果磁區大小是 512 個位元組,應用程式可以要求讀取和寫入 512、1、024、1、536 或 2,048 個位元組,但不能是 335、981 或 7,171 個位元組。
  • 讀取和寫入作業的檔案存取緩衝區位址應該與實體磁區對齊,這表示在磁片區實體磁區大小的整數倍數的記憶體中對齊位址。 視磁片而定,可能不會強制執行此需求。

應用程式開發人員應該記下將新類型的存放裝置引進市場,且實體媒體磁區大小為 4,096 個位元組。 這些裝置的產業名稱為「進階格式」。 由於直接引進 4,096 個位元組作為媒體定址單位的相容性問題,暫時的相容性解決方案是引進模擬一般 512 位元組磁區儲存裝置的裝置,但透過標準 ATA 和 SCSI 命令提供真實磁區大小的相關資訊。

由於此模擬,開發人員基本上需要瞭解兩個磁區大小:

  • 邏輯磁區:用於媒體之邏輯區塊定址的單位。 我們也可以將其視為儲存體可接受的最小寫入單位。 這是「模擬」。
  • 實體磁區:單一作業中完成裝置讀取和寫入作業的單位。 這是不可部分完成寫入的單位,而且必須對齊哪些未緩衝的 I/O,才能達到最佳效能和可靠性特性。

大部分最新的 Windows API,例如IOCTL_DISK_GET_DRIVE_GEOMETRYGetDiskFreeSpace,都會傳回邏輯磁區大小,但實體磁區大小可以透過IOCTL_STORAGE_QUERY_PROPERTY控制程式代碼來擷取,其中包含于STORAGE_ACCESS_ALIGNMENT_DESCRIPTOR結構的BytesPerPhysicalSector成員中的相關資訊。 如需範例,請參閱 STORAGE_ACCESS_ALIGNMENT_DESCRIPTOR的範例程式碼。 Microsoft 強烈建議開發人員依照 IOCTL_STORAGE_QUERY_PROPERTY 控制程式代碼所報告,將未緩衝的 I/O 與實體磁區大小對齊,以協助確保其應用程式已準備好進行此磁區大小轉換。

Windows Server 2003 和 Windows XP:STORAGE_ACCESS_ALIGNMENT_DESCRIPTOR 結構無法使用。 它是由 Windows Vista 和 Windows Server 2008 所引進。

由於讀取和寫入作業的緩衝區位址必須對齊磁區對齊,因此應用程式必須直接控制這些緩衝區的配置方式。 磁區對齊緩衝區的其中一種方式是使用 VirtualAlloc 函式來配置緩衝區。 請考慮下列事項:

  • VirtualAlloc 會配置在系統頁面大小的整數倍數的位址上對齊的記憶體。 以 Itanium 為基礎的系統,頁面大小為 x64 和 x86 或 8,192 個位元組的 4,096 個位元組。 如需詳細資訊,請參閱 GetSystemInfo 函式。
  • 直接存取存放裝置的磁區大小通常是 512 到 4,096 個位元組, (硬碟) ,CD-ROM 則為 2,048 個位元組。
  • 頁面和磁區大小都是 2 的威力。

因此,在大部分情況下,頁面對齊記憶體也會與磁區對齊,因為磁區大小大於頁面大小很少的情況。

取得手動對齊記憶體緩衝區的另一種方式是使用 C Run-Time 程式庫中 的 _aligned_malloc 函式。 如需如何手動控制緩衝區對齊的範例,請參閱 WriteFile的 一節中的 C++ 語言程式碼範例。