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