可以看到, 传统的LRU直接移除时间戳最久的一个元素, 但LRU-K需要分为访问次数低于 K 次和访问次数达到 K 次2中情况, 在这2种情况下, 其移除的思路和传统的LRU是一样的。 由于我们的LRU-K是作为缓存池的一部分使用的,其更新、删除、读取都有时间复杂度的要求,查询最容易想到哈希表, 而插入和删除最容易想到...
Task #1 - LRU-K Replacement Policy 理解 性能 实现 Task #2 - Buffer Pool Manager Task #3 - Read/Write Page Guards 总结 最后 进度 2023-05-04 五四青年节hh 最近一直在补算法,今天抽出一点时间完成了 Project1 的第一部分 即 LRU-K置换,看上去并不难,但做的过程却还是挺曲折的,令人唏嘘。 2023-...
LRU-K可以根据不同的场景和访问模式进行调整K值,从而在不同情况下获得更好的性能。它相对于经典LRU策略来说,在一些特殊情况下,例如频繁顺序访问或周期性访问模式,可能能够更准确地识别和保留需要缓存的数据项。
这就是LRU-K解决的问题。 它 LRU-K记录了每个frame的访问记录,将访问时间戳存储成一个数组,下标小的表示最近的访问。当需要进行替换的时候,他先检测有没有frame的访问次数是小于k的,如果有就根据FIFO进行踢出(这里注意,项目网站和代码注释不同,正确的是FIFO);如果所有的都大于等于k次,那么数组[k-1]项(数组起...
为了完成CMU15445(Spring 2023)PROJECT #1 - Buffer Pool任务,需要遵循三个主要部分的实现策略。任务包括实现LRU-K替换策略、缓冲池管理和RAII思想的PageGuard。本篇内容将详细阐述这三个任务的实现步骤与要点。在开始之前,请确保了解了课程官网提供的资源,包括课程网站、源代码、自动测评网站GradeScope和...
LRU-K具有LRU的优点,同时能够避免LRU的缺点,实际应用中LRU-2是综合各种因素后最优的选择,LRU-3或者更大的K值命中率会高,但适应性差,需要大量的数据访问才能将历史访问记录清除掉。 •优先级提示:允许txns告诉缓冲池页面是否重要 •本地化(localization):根据每个txn /查询选择要逐出的页面 ...
理解与实现LRU-K算法时,应具备基础的链表和哈希表使用知识。利用两个链表和一个哈希表,其中链表分别用于管理访问次数大于等于K的节点(l1)和访问次数小于K的节点(l2)。在操作中,遵循原则:l2的节点优先被移除,且节点只能从l2流向l1。Task 2: BUFFER Pool Manager 在实现BUFFER Pool Manager时,需...
为该结构实现了几个关键函数,比如获取最近的一次访问时间戳、最早的一次访问时间戳、清空历史记录、计算后向K距离等。 代码语言:javascript 代码运行次数:0 复制 Cloud Studio代码运行 classLRUKNode{public:LRUKNode()=default;LRUKNode(size_t id,size_t k):k_(k),fid_(id){}autoGetEvictable()->bool{re...
Task #1 - LRU-K Replacement Policy 跟踪缓冲池中页面的使用情况,用于记录、更新以及删除页(frame)。 src/include/buffer/lru_k_replacer.h==> 实现LRUKReplacer的新类,且独立 src/buffer/lru_k_replacer.cpp==> 对应实现,实现LRU-K替换策略。
LRU-K 用于记录、更新与删除页面,其历史链表长度代表页面出现次数。当历史链表长度小于等于 K 时,表示最多记录最后 K 次出现。若超过 K 次,则删除链表头部,并将新时间戳加入尾部。历史链表应由小到大排列时间戳。K-Distance 计算方法:若页面出现次数小于 K,则 K-Distance 无穷大;若出现次数...