2

高速データ転送用にパラレル IO カードを使用する Windows コンソール アプリケーションがあります。(一般規格HPDI32ALT )

私のプロセスはユーザー モードで実行されていますが、デバイスの API の背後のどこかにカーネル モード ドライバーのアクティビティ (PCI DMA 転送、デバイス ステータス レジスタの読み取りなど) があると確信しています。動作モデルはおおよそ次のとおりです。

  • 起動時: API から IO バッファーへのポインターを要求します。
  • 私のメインループで:
    • API のブロックがデバイスのバッファ内の空き領域を待機中 (低水準点)
    • 送信データで IO バッファを満たす
    • デバイスに IO バッファへのポインタを渡すことにより、デバイスへの送信を開始します (この間、API は PCI バス上の DMA を使用してデータをカードに移動します)。
    • IO が完了するのを待っている API のブロック

アプリケーションは、適切なデータ レートと持続的なスループットで長時間正常に動作しているように見えますが、sys internals ツールのプロセス エクスプローラーでプロセスを確認すると、多数のページ フォールト (1 秒あたり約 6k) が見られます。カードに ~30MB/s を移動しています。

私は十分な RAM を持っており、ページ フォールトがディスク IO に関連していないことを十分に確信しています。

ページ フォールトの原因について何か考えはありますか? また、受信モードで同一の IO カードを使用しているこのアプリケーションの受信側もあります。API を受信モードで使用しても、多数のページ フォールトは発生しません。

IO バッファをカーネル モードに移動すると、ページ フォールトが発生する可能性がありますか?

4

1 に答える 1

0

アプリケーションがドライバにメモリ バッファを要求し、送信データをそのバッファにコピーしますか? これは非常に奇妙なモデルです。通常、アプリケーションにバッファを管理させます。

毎秒 6K ページでフォルトが発生し、毎秒 30MB しか転送していない場合、転送するすべてのページでほとんどページ フォルトが発生しています。ドライバーからデータ バッファーを取得すると、常にゼロで埋められますか? すべての転送でデマンド ゼロ フォールトが発生しているかどうか疑問に思っています。

-スコット

于 2011-08-10T15:03:00.927 に答える