c - 运行没有缓存的程序

标签 c linux performance caching

我们总是谈论如何更好地使用缓存来加速程序。但是,如果我有一个对延迟不敏感的后台程序。我还在同一台计算机上运行了一些对延迟敏感的程序。为了避免后台程序污染延迟敏感程序的缓存,我有两个选择:

1) 使用页面颜色或其他一些技术来“分区”缓存,让对延迟敏感的程序以多种缓存颜色运行,而后台程序从不使用具有这些缓存颜色的内存。 <-- 我知道这是如何工作的,并且对这种方法没有疑问。

2) 我们可以将后台程序使用的内存标记为不可缓存吗?也就是说,后台程序对内存的访问都会绕过缓存,缓存才不会被污染?

我知道我们可以通过设置 CR3 寄存器的第 30 位来绕过机器上的所有缓存。但是我们如何才能让一些程序绕过缓存而其他程序仍然使用缓存呢?

[添加问题] 是否可以标记内存页面绕过缓存?换句话说,我们可以将内存页标记为不可缓存吗?

非常感谢您的见解!

最佳答案

您可以使用现代 x86 处理器的内存类型范围寄存器 (MTRR) 和/或页面属性表 (PAT) 功能。您可以使用这些功能将某些内存区域标记为不可缓存。特别是,您可以使用 UC、UC- 或 WC 内存类型。但是您必须知道对延迟不敏感的应用程序使用了哪些内存区域。有关详细信息,请参阅英特尔手册第 3 卷第 11 章:内存缓存控制。

在用户模式下你能做的最接近的事情是使用 non-temporal accesses (NTA)。

I know we could bypass al of the cache on the machine by setting the 30th bit of CR3 register.

我认为你的意思是 CR0 的第 30 位,而不是 CR3。

关于c - 运行没有缓存的程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23552808/

相关文章:

c - 链接描述文件 : insert absolute address of the function to the generated code

c - 想在 strtok 之后释放我的指针 token

c - 分析 Linux 中的同步操作

linux - awk 提供额外空间?

linux - Unix:bash脚本调用脚本,以及相对路径

php - 保存 PNG 图像以便快速加载的最佳方式

c - 如何用C语言调试一个简单的数据库?

linux - 如何使用 Ubuntu "rename"工具替换目录名和文件名中的字符串?

reactjs - 更改url时如何防止react-route重新渲染整个应用程序

Java 在创建对象时的性能