高速データ転送用にパラレル 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 バッファをカーネル モードに移動すると、ページ フォールトが発生する可能性がありますか?