我想在刷新缓存后运行我的 C++ 程序,在运行我的程序之前我不知道缓存中有什么。在 Ubuntu 上的 C++ 中是否有其他方式可以在运行程序之前刷新我的缓存。
编辑:刷新缓存的动机是......每次我运行我的程序时,我都不希望我现在的数据结构存在于缓存中......我的意思是我想要一个冷缓存......所有访问由磁盘制成。
实现这一点的一种方法是重新启动计算机......但考虑到我必须运行的实验数量,这对我来说是不可行的。那么,任何人都可以指导我如何实现这一目标。
您无需从用户模式(非内核模式)程序中刷新缓存。操作系统(Linux,在 ubuntu 的情况下)为您的应用程序提供了一个全新的虚拟地址空间,没有来自其他程序的“剩余东西”。如果不执行特殊的操作系统系统调用,您的程序甚至无法访问用于其他应用程序的内存。因此,从缓存的角度来看,您的应用程序从一个全新的开始,就它而言。有 cacheflush() 系统调用(语法因操作系统而异),但除非您为典型的用户模式应用程序做一些不寻常的事情,否则您可能会忘记缓存甚至存在;它只是为了加速你的程序,操作系统通过 CPU 的 MMU 管理它,你的应用程序不需要管理它。
您可能还听说过“内存泄漏”(分配给您的应用程序而您的应用程序忘记释放/删除的内存,一旦您的应用程序忘记它就会“永远丢失”)。如果您正在编写(可能)长时间运行的程序,内存泄漏绝对是一个问题。但是泄漏的内存只是泄漏它的应用程序的问题。在现代虚拟内存环境中,如果应用程序 A 泄漏内存,它不会影响应用程序 B。当应用程序 A 退出时,操作系统会清除其虚拟地址空间,并且此时任何泄漏的内存都会被系统回收,并且不会更长的时间消耗任何系统资源。在许多情况下,程序员特别选择不释放/删除内存分配,知道操作系统会在应用程序退出时自动回收全部内存量。该策略没有任何问题,只要程序不重复执行此操作,耗尽其虚拟地址空间。
这是一个常见的问题。
首先,您必须了解缓存永远不会真正为空,就像寄存器永远不会真正为空一样,它始终存在,并且始终具有值。短语“刷新缓存”实际上是指将缓存内容写入内存,也称为内存屏障。见https://en.wikipedia.org/wiki/Memory_barrier
这不是您的问题,因此您使用了错误的术语。
您真正想要的是用错误的值填充缓存。这比听起来要难,因为您正在与通常是您朋友的所有优化作斗争。Memcpy'ing 大块内存(几 MB - 考虑到今天缓存的大小)应该正常工作。
但是...
您还拥有文件缓存和其他东西,这些东西会给您的应用程序带来不公平的优势。这可能是一个非常复杂的主题,它本身就是一个小项目。