C 或 C++ : 如何保持当时只"one block in memory"?



In"算法导论";有以下练习:

考虑在具有相对少量快速主内存和相对大量慢速磁盘存储的计算机中实现堆栈。PUSH和POP操作处理单个单词值。我们希望支持的堆栈可能会增长到比内存容量大得多,因此大部分堆栈必须存储在磁盘上。。。

。。。一个简单但效率低下的堆栈实现可以将整个堆栈保存在磁盘上。由于磁盘操作相对昂贵,现在考虑一个堆栈实现,在该实现中,我们将堆栈的一页保存在内存中。(我们还维护少量内存,以跟踪当前内存中的页面。(只有当相关磁盘页面位于内存中时,我们才能执行堆栈操作。如果需要,我们可以将当前内存中的页面写入磁盘,并将新页面从磁盘读入内存。如果相关的磁盘页已经在内存中,则不需要进行磁盘访问。。。

我想在C或C++的实际代码中实现这一点。我知道如何使用mmap(),我可以使用内存映射的磁盘文件,但我不知道如何实现">一种堆栈实现,其中我们将堆栈的一页保存在内存中";。有没有一种方法可以将内存作为C/C++指针逐页管理?

你不能。

使用mmamapped堆栈编写代码,计算在模拟中更改页面的次数,并让操作系统根据需要进行缓存。跟踪页面更改的最佳方法是使用push()pop()函数。将指针强制转换为整数,使用掩码去掉低位,并与前一个进行比较,看看它是否发生了变化。

当您的模拟运行结束时,您会输出您必须在RAM中交换页面的次数。

实际上并不是每次都强制将其写入磁盘。这对学习环境来说是完全没有必要的。

使用2个页面更有意义,因为否则会遇到一些非常糟糕的情况,即每次堆栈访问都意味着磁盘访问。

因此,您分配了2个页面,并将堆栈指针设置为起点,然后将磁盘上页面数量的计数器设置为0。

在push((中,如果堆栈已满,则增加计数器,将旧页保存到磁盘,将所有内容下移一页,并调整堆栈指针。然后将数据推送到堆栈。

如果堆栈为空并且计数器>0递减计数器,从磁盘加载回一页并调整堆栈指针。然后从堆栈中弹出数据。

注意:您可以将这两个页面用作环形缓冲区,这样在读取/写入页面时就不必移动数据。

相关内容

最新更新