设备驱动程序内存缓冲区处理器缓存问题
我有一个使用USB中的两个不同批量通道发送图像数据和视频帧的设备。设备驱动程序内存缓冲区处理器缓存问题
我的工作站处理器缓存有点大,足以容纳大约100个视频帧,没有任何问题,但没有图像数据。
我对图像和视频数据使用相同的缓冲区,该缓冲区大约有50个块,一个块大小为1MB。 视频帧快速出现,然后是图像帧。
我的问题是,在以下secnario中是否存在内存损坏问题?有人在处理器缓存知识可以帮助我。
- 由于视频帧很小,因此写入视频帧的内存缓冲区中的页面几乎都在缓存中。由于视频数据以流的形式出现,因此永远不会刷新。
- 但是当图像数据到来时,将使用大面积的内存缓冲区,然后视频内存页面将被刷新。但计划被刷新但仍未写入物理内存。
- 现在图像数据被写入内存,我在那里使用了
volatile
。 - 在写入映像数据后刷新缓存时,数据将被缓存刷新损坏。
会发生这种情况吗? 所以我申请了volatile
来写视频数据,这个问题看起来好像消失了。但是我需要做一个报告,那么上面提到的情况有可能发生吗?
评论是赠品:两个线程,而volatile
被误用为线程机制。
两个线程可以在两个CPU内核上运行。虽然内核通常共享内存,但它们通常不共享L1缓存。中间缓存有所不同。因此,取消引用两个CPU内核上的相同的指针可能会给出不同的结果。这对于跨线程正确共享的变量不是问题;编译器将使用正确的指令。但关键字正确共享。
在这里,我们探讨了将问题标记为C和C++的一个小问题,因为在线程之前分叉的两种语言在任何一种语言中都是标准化的。但是,这两种线程机制是故意相似的,因此编译器对可以(作为扩展)定义C线程和C++线程如何交互。你需要咨询你的文档。
它可能会更容易包裹libusb
线程在自己的代码,让你接收数据,而不线程问题,然后从你的代码调度。同时也是你的控制下的其他线程。
回到你看到的内存损坏:你可能看到的是一个线程正在写出它的内存视图,结果是它的缓存中陈旧的数据。如果你使用了类似互斥体的东西,这个陈旧的数据会被记录下来并且缓存同步。
嗨,我不明白为什么易失性指针解除引用不能解决问题? –
我不需要一个线程来发信号给其他线程,因为我可以保证它们会按顺序发生。 libusb的实现已经为我做了。我还需要像C++概念那样使用互斥锁吗? –
不知道我是否完全理解你的问题,但我认为你正在混淆两个完全不相关的概念:'volatile'修饰符无法操纵CPU缓存。 volatile表示可以在CPU的控制之外修改数据。如果添加'volatile'修复某些内容,这只是意味着您的编译器足够聪明,可以优化代码,如果数据仅由CPU操作,那么代码看起来不必要/冗余。 – mfro
是的,它来自外部,从另一个线程,然而libusb,一个用户模式线程。 –
让我更加明确地说,如果通过添加'volatile'消除线程错误,那只是巧合。你不能依赖它,并且通过编写下一行代码可能会再次破坏它。 – MSalters