前言
本文将介绍与高速缓存 Cache 有关的实验五。
这个实验来自于《深入理解计算机系统》第六章的内容。存储器是计算机中一个十分重要的结构,学生将在本实验中理解,当缓存命中与不命中时系统会产生的变化。
介绍
本实验需要学生在已有的框架下,实现 LRU 算法,以模拟当缓存命中、不命中时系统产生的变化,更深入地理解 Cache。
具体内容
学生需要实现下面的函数以实现 LRU 算法,并通过实验五的所有测试点。实验五的测试程序和测试用例集已经在文件中一并给出,学生只需简单地运行编译好的程序即可检查实验结果。
LRUCache(long unsigned int capacity);
int get(int key);
void set(int key, int value);
这三个方法都封装在类 LRUCache 中,其中:
- 第一个方法是构造方法,需要一个
long unsigned int
来初始化缓存大小 - get() 方法用于获得缓存节点中的内容,若缓存命中则返回缓存中的值,若不命中则返回 -1
- set 方法用于设置缓存节点中的内容。
文件内容
- cache.cc:学生实现 LRU 算法的文件
- cache.h:LRU 算法声明的头文件
- cache_ans.cc:本实验答案
- driver.cc:测试驱动文件
- Makefile:简化编译过程的文件
- README:实验指导书实验五部分节选
实验过程简介
学生首先阅读 cache.h 文件中的声明,了解 CacheNode 和 LRUCache 的基本结构。
struct CacheNode {
int key;
int value;
CacheNode *prev, *next;
CacheNode(int k, int v) : key(k), value(v), prev(nullptr), next(nullptr) {}
};
class LRUCache {
private:
long unsigned int size;
CacheNode *head, *tail;
std::map<int, CacheNode*> mp;
public:
// 必须实现的方法
LRUCache(long unsigned int capacity);
int get(int key);
void set(int key, int value);
// 提供的辅助方法
void remove(CacheNode *node);
void setHead(CacheNode *node);
};
根据上述的结构,学生需要实现自己的 LRUCache 类,以满足 LRU 算法。
实现完成后,可以通过 Makefile 进行编译,以检查实验结果是否正确。
实验编写简介
本实验的测试程序编写并不占大头,而主要在于我需要自己实现一个 LRU 算法。答案已经包含在最终文件中,这里就不展示了。