注:查看全文请关注作者,或点击前往:最近最久未使用(LRU)置换算法的C++实现 操作系统实验 最近最久未使用(LRU)置换算法 实验题目
最近最久未使用(LRU)置换算法原理就是:当需要淘汰某页面时,选择当前一段时间内最久未使用过的页先淘汰,即淘汰距当前最远的上次使用的页 。
假定分配给该进程的页块数为3,页面访问序列长度为20 。本实验可以采用数组结构实现,首先随机产生页面序列,当发生请求调页时,若内存已满,则需要利用LRU算法,将当前一段时间内最久未使用过的页替换出去 。
程序中使用的数据结构及符号说明
数组(数据结构)记录信息
int memory[1001];//记录进程内存中的页bool flag[1001];//标记:访问的页面是否在内存中int l_time[1001];//记录页面的最近使用时间int vis[1001];//记录访问序列bool miss[1001];//记录每次访问的缺页状态int state[1001][1001]; //记录每次访问后的进程的内存页面状态
整型变量
int n;//进程内存的页块数int now_num = 0;//进程内存当前的页个数int now_time = 0;//当前时间(访问次数)int m;//页面访问序列的长度int miss_num = 0;//缺页次数
缺页率
double miss_rate;//缺页率
自定义函数
源程序及注释
【LRU最近最久未使用置换算法的C++实现】#include #include #include using namespace std;int n;//进程内存的页块数int now_num = 0;//进程内存当前的页个数int now_time = 0;//当前时间(访问次数)int m;//页面访问序列的长度int miss_num = 0;//缺页次数double miss_rate;//缺页率int memory[1001];//记录进程内存中的页bool flag[1001];//标记:访问的页面是否在内存中int l_time[1001];//记录页面的最近使用时间int vis[1001];//记录访问序列bool miss[1001];//记录每次访问的缺页状态int state[1001][1001]; //记录每次访问后的进程的内存页面状态//初始化void init(){cout << "请输入分配给该进程的页块数:";cin >> n;cout << "请输入页面访问序列的长度:";cin >> m;cout << "请输入访问序列:";for (int i = 0; i < m; i++){cin >> vis[i];}//进程的内存中刚开始没有页,初始化为-1for (int i = 0; i < n; i++){memory[i] = -1;}//在内存中的标记初始化为falsefor (int i = 0; i < 1000; i++){flag[i] = false;}//页面的最近使用时间初始化为0for (int i = 0; i < 1000; i++){l_time[i] = 0;}return;}//LRU算法void LRU(int a){//检查请求访问的页是否在进程的内存中if (flag[a] == false){miss[now_time] = 1; //此次标记:缺页miss_num++;if (now_num == n) //内存已满{int min_time = 0x3f3f3f, min_num = -1;//在内存中的页中,最早被访问时间和最久未使用过的页在内存中的编号for (int i = 0; i < now_num; i++){if (l_time[memory[i]] < min_time){min_time = l_time[memory[i]];min_num = i;}}flag[a] = true;//将当前访问的页“是否在内存中”的标记设为1flag[memory[min_num]] = 0; //将被替换的页“是否在内存中”的标记设为0memory[min_num] = a;//当前页替换最久未使用过的页}else //内存未满{flag[a] = true;memory[now_num] = a; //当前页进入内存的下一个位置now_num++;//内存中页的个数加1}}else{miss[now_time] = 0; //标记:未缺页}//保存内存中页面的序列for (int i = 0; i < n; i++){state[now_time][i] = memory[i];}l_time[a] = now_time; //更新当前页的被访问时间为当前时间now_time++;//访问完一个页面,当前时间加1return;}void display(){//输出表头cout << "|访问|";int left = n - n / 2 - 1;int right = n / 2;while (left--)cout << "";cout << "序列";while (right--)cout << "";cout