操作系统实验之最近最久未使用算法(LRU)模拟
来源:互联网 发布:镜片蓝膜绿膜区别 知乎 编辑:程序博客网 时间:2024/05/16 12:38
操作系统实验之最近最久未使用算法(LRU)模拟
LRU
在前面几条指令中使用频繁的页面很可能在后面的几条指令中频繁使用。反过来说,已经很久没有使用的页面很可能在未来较长的一段时间内不会被用到。这个,就是著名的局部性原理——比内存速度还要快的cache,也是基于同样的原理运行的。因此,我们只需要在每次调换时,找到最近最久使用的那个页面调出内存。这就是LRU算法的全部内容。
LRU详细介绍
模拟实现
- 维护一个长度固定的链表
- 如果为新页面则插入链表最前面,并维护链表长度
- 如果已存在该页面则移动到链表最前面
代码
#include<stdio.h>#include<malloc.h>//定义内存中最大的内存块的数量const int MAX_BLOCK_NUM = 5;//定义节点,block_id为内存块号,next为下一个节点的指针struct Node{ int block_id; Node *next;};//定义链表头结点的指针struct Node *List = NULL;//定义链表中节点的数量int BLOCK_NUM = 0;//输入链表中的所有结点void display(){ if(List == NULL) return; Node *p = NULL; p = List->next; while(p != NULL) { printf("%d ",p->block_id); p = p->next; }}//查询链表中是否存在id,若存在则返回id的序号,否则返回-1int query(int id){ if(List==NULL) return -1; Node *p = NULL; p = List->next; int num = -1; while(p != NULL) { num++; if(p->block_id == id) return num; p = p->next; } return -1;}//给定某节点的指针,如果不位null插入链表最前面,否则返回void insertToFirst(struct Node *newnode){ if(newnode == NULL || List == NULL) return; Node *p = NULL; p = List->next; List->next = newnode; List->next->next = p; BLOCK_NUM++;}//删除链表中最后的结点void deleteLastNode(){ Node *p = NULL; p = List; while(p->next->next != NULL) { p = p->next; } free(p->next); p->next = NULL; BLOCK_NUM--;}//给定id(0<= id && id < MAX_BLOCK_NUM) 返回序号为id的节点的指针,并删除该结点,Node* getNode(int id){ Node *p = NULL; Node *node = NULL; p = List; int num = -2; //找到id对应结点的前一个节点,方便删除 while(p != NULL) { num++; if(num == id -1) break; p = p->next; } //找到id对应节点 node = p->next; //删除id对应节点 p->next = p->next->next; //清除node—>next已存的信息; node->next = NULL; BLOCK_NUM--; return node;}//创建一个节点Node* createNode(int block_id){ Node *p = NULL; p = (Node*)malloc(sizeof(Node)); p->block_id = block_id; p->next = NULL; return p;}void LRU(){ //创建链表 List = createNode(0); //block_id 用于存放内存块号 int block_id; //用于存放 block_id 对应的结点 Node* block = NULL; while(1){ printf("input the number of the block\n"); scanf("%d",&block_id); block = createNode(block_id); //判断block是否在链表中; if(query(block_id) >= 0) { //存在该结点,则将获取该节点并移动到最前边; insertToFirst(getNode(query(block_id))); free(block); } else { //不存在该结点。将该节点插入链表最前边,并维护链表的长度为MAX_BLOCK_NUM insertToFirst(block); //维护链表的长度为MAX_BLOCK_NUM while(BLOCK_NUM > MAX_BLOCK_NUM) deleteLastNode(); } block = NULL; printf("there are all the blocks:"); display(); putchar('\n'); putchar('\n'); }}int main(int argc, char* argv[]){ LRU(); return 0;}
阅读全文
0 0
- 操作系统实验之最近最久未使用算法(LRU)模拟
- C++模拟操作系统最近最少使用算法(LRU),acm
- 操作系统页面置换算法之最近最少使用算法(LRU)
- 最近最少使用(LRU)算法模拟--LeastRecentPage
- 最近最久未使用(LRU)置换算法
- LRU最近最久未使用算法
- LRU最近最久未使用算法
- 最近最久未使用(LRU)页面置换算法原理及模拟实现
- 最近最久未使用(LRU)置换算法
- LRU最近最久未使用页面置换算法
- 自适应Lru(最近最少使用)算法
- 操作系统实验之页面置换算法(OPT、FIFO、LRU)C++简单实现
- 操作系统实验之银行家算法模拟
- [数据结构与算法]最近最久未使用(LRU)置换算法
- 操作系统实验(2)-- 模拟操作系统的页面置换 LRU OPT FIFO
- 最近最久未使用页面淘汰算法———LRU算法(java实现)
- 002-246-LRU Cache 最近最久未使用算法
- LRU算法,最近最少使用算法
- 解决Python词云库wordcloud不显示中文的问题
- zeroc-ice静态编译(c++ win vs2015)
- svn项目放到桌面后,导致桌面上的图标有了问号,如何去掉?--3种方法,最后一个解决最好用
- 2017第八届蓝桥杯决赛_对局匹配
- stdout和stderr关于缓冲区的浅解
- 操作系统实验之最近最久未使用算法(LRU)模拟
- C语言程序设计(29)
- txwifinatwfp64.sys导致蓝屏
- java 回调机制分为:异步回调 同步回调
- C# 方法内的参数 引用类型与值类型的一些理解
- 343. Integer Break(第十四周)
- A4纸的像素和分辨率
- 2017第八届蓝桥杯决赛_观光旅游
- mysql 多表查询