Windows 上で非同期ディスク I/O のように同期が表示されます。

重要: このサポート技術情報 (以下「KB」) は、翻訳者による翻訳の代わりに、マイクロソフト機械翻訳システムによって翻訳されたものです。マイクロソフトは、お客様に、マイクロソフトが提供している全ての KB を日本語でご利用いただけるように、翻訳者による翻訳 KB に加え機械翻訳 KB も提供しています。しかしながら、機械翻訳の品質は翻訳者による翻訳ほど十分ではありません。誤訳や、文法、言葉使い、その他、たとえば日本語を母国語としない方が日本語を話すときに間違えるようなミスを含んでいる可能性があります。マイクロソフトは、機械翻訳の品質、及び KB の内容の誤訳やお客様が KB を利用されたことによって生じた直接または間接的な問題や損害については、いかなる責任も負わないものとします。マイクロソフトは、機械翻訳システムの改善を継続的に行っています。

英語版 KB:156932
概要
Microsoft Windows 上のファイル I/O は同期または非同期にできます。I/O 関数が呼び出され、I/O が完了すると返されますが、I/O のデフォルトの動作は同期です。非同期 I/O では、I/O 関数の実行をすぐに呼び出し元に戻りますが、I/O は、近い将来まで完了するとは見なされません。オペレーティング システム I/O が完了すると、呼び出し元に通知します。または、呼び出し元のオペレーティング システム サービスを使用して未解決の I/O 操作のステータスを確認できます。

非同期 I/O の利点は、呼び出し元が他の作業または I/O 操作が完了している間より多くの要求を発行する時間です。用語の重複は/Ois は頻繁に非同期 I/O や I/O の非オーバー ラップの同期 I/O を使用します。この資料は、I/O 操作の非同期と同期の条件を使用します。ここのリーダーは、CreateFile、ReadFile、WriteFile などのファイル I/O 関数の知識を前提としています。

頻繁に、非同期 I/O 操作の動作だけと同期 I/O。 この資料では、I/O 操作を同期的に完了後のセクションにある特定の状態。I/O が完了するまで、I/O 関数は返すがないため、呼び出し元はバック グラウンド処理の時間がありません。

いくつかの関数は、同期および非同期の I/O に関連します。この資料である ReadFile、WriteFile の例です。ReadFileEx、WriteFileEx が良い選択肢になります。この資料では具体的にはディスク I/O のみがの多くを他の種類の I/O、シリアル I/O やネットワーク I/O などを適用できます。
詳細

非同期入出力を設定します。

FILE_FLAG_OVERLAPPED フラグは、ファイルを開いたときに CreateFile で指定しなければなりません。このフラグを非同期的に実行するファイルに対する 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 操作を非同期的にまたは同期的に完了する可能性がありますを正しく処理するプログラムを記述するお勧めします。サンプル コードはこの点について説明します。

プログラムことができます多くのこと見捨てて asynchronousoperations doingbackground 作業など、キューの追加の操作を完了を待っていますが。たとえば、次のコードで正しく handlesoverlapped とオーバー ラップ以外の読み取り操作が完了します。未処理の I/O を完了するまで待つより doesnothing。
   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);				
なお & の readfile 関数に渡される NumberOfBytesRead とは異なる & GetOverlappedResult に NumberOfBytesTransferred が渡されました。Operationhas は非同期に行われている場合 GetOverlappedResult はそれ以降後の操作で転送されるバイトの実際の数を決定を使用がします。&、Readfile 関数に渡された NumberOfBytesRead は意味がありません。

一方、操作の完了をし、すぐに & NumberOfBytesRead に渡された場合に、ReadFile は読み取ったバイト数。ReadFile; に渡された OVERLAPPED 構造を無視してここでGetOverlappedResult または WaitForSingleObject を使用しないでください。

非同期操作で、別の注意点は、OVERLAPPED 構造体の保留中の操作が完了するまでは使用しない必要があることです。抑えて、3 つの未処理の I/O 操作がある場合する必要があります使用する OVERLAPPED 構造体の 3 つ。OVERLAPPED 構造体を再利用する場合、I/O 操作で予期しない結果が表示され、データが破損する場合があります。また、OVERLAPPED 構造体を使用して、初めて、前の操作完了後に再する前にする必要があります正しく初期化する左上のデータに新しい操作は影響しませんように。

