介绍
1.理解虚拟内存管理下的 LRU 算法原理
这种算法的基本思想是,如果某一页被访问了,那么它很可能马上又被访问;反之,如
果某一页很长时间没有被访问,那么最近也不太可能会被访问。这种算法考虑了程序设计的局部性原理。其实质是,当需要置换一页时,选择在最近一段时间最久未使用的页面予以淘汰。
2.掌握近似 LRU 算法的原理,即 clock 算法 在存储分块表(或页表)中设一个“引用位”,当存储分块表中的某一页被访问时,该 位由硬件自动置 1,并由页面管理软件周期性把所有引用位置 0。这样,在一个时间周期 T 内,某些被访问过的页面其引用位为 1,而未被访问过的页面其引用位为 0。根据引用位的 状态来判别各页面最近的使用情况。当需要置换一页面时,选择其引用位为 0 的页。
3.用 C 语言编写程序采用 clock 算法实现下题中作业运行情况,要求程序运行后根据输 入物理块的个数,输出运用该算法后 F、f 的值。 在一个请求分页系统中,采用简单 clock 算法时,假如一个作业的页面走向为 4、3、2、1、4、3、5、4、3、2、1、5,当分配给该作业的物理块数 M 发生变化时, 访问过程中发生的缺页次数和缺页率为多少。
代码
/*
如果内存中有该页,那么访问位置1,指针指向该位置+1
如果内存中没有该页,那么顺着指针循环遍历
遇到访问位为1的置0,遇到访问位为0的置换页面,且指针+1。
*/
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
int n, m; //物理块个数、作业页面个数
int page[20]; //需要访问的页面
struct Mem { //内存
int pnum; //页面号
int visit; //访问位
}mem[10];
int idx = 1; //内存指针
int lack_cnt; //缺页次数
//输入一个页面号,返回内存中的位置,返回-1则没有
int find(int x) {
for(int i = 1; i <= n; i++) {
if(mem[i].pnum == x) return i;
}
return -1;
}
//输出当前内存的情况
void myprint() {
for(int i = 1; i <= n; i++)
cout << '|' << mem[i].pnum << "|" << mem[i].visit << '|' << '\t';
cout << endl;
}
int main() {
cout << "02 王鹏" << endl << endl;
cout << "请输入物理块的个数" << endl;
cin >> n;
cout << "请输入页面个数" << endl;
cin >> m;
cout << "请依次输入作业的页面走向" << endl;
for(int i = 1; i <= m; i++) cin >> page[i];
cout << endl;
//遍历页面
for(int i = 1; i <= m; i++) {
int j = find(page[i]);
if(j == -1) { //如果内存没有
lack_cnt++; //缺页次数++
while(1) {
//遇到访问位为1,置0
if(mem[idx].visit == 1) {
mem[idx].visit = 0;
}
else { //访问位为0,置换页面
mem[idx].pnum = page[i];
mem[idx].visit = 1;
break;
}
//指针循环遍历
idx++;
if(idx == n + 1) idx = 1;
}
}else { //内存中有,引用置1,指针定位
idx = j;
mem[idx].visit = 1;
}
idx++;
if(idx == n + 1) idx = 1;
cout << "当前页面" << page[i] << endl;
myprint();
}
cout << endl;
cout << "缺页次数:" << lack_cnt << '\t' << "缺页率:" << lack_cnt << '/' << m << endl;
return 0;
}
/*
4
12
4 3 2 1 4 3 5 4 3 2 1 5
6
12
4 3 2 1 4 3 5 4 3 2 1 5
*/
效果
当物理块个数为4时:
当物理块个数为6时: