fro*_*nca 0 c c++ memory-management
《算法导论》中有如下练习:
考虑在具有相对少量快速主内存和相对大量较慢磁盘存储的计算机中实现堆栈。PUSH 和 POP 操作适用于单字值。我们希望支持的堆栈可能会变得比内存容量大得多,因此其中大部分必须存储在磁盘上。...
...一个简单但低效的堆栈实现将整个堆栈保留在磁盘上。由于磁盘操作相对昂贵,现在考虑一种堆栈实现,其中我们将堆栈的一页保留在内存中。(我们还维护少量内存来跟踪当前内存中的页面。)仅当相关磁盘页面驻留在内存中时,我们才能执行堆栈操作。如果需要,我们可以将当前内存中的页面写入磁盘,并将新页面从磁盘读入内存。如果相关的磁盘页面已经在内存中,则不需要磁盘访问。...
我想在 C 或 C++ 的实际代码中实现这一点。我知道如何使用mmap()并且可以使用内存映射磁盘文件来实现此目的,但我不知道如何实现“一个堆栈实现,其中我们将堆栈的一页保留在内存中”。有没有办法以 C/C++ 指针的方式逐页管理内存?
你不。
您使用映射堆栈编写代码,并计算模拟中更改页面的次数,并让操作系统缓存所需的数量。跟踪页面更改的最佳方法是在push()和pop()函数中。将指针转换为整数,使用掩码去掉低位并与之前的比较,看看它是否改变。
当您到达模拟运行结束时,您将输出必须在 RAM 中交换页面的次数。
实际上,您不必每次都强制将其写入磁盘。这对于学习环境来说是完全没有必要的。