缺页中断
当CPU访问的页面不在内存时,便会产生缺页中断,请求操作系统将所缺页从硬盘中调入到内存里。
和一般中断的区别:
是指令执行期间产生和处理中断信号
一般中断程序计数器返回的时候会执行下一条指令,而缺页中断需要重新执行该条指令。
流程:
- CPU访问一条Load指令,然后去找指令对应的页表项。
- 如果页表有效,则直接访问内存,如果无效,则CPU发送缺页中断请求。
- 操作系统收到缺页中断,执行处理函数,先查找页面在磁盘中的位置。
- 然后需要把页面换入到物理内存中 ,但换入前需要物理内存有空位,如果没有空位需要执行页面置换,选择一个物理页把它换出到磁盘,然后将状态改为无效,最后把需要的物理页换进来
- 换入之后将该页表状态改为有效。
- 最后CPU重新执行原来的命令。
先进先出
选择在内存中驻留时间最长的页面,垃圾
最近最久未使用LRU
选择最长时间没有被访问的页面进行置换。看上去不错,实际不怎么用。
struct DLinkedNode {
int key, value;
DLinkedNode* prev;
DLinkedNode* next;
DLinkedNode(): key(0), value(0), prev(nullptr), next(nullptr) {
}
DLinkedNode(int _key, int _value): key(_key), value(_value), prev(nullptr), next(nullptr) {
}
};
class LRUCache {
private:
unordered_map<int, DLinkedNode*> cache;
DLinkedNode* head;
DLinkedNode* tail;
int size;
int capacity;
public:
LRUCache(int _capacity): capacity(_capacity), size(0) {
// 使用伪头部和伪尾部节点
head