C++ 具有可变大小页面的缓冲池。当传入页面大于要逐出的页面时,需要一种高性能的方法来合并页面

C++ 具有可变大小页面的缓冲池。当传入页面大于要逐出的页面时,需要一种高性能的方法来合并页面,c++,memory-management,memory-pool,evict,C++,Memory Management,Memory Pool,Evict,在数据库缓冲池(内存池)的实现中,我有一个由内存中的页面组成的缓冲区 页面大小不同(均为512kb的整数倍) 假设我的逐出策略是LRU(最近使用最少),但我试图逐出的页面大小小于我需要替换的页面大小,如果我也想使用LRU,我应该逐出尽可能多的LRU页面以适应我的新页面 假设我需要删除最近使用的n页面。然而,这些页面在缓冲区/内存池中不一定是连续的 我想到的一个简单方法是合并这些n页面,这意味着我需要适当地重新排序缓冲池 最简单的方法是复制整个缓冲区,覆盖永久缓冲区,并适当地更新数据类型。然而,这

在数据库缓冲池(内存池)的实现中,我有一个由内存中的页面组成的缓冲区

页面大小不同(均为512kb的整数倍)

假设我的逐出策略是LRU(最近使用最少),但我试图逐出的页面大小小于我需要替换的页面大小,如果我也想使用LRU,我应该逐出尽可能多的LRU页面以适应我的新页面

假设我需要删除最近使用的
n
页面。然而,这些页面在缓冲区/内存池中不一定是连续的

我想到的一个简单方法是合并这些
n
页面,这意味着我需要适当地重新排序缓冲池

最简单的方法是复制整个缓冲区,覆盖永久缓冲区,并适当地更新数据类型。然而,这假设我们有足够的RAM来为这个操作复制整个缓冲区。有没有一种聪明的方法,我不必复制整个缓冲区


谢谢

一旦您必须移动缓冲区,我认为它不会是“高性能”的,但是,这样如何:

要收回的页面的总大小为k乘以页面大小512kb,即传入页面的大小

最坏情况下的布局是这样的(四个字符(除了条
|
)==512 kB):

两个
X
e是要退出的页面。现在的问题是,要使缓冲区连续,需要将
X2
移动到
X1
旁边(或者反过来)。我的方法是将
X1
之后的页面向右移动(进入
X2
)。我们可以安全地覆盖
X2
,因为我们无论如何都想将其逐出

这样,我们只需要更新3页大小,而不是复制整个缓冲区

更复杂的问题是:

|X1  |1   |2       |X2   |3       |X3      |4       |5   |
人们仍然可以使用上面的朴素算法,但也有可能进行优化。例如,您可以安全地将
1
移动到
X2
中,而无需触摸
2
,因为它适合那里。这同样适用于
2
,它可以移动到
X3

因此,事实上,您总是可以使用从动态数组插入和交换中了解到的简单移动技术,但是检查可能的优化可能是明智的,在这种情况下,枚举必须通过朴素算法移动的页面,并首先尝试将其直接放入要移出的空间。只有在失败后(如第一个示例中),才应使用移动


只有在需要原子性时,才有必要复制整个缓冲区。在这种情况下,上面的优化方法也会起作用,但一旦无法将阻碍您的页面放入要被逐出的页面中,您就会遇到麻烦。在这种情况下,您必须在逐出算法中递归以找到合适的位置,可能会逐出更多页面。

谢谢您的详细回答。谢谢。
|X1  |1   |2       |X2   |3       |X3      |4       |5   |