フォーマットで使用するデータ バッファーと同じ種類の制限は適用されます。データ バッファーする必要がありますできません読み取りまたは書き込みの itscorresponding の I/O 操作が完了するまで読み取りまたは書き込み、buffermay エラーやデータ破損が発生します。

非同期 I/O が同期します。

この資料で前述の手順を実行している場合ただし、すべての入出力は通常同期的に完了、発行順と ReadFile 操作は FALSE を返しますと GetLastError() ERROR_IO_PENDING を返す、つまり背景作業の時間がありません。これが発生する理由ですか。

入出力完了 synchronouslyeven 非同期操作をコーディングする場合は理由の理由のとおりです。

圧縮

非同期操作を 1 つの障害物は、NTFS の圧縮です。ファイル システム ドライバーは圧縮ファイルを非同期的にアクセスできません。代わりに alloperations だけで同期で行われます。これは適用されませんファイルを圧縮または PKZIP のようなユーティリティと、その arecompressed。

NTFS 暗号化

ファイルの暗号化と圧縮のような非同期 I/O を同期するに変換するシステム ドライバー。ファイルが復号化、I/O 要求は非同期になります。

ファイルを拡張します。

I/O 操作が同期的に完了した別の理由は自分自身の操作です。、Windows NT 上で同期されるファイルの長さを拡張する操作が、書き込みします。

メモ: アプリケーションにことができます、前述の書き込み操作の非同期ファイルの有効データ長を変更する、SetFileValidData 関数を使用して、WriteFile を発行しています。

SetFileValidData (これは Windows XP およびそれ以降のバージョンで使用できます) を使用してアプリケーションを効率的にファイルを拡張してゼロ埋めして、パフォーマンスの低下を生じることがなく。

NTFS ファイル システムはありませんので 0-塗りつぶしの SetFileValidData で定義されている有効なデータ長 (VDL) までのデータは、この関数はセキュリティ上の影響でファイル割り当てられるクラスターが他のファイルに割り当てられていたが。したがって、SetFileValidData する必要があります、呼び出し元を有効に、新しい SeManageVolumePrivilege (既定では、これは管理者のみに割り当てる)。Isv のこの関数を使用して影響を慎重に検討をお勧めします。

キャッシュ

(ディスク、通信、およびその他の)、ほとんどの I/O ドライバーは I/O 要求が直ちに」完了する場合、操作は完了し、ReadFile または WriteFile 関数は TRUE を返します、特殊なケースのコードがあります。すべての方法でこれらの種類の操作は同期です。用の diskdevice は、通常、I/O 要求を完了できますデータがメモリにキャッシュされたときに「直ちに」。

データがキャッシュ内にありません。

キャッシュ スキームは、使用できます、ただし、thecache にデータがない場合。Windows NT のキャッシュは、ファイル マッピングを使用して内部的に実装されます。メモリ マネージャーは Windows NT では、キャッシュ マネージャーを使用してファイルのマッピングを管理する、非同期のバグチェックのメカニズムを提供しません。Thecache マネージャーは、要求されたページがメモリ内かどうかを確認ただし、非同期キャッシュの読み取りを発行するページがメモリにない場合、ファイル システム ドライバーであるとみなし、スレッドがブロックされないようにするには要求が限られたプールのワーカー スレッドで処理するようにします。保留中の読み取りで、ReadFile の呼び出しの後にプログラムに制御が戻ります。

要求の数が少ないためうまく機能しますが、ワーカー スレッドのプールがあるため (現在 3 つ、16 MB のシステムで)、ある限定はまだいくつかの要求だけキューに、ディスク ドライバーを特定の時点で。大量のキャッシュに含まれていないデータの I/O 操作を実行する場合、キャッシュ マネージャーとメモリ マネージャーが飽和状態になります、要求が同期します。

