如何在C ++中执行缓存操作?

时间:2012-06-29 22:48:43

标签: c++ linux unix

我想在刷新缓存后运行我的C ++程序,在运行程序之前我不知道缓存中有什么。在Ubuntu上有其他一些C ++方式,我可以在运行程序之前刷新缓存。

编辑:刷新缓存的动机是......每次运行程序时我都不希望我现有的数据结构存在于缓存中......我的意思是我想要一个冷缓存......所有访问都是从磁盘进行的。

实现这一目标的一种方法是重新启动计算机......但考虑到我必须运行的实验数量,这对我来说是不可行的。所以,任何人都可以指导我如何实现这一目标。

2 个答案:

答案 0 :(得分:1)

您无需从用户模式(非内核模式)程序中刷新缓存。操作系统(Linux,在ubuntu的情况下)为您的应用程序提供了一个新的虚拟地址空间,没有其他程序的“剩余东西”。如果不执行特殊的OS系统调用,您的程序甚至无法访问用于其他应用程序的内存。因此,从缓存的角度来看,就您而言,您的应用程序从一个干净的平台开始。有cacheflush()系统调用(语法因操作系统而异),但除非你为典型的用户模式应用程序做一些不寻常的事情,否则你可能会忘记缓存甚至存在;它只是为了加速你的程序,操作系统通过CPU的MMU管理它,你的应用程序不需要管理它。

您可能还听说过“内存泄漏”(分配给您的应用程序的内存,您的应用程序忘记释放/删除,一旦您的应用程序忘记了它,它将“永远丢失”)。如果您正在编写(可能)长期运行的程序,泄漏的内存肯定是一个问题。但泄漏的内存只是泄漏它的应用程序的一个问题;在现代虚拟内存环境中,如果应用程序A泄漏内存,它不会影响应用程序B.当应用程序A退出时,操作系统会清除其虚拟地址空间,并且系统会回收任何泄漏的内存,而不是更长的时间消耗任何系统资源。在许多情况下,程序员专门选择不释放/删除内存分配,因为知道操作系统将在应用程序退出时自动回收整个内存量。这个策略没有任何问题,只要该程序不会在重复的基础上继续这样做,耗尽其虚拟地址空间。

答案 1 :(得分:0)

这是一个常见的问题。

首先,您必须了解缓存永远不会是空的,就像寄存器永远不会是空的,它始终存在,并且它总是有值。短语“刷新高速缓存”实际上是指将高速缓存内容写入存储器,也称为存储器屏障。 见https://en.wikipedia.org/wiki/Memory_barrier

这不是你的问题,所以你使用了错误的术语。

你真正想要的是用错误的值填充缓存。这比听起来更难,因为你正在对抗通常是你朋友的所有优化。记住大块内存(几个MB - 考虑到当今缓存的大小)通常应该可以工作 然而...
您还有文件缓存和其他会给您的应用程序带来不公平优势的东西。这可能是一个非常复杂的主题,并且本身就是一个小项目。