设备驱动程序内存缓冲区处理器缓存问题
device driver memory buffer processor cache issue
我有一个设备,它使用USB中的两个不同的批量通道发送图像数据和视频帧。
我的工作站处理器缓存有点大,足以容纳大约100个视频帧,没有任何问题,但不能容纳图像数据。
我对图像和视频数据使用相同的缓冲区,这个缓冲区大约有50个块,其中一个块的大小是1MB。视频帧来得很快,然后是图像帧。
我的问题是,在下面的secnario中是否存在内存损坏问题?有人谁知道处理器缓存可以帮助我。
- 由于视频帧很小,写入视频帧的内存缓冲区中的页面几乎都在缓存中。由于视频数据是以流的形式出现的,所以它从未被清除
- 但当图像数据到来时,将使用大面积的内存缓冲区,然后视频内存页将被清空。但计划刷新,但仍然没有写入物理内存
- 现在图像数据已经写入内存,我在那里使用了
volatile
- 并且,当图像数据写入后刷新这些数据时,这些数据将被缓存刷新损坏
这会发生吗?所以我也将volatile
应用于视频数据写入,这个问题看起来好像消失了。但我需要做一份报告,那么上述情况有可能发生吗?
注释是赠品:两个线程,volatile
被误用为线程机制。
两个线程可以在两个CPU内核上运行。虽然内核通常共享内存,但它们通常不共享一级缓存。中间缓存各不相同。因此,在两个CPU内核上取消引用相同的指针可能会得到不同的结果。对于在线程之间正确共享的变量来说,这不是问题;编译器将使用正确的指令。但是关键字是正确地共享。
在这里,我们将讨论一个小问题,即您将问题标记为C和C++,因为这两种语言在线程化之前是分叉的,在这两种语文中都是标准化的。然而,这两种线程机制有意相似,因此编译器对可以(作为扩展)定义C线程和C++线程如何交互。您需要查阅您的文档。
将libusb
线程封装在您自己的代码中可能会更容易,这样您就可以在没有线程问题的情况下接收数据,然后将代码调度到您控制的其他线程。
回到你所看到的内存损坏:你可能看到的是一个线程正在写出它的内存视图,结果发现它的缓存中有过时的数据。如果您使用了类似互斥锁的东西,这些过时的数据就会被注意到并同步缓存。
相关文章:
- 警告处理为错误这里有什么问题
- 最小硬币更换问题(自上而下方法)
- 为"adjacent"变量赋值时出现问题
- 我的神经网络不起作用 [XOR 问题]
- 在Ubuntu 16.04上安装Cilk时出现问题
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 编译包含字符串的代码时遇到问题
- Project Euler问题4的错误解决方案
- 问题:什么是QAbstractItemView::NoEditTriggers的反面
- 在编译C++代码(具有dlib和opencv)到WASM时面临问题
- 在进程中对同一管道进行读取和写入时C++管道出现问题
- 静态数据成员的问题-修复链接错误会导致编译器错误
- C++ 雷神库 - 使用资源加载器类时出现问题(不命名类型)
- 一个关于在C++中重载布尔运算符的问题
- 设备驱动程序内存缓冲区处理器缓存问题
- C++ 将多索引提升为 LRU 缓存的索引排序问题
- LRU 缓存C++实现问题
- 深度嵌套循环的缓存中毒问题
- 如果不同的核有不同的L1缓存,为什么会出现缓存乒乓和问题
- 发布版本中的缓存刷新问题