设备驱动内存缓冲处理器缓存问题

时间:2017-02-13 06:02:08

标签: c++ c caching memory volatile

我有一个设备,它使用USB中的两个不同的批量通道发送图像数据和视频帧。

我的工作站处理器缓存有点大,足以容纳大约100个视频帧,没有任何问题,但没有图像数据。

我对图像和视频数据使用相同的缓冲区,缓冲区大约有50个块,一个块大小为1MB。 视频帧快速出现,然后是图像帧。

我的问题是,以下secnario中是否存在内存损坏问题?有处理器缓存知识的人可以帮助我。

  • 由于视频帧很小,因此写入视频帧的内存缓冲区中的页面几乎位于缓存中。由于视频数据是一个流,因此它永远不会刷新。
  • 但是当图像数据到来时,将使用大面积的内存缓冲区,然后刷新视频内存页面。但计划刷新但仍未写入物理内存。
  • 现在图像数据已写入内存,我在那里使用了volatile
  • 在图像数据写入后刷新时,缓存刷新会破坏数据。

这可能发生吗? 所以我也将volatile应用于视频数据写入,这个问题看起来就像消失了。但是我需要做一个报告,所以上面提到的场景有可能发生吗?

1 个答案:

答案 0 :(得分:1)

评论是赠品:两个主题,volatile被误用为线程机制。

两个线程可以在两个CPU内核上运行。虽然内核通常共享内存,但它们通常不共享L1缓存。中级缓存各不相同。因此,在两个CPU内核上取消引用相同的指针可能会产生不同的结果。对于跨线程正确共享的变量,这不是问题;编译器将使用正确的指令。但关键字是正确共享。

在这里,我们遇到了一个小问题,即您已将问题标记为C和C ++,因为在线程之前分叉的两种语言在两种语言中都是标准化的。但是,两个线程机制有意相似,因此编译器对可以(作为扩展)定义C线程和C ++线程如何交互。您需要查阅文档。

libusb线程包装在您自己的代码中可能会更容易,这样您就可以在没有线程问题的情况下接收数据,然后从您的代码调度到您控制下的其他线程。

回到你看到的内存损坏:你可能看到的是一个线程正在写出它的内存视图,结果证明它的缓存中是陈旧的数据。如果您使用类似互斥锁的东西,则会记录这些陈旧的数据并同步缓存。