繁体   English   中英

设备驱动程序内存缓冲区处理器高速缓存问题

[英]device driver memory buffer processor cache issue

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

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

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

我的问题是,在以下secnario中是否存在内存损坏问题? 知道处理器高速缓存的人可以为我提供帮助。

  • 由于视频帧较小,因此写入视频帧的内存缓冲区中的页面几乎在高速缓存中。 由于视频数据以流的形式出现,因此它永远不会被冲洗掉。
  • 但是当图像数据到来时,将使用大面积的存储缓冲区,然后将刷新视频存储页面。 但是排定要刷新但仍未写入物理内存。
  • 现在,图像数据已写入内存,我在那里使用了volatile
  • 并且在写入图像数据后刷新数据时,缓存刷新将破坏该数据。

这会发生吗? 因此,我也将volatile应用于视频数据写入,这个问题似乎消失了。 但是我需要报告,因此上述情况有可能发生吗?

注释是赠品:两个线程和volatile被滥用为线程机制。

两个线程可以在两个CPU内核上运行。 尽管内核通常共享内存,但它们通常不共享L1缓存。 中间缓存有所不同。 结果,在两个CPU内核上取消引用相同的指针可能会得出不同的结果。 对于在线程之间正确共享的变量来说,这不是问题。 编译器将使用正确的指令。 但是该关键字已正确共享。

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

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

回到您看到的内存损坏:您可能看到的是,一个线程正在写出其内存视图,事实证明这是其缓存中的陈旧数据。 如果您使用了互斥锁之类的东西,那么这些过时的数据将被记录下来并缓存同步。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM