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

How to perform cache operations in C++?

本文关键字:执行 缓存 操作 C++      更新时间:2023-10-16

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

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

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

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

您可能还听说过"内存泄漏"(分配给应用程序的内存,您的应用程序忘记释放/删除,一旦您的应用程序忘记它,它就会"永远丢失")。 如果您正在编写一个(可能)长时间运行的程序,那么内存泄漏绝对是一个问题。 但是泄漏的内存只是泄漏它的应用程序的问题;在现代虚拟内存环境中,如果应用程序 A 泄漏内存,则不会影响应用程序 B。 当应用程序 A 退出时,操作系统会清除其虚拟地址空间,此时任何泄漏的内存都将被系统回收,不再消耗任何系统资源。 在许多情况下,程序员专门选择不释放/删除内存分配,因为他们知道操作系统将在应用程序退出时自动回收全部内存量。 这种策略没有错,只要程序不继续重复这样做,耗尽其虚拟地址空间。

这是一个

常见的问题。

首先,你必须明白,缓存永远不会是真正空的,

就像寄存器永远不会真正空一样,它总是在那里,它总是有一个值。短语"刷新缓存"实际上是指将缓存内容写入内存,也称为内存屏障。见 https://en.wikipedia.org/wiki/Memory_barrier

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

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