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