キャッシュ マネージャーの動作も関係を基にお客様のアクセス ファイルは、シーケンシャルまたはランダム。キャッシュの利点は、ファイルを順番にアクセスするときに seenmost です。CreateFile の呼び出し、FILE_FLAG_SEQUENTIAL_SCAN flagin はこの種類のアクセスのキャッシュを最適化します。ただし、ランダムな方法でファイルにアクセスする場合、theFILE_FLAG_RANDOM_ACCESS フラグを使用して CreateFile で、キャッシュ マネージャーの tooptimize のランダム ・ アクセスの動作を指示します。

キャッシュを使用しないでください。

FILE_FLAG_NO_BUFFERING フラグは、非同期操作に対してファイル システムの動作にほとんど効果を持ちます。これは最善の方法は実際に非同期 I/O を要求する guaranteethat です。ように指示、ファイル システムが任意のキャッシュ メカニズムをまったく使用しません。

警告: このフラグを使用するデータ バッファーの配置とデバイスのセクター サイズに制限があります。CreateFile 関数の詳細については適切にこのフラグを使用してドキュメントの関数リファレンスを参照してください。

実際テストの結果

サンプル コードからいくつかのテスト結果を次に示します。数値の絶対値はコンピューターからコンピューターへの変化が点灯 thegeneral フラグは、パフォーマンスに影響を相互に比較数値の関係。

次のような結果が期待どおり。
  • テスト 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.						
    このテストはこのプログラムがテスト 1 0.224264 秒間、同じ要求を発行するだけの消費に対し、ReadFile 操作を完了するを呼び出して、4.495880 秒を費やした例を示します。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 と同じ結果を示します。キャッシュから、キャッシュからの読み取りを同期を非同期の読み取りよりも少し速く完了することを確認します。このテスト データがキャッシュ内にある場合も、キャッシュ マネージャーの高パフォーマンスを示します。

まとめ

すべてのタイプ、サイズ、およびプログラムを実行する操作の数に依存するため最適な方法を決定できます。

CreateFileis、同期、およびキャッシュの操作に特別なフラグのいずれかを指定しなくても既定のファイル アクセス。

: ファイル システム ドライバーは予測非同期先読みと非同期遅延書き込みデータの変更のためこのモードでは自動的な非同期動作を取得しないでください。ありません、アプリケーションの I/O 非同期、単純なアプリケーションの大部分の理想的な場合です。

、一方で、アプリケーションが単純な場合は dosome ・ プロファイリングおよびパフォーマンスの監視、テストをこの資料で示したような最善の方法を決定する必要があります。TheReadFile で費やされた時間のプロファイリングまたは WriteFile 関数とし、方法を比較することが長いこと takesfor 実際の I/O 操作が完了するは非常に便利です。ある場合で実際に I/O をし、I/O を発行する時間に、majorityof beingcompleted に同期的に。ただし、時間発行 I/O 要求 isrelatively 小と比較すると、時間、I/O 操作を完了するの場合、操作は非同期的に処理中します。この資料で説明した、samplecode QueryPerformanceCounter 関数を使用して、その owninternal のプロファイリングを行います。

パフォーマンスの監視によって、効率的な方法を確認できます、プログラム isusing ディスクとキャッシュ。キャッシュ オブジェクトのパフォーマンス カウンターの追跡キャッシュ マネージャーのパフォーマンスが表示されます。物理ディスクまたは論理の Diskobjects のパフォーマンス カウンターを追跡すると、ディスク システムのパフォーマンスが表示されます。

パフォーマンスの監視に役立ついくつかのユーティリティがあります。パフォーマンス モニターと、DiskPerf は便利です。ディスク システムのパフォーマンスに関するデータを収集するシステム、最初、diskperf-y コマンドを発行するあります。コマンドを発行すると、データ コレクションを開始するシステムを再起動します。
関連情報
MSDN ドキュメントを参照してください。 同期および非同期 I/O 詳細について。

ReadFile ReadFileEx WriteFile のマルチ kbdss WriteFileEx GetOverlappedResult 非同期同期の重複した非オーバー ラップ kbfile

警告: この記事は自動翻訳されています

プロパティ

文書番号:156932 - 最終更新日: 06/25/2015 21:33:00 - リビジョン: 1.0

Microsoft Win32 Application Programming Interface

  • kbapi kbfileio kbinfo kbkernbase kbmt KB156932 KbMtja
フィードバック