2

我有一个 Windows 控制台应用程序,它使用并行 IO 卡进行高速数据传输。(通用标准HPDI32ALT

我的进程在用户模式下运行,但是,我确信设备 API 后面的某个地方存在一些内核模式驱动程序活动(PCI DMA 传输、读取设备状态寄存器等)。工作模型大致是这样的:

  • 启动时:我从 API 请求一个指向 IO 缓冲区的指针。
  • 在我的主循环中:
    • 阻止 API 等待设备缓冲区中的空间(低水位线)
    • 用传输数据填充 IO 缓冲区
    • 通过将指针传递给 IO 缓冲区来开始向设备传输(在此期间 API 使用 PCI 总线上的 DMA 将数据移动到卡上)
    • 阻塞等待 IO 完成的 API

该应用程序似乎在适当的数据速率和长时间的持续吞吐量下正常工作,但是,当我查看 sys internals tool process explorer 中的进程时,我看到了大量的页面错误(每秒约 6k)。我正在将 ~30MB/s 移动到卡上。

我有足够的 RAM,并且有理由确定页面错误与磁盘 IO 无关。

关于可能导致页面错误的任何想法?我也有这个应用程序的接收端,它在接收模式下使用相同的 IO 卡。API 的接收模式使用不会导致大量页面错误。

将 IO 缓冲区移动到内核模式的行为会导致页面错误吗?

4

1 回答 1

0

因此,您的应用程序向驱动程序请求内存缓冲区,然后您将发送数据复制到该缓冲区中?这是一个非常奇怪的模型,通常你让应用程序管理缓冲区。

如果您的故障率为 6K 页/秒,而您仅传输 30MB/秒,那么您传输的每一页几乎都会出现页面故障。当您从驱动程序获取数据缓冲区时,它是否总是填零?我想知道您是否对每次传输都要求零故障。

-斯科特

于 2011-08-10T15:03:00.927 回答