int memory[1001]; //记录进程内存中的页 bool flag[1001]; //标记:访问的页面是否在内存中 int l_time[1001]; //记录页面的最近使用时间 int vis[1001]; //记录访问序列 bool miss[1001]; //记录每次访问的缺页状态 int state[1001][1001]; //记录每次访问后的进程的内存页面状态
整型变量
1 2 3 4 5
int n; //进程内存的页块数 int now_num = 0; //进程内存当前的页个数 int now_time = 0; //当前时间(访问次数) int m; //页面访问序列的长度 int miss_num = 0; //缺页次数
#include<iostream> #include<queue> #include<iomanip> 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]; //记录每次访问后的进程的内存页面状态
//初始化 voidinit() { cout << "请输入分配给该进程的页块数:"; cin >> n; cout << "请输入页面访问序列的长度:"; cin >> m; cout << "请输入访问序列:"; for (int i = 0; i < m; i++) { cin >> vis[i]; } //进程的内存中刚开始没有页,初始化为-1 for (int i = 0; i < n; i++) { memory[i] = -1; } //在内存中的标记初始化为false for (int i = 0; i < 1000; i++) { flag[i] = false; } //页面的最近使用时间初始化为0 for (int i = 0; i < 1000; i++) { l_time[i] = 0; } return; }
//LRU算法 voidLRU(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; //将当前访问的页“是否在内存中”的标记设为1 flag[memory[min_num]] = 0; //将被替换的页“是否在内存中”的标记设为0 memory[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++; //访问完一个页面,当前时间加1 return; }
voiddisplay() { //输出表头 cout << "|访问|"; int left = n - n / 2 - 1; int right = n / 2; while (left--) cout << " "; cout << "序列"; while (right--) cout << " "; cout << "|是否缺页|" << endl; for (int i = 0; i < m; i++) { cout << "|" << setw(4) << vis[i] << "|"; for (int j = 0; j < n; j++) { if (state[i][j] != -1) cout << setw(4) << state[i][j]; else cout << " "; } if (miss[i] == 1) //输出“是”和“否”比较丑 cout << "| 1 |" << endl; else cout << "| 0 |" << endl; } cout << "缺页次数:" << miss_num << endl; miss_rate = (double)miss_num / m; cout << "缺页率:" << miss_num << "/" << m << "=" << setprecision(2) << miss_rate << endl; return; }
intmain() { init(); for (int i = 0; i < m; i++) { LRU(vis[i]); } display(); return0; }