非同步的磁碟 I/O 會出現在 Windows NT、 Windows 2000 和 Windows XP 上同步

文章翻譯 文章翻譯
文章編號: 156932 - 檢視此文章適用的產品。
全部展開 | 全部摺疊

在此頁中

結論

在 Microsoft Windows NT、 Windows 2000 及 Windows XP 上的檔案 I/O 可以是同步或非同步。I/O 的預設行為是同步: I/O 函式呼叫,並傳回 I/O 完成時。非同步 I/O,相反地,允許的 I/O 函式,以執行傳回給呼叫端立即傳回,但 I/O 不會被視為一些時間才完成。作業系統會在 I/O 完成時告知呼叫端。或者,呼叫端可以判斷使用的作業系統服務的未完成 I/O 作業的狀態。

非同步 I/O 的優點就是呼叫者必須要執行另一項操作的時間運作,或者在 I/O 作業完成後發出更多的要求。[詞彙 Overlapped I/O 經常用於非同步 I/O 以及非重疊同步 I/O 的 I/O。本文使用非同步的條款及在 [Windows NT 的 I/O 作業同步。本文假設讀取器具有特定的熟悉 createfile 而,例如檔案 I/O 函式WriteFile ReadFile

正如同步 I/O。 特定的非同步 I/O 作業行為頻繁,本文將告訴您在稍後的章節中的條件進行 I/O同步完成的作業。呼叫者必須馬上為背景作用,因為 I/O 函式不會傳回 I/O 完成之前。

同步和非同步 I/O 與有幾個函式。本文使用 ReadFile 和 WriteFile 做為範例。ReadFileEx 和 WriteFileEx,就是很好的替代方案。本文將告訴您特別磁碟 I/O,雖然有許多之法律及原則可以套用至其他類型的 I/O,序列 I/O 或網路 I/O 等。

附註: 因為 Windows 95 不支援非同步 I/O 磁碟裝置上 (雖然它不會在其他類型的 I/O 裝置上),這份文件不討論它的行為。

其他相關資訊

設定非同步 I/O

在開啟檔案時,必須在 createfile 而指定 FILE_FLAG_OVERLAPPED 旗標。這個旗標可讓您在要以非同步方式執行檔案 I/O 作業。以下是範例:
   HANDLE hFile;

   hFile = CreateFile(szFileName,
                      GENERIC_READ,
                      0,
                      NULL,
                      OPEN_EXISTING,
                      FILE_FLAG_NORMAL | FILE_FLAG_OVERLAPPED,
                      NULL);

   if (hFile == INVALID_HANDLE_VALUE)
      ErrorOpeningFile();
				
編碼的非同步 I/O,因為系統會保留時請特別小心如果需要進行一項作業是同步的權限。因此,最好是如果您撰寫的程式,正確地處理可能在同步或非同步完成的 I/O 作業。在 [程式碼範例示範這項考量事項。

有許多項目,程式可以等待非同步時若要完成,如佇列其他作業,或執行的作業背景工作。例如,下列程式碼會正確地處理重疊和非重疊讀取作業完成。它會執行任何動作超過等候指定的 I/O 完成:
   if (!ReadFile(hFile,
                 pDataBuf,
                 dwSizeOfBuffer,
                 &NumberOfBytesRead,
                 &osReadOperation )
   {
      if (GetLastError() != ERROR_IO_PENDING)
      {
         // Some other error occurred while reading the file.
         ErrorReadingFile();
         ExitProcess(0);
      }
      else
         // Operation has been queued and
         // will complete in the future.
         fOverlapped = TRUE;
   }
   else
      // Operation has completed immediately.
      fOverlapped = FALSE;

   if (fOverlapped)
   {
      // Wait for the operation to complete before continuing.
      // You could do some background work if you wanted to.
      if (GetOverlappedResult( hFile,
                               &osReadOperation,
                               &NumberOfBytesTransferred,
                               TRUE))
         ReadHasCompleted(NumberOfBytesTransferred);
      else
         // Operation has completed, but it failed.
         ErrorReadingFile();
   }
   else
      ReadHasCompleted(NumberOfBytesRead);
				
請注意,& NumberOfBytesRead 傳入 ReadFile 是不同於& NumberOfBytesTransferred 傳遞至 GetOverlappedResult。If 表示該工期為作業已建立非同步的那麼 GetOverlappedResult 會使用來決定實際的作業中它擁有後所傳輸的位元組數已完成。& NumberOfBytesRead 傳入 ReadFile 並沒有任何意義。

如果相反地,會立即完成作業,然後& NumberOfBytesRead 傳入 ReadFile 是讀取的位元組數目的有效值。如此一來,略過 OVERLAPPED 結構傳入 ReadFile ;不要使用它與 GetOverlappedResult 或 WaitForSingleObject。

與非同步作業的另一個要注意的是您必須使用 OVERLAPPED 結構,直到暫止的作業已經完成。其他四個字,如果您有三個未完成 I/O 作業,您必須使用三個 OVERLAPPED 結構。如果您重複使用的 OVERLAPPED 結構,您會收到非預期的結果的 I/O 作業,您可能會發生資料損毀。此外,您可以使用 「 OVERLAPPED 結構中第一次,或之前您重複使用它先前的作業完成後,您必須正確地將它初始化讓沒有左移過的資料會影響新的作業。

相同類型的限制會套用到使用中的資料緩衝區作業。將資料緩衝區未被讀取或寫入之前它對應的 I/O 作業完成為止。讀取或寫入的緩衝區可能會導致錯誤與損毀的資料。

非同步 I/O 仍然顯示為同步

如果您按照本文稍早的指示進行,不過,您所有的 I/O 作業通常還是同步完成的順序,發出,及任何 ReadFile 作業傳回 FALSE 與 GetLastError() 傳回 ERROR_IO_PENDING,這表示您有沒有任何背景工作的時間。為什麼不會這樣呢?

有幾個原因為何 I/O 作業完成同步即使您已透過程式碼取得非同步作業:

壓縮

若要非同步作業的一個障礙是 NTFS 壓縮。檔案系統驅動程式將不會以非同步的方式 ; 壓縮的檔案存取而是所有作業只會進行同步。這並不會套用至的檔案以類似於壓縮或 PKZIP 的公用程式壓縮。

NTFS 加密

類似於壓縮,檔案加密會導致系統驅動程式的規則轉為非同步 I/O 同步。如果檔案都解密,則將會非同步 I/O 要求。

延伸檔案

已同步完成 I/O 作業的另一個原因是本身的作業。在 Windows NT 上任何寫入作業檔案的擴充其長度為同步。

附註: 應用程式可以讓先前所述的寫入作業非同步藉由使用 SetFileValidData 函式,然後再發出 WriteFile 變更檔案的有效資料長度。

使用 SetFileValidData (也就是可以在 Windows XP 和更新版本),應用程式可以有效率地擴充檔而不會為零淋它們對效能產生負面影響。

NTFS 檔案系統並不會因為零層填滿最多由 SetFileValidData 所定義的有效資料長度 (VDL) 的資料,這項功能可以基於安全考量檔案可能會被指定的叢集,先前佔據的其他檔案。因此,SetFileValidData 要求呼叫端具有新的 SeManageVolumePrivilege 啟用 (預設情況下,這指派給系統管理員)。Microsoft 建議 Isv 仔細考慮使用這個函式的含意。

快取

大多數的 I/O 驅動程式 (磁碟、 通訊、 和其他人) 有特殊案例程式碼位置,如果 I/O 要求可以在 「 立即 」 即將完工,將會完成該操作,在 ReadFile 或 WriteFile 函數將傳回 TRUE。所有的方面來說,這類作業看起來似乎同步。磁碟裝置,一般來說,完成 I/O 要求 「 立即 」 時於記憶體中快取的資料。

資料不在快取

如果資料不在可以有快取配置,但是,操作快取。Windows NT 快取是在內部使用檔案對應來實作。在 Windows NT 的 「 記憶體管理員 」 不會提供非同步頁面錯誤的機制來管理所快取管理員使用的檔案對應。[快取管理員可以,不過,先驗證要求的網頁是否在記憶體中,因此如果您發出一個非同步的快取的讀取,而網頁不在記憶體中,檔案系統驅動程式會假設不想讓您封鎖的執行緒,並要求處理有限的背景工作執行緒集區。程式控制權回到您的程式,則仍在擱置中的讀取與您 ReadFile 呼叫之後。

可運作無礙的少數幾個要求,但因為背景工作執行緒集區是那里限制 (目前三 16 MB 的系統上),會還是只有一些要求排入磁碟驅動程式特定的時間。如果發出大量的資料不在快取中的 I/O 作業時,會變得飽和的快取記憶體管理員 」 及 「 記憶體管理員,而且您要求同步。

快取管理員的行為可以也會影響是否為基礎您在循序或隨機存取檔案。看到快取的優點大部分循序存取檔案時。FILE_FLAG_SEQUENTIAL_SCAN 旗標在 createfile 而呼叫會最佳化的快取記憶體這類的存取。不過,如果您存取以隨機方式的檔案,請使用如果要指示快取管理員 createfile 而在 FILE_FLAG_RANDOM_ACCESS 旗標最佳化隨機存取其行為。

請勿使用快取

FILE_FLAG_NO_BUFFERING 旗標沒有最多的行為會影響非同步作業的檔案系統。這是為了確保最佳的方式I/O 要求所實際非同步。它會指示檔案系統快不要使用任何取機制根本。

警告: 有一些限制來使用這個旗標,則是要使用的資料緩衝區的對齊方式和裝置的磁區大小。如需有關適當地使用這個旗標 createfile 而函式的文件中的函式參考,請參閱。

真實世界的測試結果

下面是一些範例程式碼中的測試結果。個的大小數字並不重要下面,以及變更到其他電腦,但是數字的關係互相比較 illuminates一般的旗標,對效能的影響。

您可以預期會看見類似下面的結果:
  • 測試 1
    Asynchronous, unbuffered I/O:  asynchio /f*.dat /n
    
       Operations completed out of the order in which they were requested.
       500 requests queued in 0.224264 seconds.
       500 requests completed in 4.982481 seconds.
    						
    這項測試會示範先前所述的程式快速發行 500 的 I/O 要求,並有很多時間來執行其他工作,或發出多個要求。
  • 測試 2
    Synchronous, unbuffered I/O: asynchio /f*.dat /s /n
    
       Operations completed in the order issued.
       500 requests queued and completed in 4.495806 seconds.
    						
    這項測試會示範這個程式所花費的 4.495880 秒呼叫 ReadFile 完成其作業,而測試 1所花費的只有 0.224264 秒發出相同要求。在測試 2 中,只有沒有"其他"的時間,才能執行任何背景程式工作。
  • 測試 3
    Asynchronous, buffered I/O: asynchio /f*.dat
    
       Operations completed in the order issued.
       500 requests issued and completed in 0.251670 seconds.
    						
    這項測試會示範快取同步性質。所有讀取已發出,並且在 0.251670 秒內完成。亦即,同步已完成的非同步要求。這也測試當資料是在示範高效能的快取管理員快取。
  • 測試 4
    Synchronous, buffered I/O: asynchio /f*.dat /s
    
       Operations completed in the order issued.
       500 requests and completed in 0.217011 seconds.
    						
    這項測試會示範相同的結果,如測試 3 所示。請注意從快取同步讀取有點招降非同步讀取完成從快取。在快取資料時,這項測試也會示範高效能的快取管理員。

結論

您可以決定哪一種方法最好,因為它所有相依於型別、 大小和您的程式執行的作業數目。

預設檔案存取權,而不需要指定 createfile 而來的任何特殊旗標是同步和快取的作業。

附註: 得拿一些自動的非同步行為在這種模式因為檔案系統驅動程式做了預測非同步先期讀取和非同步暫緩寫入已修改資料。雖然這不做應用程式 [ASCII 146] s I/O 非同步,是用於極大部分的簡單應用程式的理想的情況。

如果相反地,您的應用程式並不簡單,您可能必須執行有些程式碼剖析和效能監視來決定最好的方法,類似於本文稍早介紹的測試。程式碼剖析時間花在ReadFile 或 WriteFile 函式,並再比較 long,其方法這次所需實際的 I/O 作業完成時非常有用。如果大部分情況下,所花的實際發出的 I/O,則指之程式的 I/O同步完成。不過,如果所花費的時間發出的 I/O 要求是與相對較小型公司時間相比較它的 I/O 作業的時間完成之後,接著您作業被視為以非同步的方式。這個範例本文稍早所述的程式碼會使用 QueryPerformanceCounter 函式來執行它自己內部程式碼剖析。

效能監視,可以協助判斷您的程式能有效使用磁碟和快取。追蹤任何的效能計數器快取物件就會指出快取管理員的效能。追蹤的實體磁碟或邏輯磁碟效能計數器物件會表示磁碟系統的效能。

有幾個的公用程式很有幫助效能監視。效能監視器與 DiskPerf 會特別有用。系統就能收集資料,在 [磁碟系統的效能,您必須先發行 diskperf-y] 指令。請輸入命令後,您必須重新開機來啟動資料收集。

?考

如需有關這些公用程式 」 與 「 效能監視器的詳細資訊,請參閱 Windows NT 資源中的"最佳化 Windows NT 「 磁碟區套件的文件。
SQL Server 會要求系統,以支援 「 可靠的媒體來保證的傳遞 」,在 Microsoft SQL Server Always-On 存放裝置解決方案檢閱程式之下所述。Fo如需有關 SQL Server 資料庫引擎的輸入與輸出需求的詳細資訊,請按一下下面的文件編號,檢視 「 Microsoft 知識庫 」 中的文件:
967576Microsoft SQL Server 資料庫引擎輸入/輸出需求

屬性

文章編號: 156932 - 上次校閱: 2013年5月30日 - 版次: 6.0
這篇文章中的資訊適用於:
  • Microsoft Win32 Application Programming Interface
  • Microsoft SQL Server 2008 Developer
  • Microsoft SQL Server 2008 Enterprise
  • Microsoft SQL Server 2008 Express
  • Microsoft SQL Server 2008 Standard
關鍵字:?
kbapi kbfileio kbinfo kbkernbase kbmt KB156932 KbMtzh
機器翻譯
請注意--重要:本文是以 Microsoft 機器翻譯軟體翻譯而成,且可能由 Microsoft Community 利用 Community Translation Framework技術或人工進行事後編修。翻譯過程並無專業譯者參與。Microsoft 同時提供使用者人為翻譯、機器翻譯及社群編修後的機器翻譯三種版本的文章,讓使用者可以依其使用語言使用知識庫中的所有文章。但是,所有翻譯文章都可能不盡完美,內容都可能出現詞彙、語意或文法上的錯誤。就翻譯內容之不正確或錯誤,或客戶因使用翻譯內容所產生的任何損害,微軟不負擔任何責任。Microsoft將依合理的商業努力不斷地更新機器翻譯軟體和工具,以期能為使用者提供更好的服務。
按一下這裡查看此文章的英文版本:156932
Microsoft及(或)其供應商不就任何在本伺服器上發表的文字資料及其相關圖表資訊的恰當性作任何承諾。所有文字資料及其相關圖表均以「現狀」供應,不負任何擔保責任。Microsoft及(或)其供應商謹此聲明,不負任何對與此資訊有關之擔保責任,包括關於適售性、適用於某一特定用途、權利或不侵權的明示或默示擔保責任。Microsoft及(或)其供應商無論如何不對因或與使用本伺服器上資訊或與資訊的實行有關而引起的契約、過失或其他侵權行為之訴訟中的特別的、間接的、衍生性的損害或任何因使用而喪失所導致的之損害、資料或利潤負任何責任。

提供意見

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com