一、实验目的
通过模拟实现请求页式存储管理的几种基本页面置换算法,了解虚拟存储技术的特点,掌握虚拟存储请求页式存储管理中几种基本页面置换算法的基本思想和实现过程,并比较它们的效率。
二、实验内容与基本要求
基于一个虚拟存储区和内存工作区,设计下述算法并统计计算缺页次数、置换次数、缺页率。
1.最近最久未使用算法(LRU)
2.简单时钟(钟表)算法(CLOCK)
三、实验报告内容
- (1)最近最久未使用算法(LRU)基本原理
每次淘汰的页面都是最近最久未使用的页面
实现方法:赋予每个页面对应的页表项中,用访问字段记录该页面自上次被访问以来所经历的时间t。当需要淘汰一个页面时,选择现有页面中t值最大的,即最近最久未使用的页面。
- (2)简单时钟(钟表)算法(CLOCK)基本原理
为每个页面设置一个访问位,再将内存中的页面都通过链接指针链接成一个循环队列。当某页被访问时,其访问位置为1。当需要淘汰一个页面时,只需检查页的访问位。如果是0,就选择该页换出;如果是1,则将它置为0,暂不换出,继续检查下一个页面,若第一轮扫描中所有页面都是1,则将这些页面的访问位依次置为0后,再进行第二轮扫描(第二轮扫描中一定会有访问位为0的页面,因此简单的CLOCK算法选择一个淘汰页面最多会经过两轮扫描
四、代码实现
(1)最近最久未使用算法(LRU)
#include<stdio.h>
#include<stdlib.h>
typedef struct lru{
int yehao;//页号
int kuaihao;//内存块号
int time;//上次访问时间
} lru;
int qi;//请求的号
int kuaishu;//系统块数
int yyk;//用了的块数
int a, b, c;
int Qfind(lru *l,int n){
for (int i = 1; i <= yyk;i++){
if(l[i].yehao==n) return i;
}
return yyk+1;
}
int mint(lru *l){
l[0].time = 775000;
int ans = 0;
for (int i = 1; i <= yyk;i++){
if(l[i].time<l[ans].time)
ans = i;
}
return ans;
}
void print(lru *l){
for (int i = 1; i <= yyk;i++)
printf("%d ", l[i].yehao);
for (int i = yyk + 1; i <= kuaishu; i++)
printf("# ");
printf("\n");
}
int main(){
kuaishu = 4;
lru lQ[kuaishu+1];
yyk = 0;
int time = 0;
printf("请输入请求队列:\n");
while(scanf("%d", &qi)&&qi){
++time;
int n = Qfind(lQ, qi);
if(n>yyk){//不在内存,缺页
if(yyk<kuaishu){//分配空间
yyk++;
}else{//置换
n = mint(lQ);
b++;
}
lQ[n].yehao = qi;
lQ[n].kuaihao = n;
lQ[n].time = time;
a++;
}else{//修改时间
lQ[n].time = time;
}
c++;
print(lQ);
}
printf("缺页次数:%d\n置换次数:%d\n缺页率:%.1f\%\n", a, b, (float)a / c*100);
}
//1 8 1 7 8 2 7 2 1 8 3 8 2 1 3 1 7 1 3 7 0
(2)简单时钟(钟表)算法(CLOCK)
#include<stdio.h>
#include<stdlib.h>
typedef struct clock{
int yehao;//页号
int kuaihao;//内存块号
int fangwen;
struct clock *next;
} clock;
clock *Q;
clock *p, *q;
int qi;//请求的号
int a, b, c;
int flag;
clock temp[5] = {
{5, 1, 0}, {6, 2, 1},
{3, 3, 0}, {4, 4, 0}, {7, 5, 1}};
clock* Qfind(int qi){
p = q = Q;
do{
if(p->yehao==qi){
return p;
}
p = p->next;
} while (p != q);
return NULL;
}
clock* zhihuan(){
p = q = Q;
do{
if(p->fangwen==0){
Q = p->next;
return p;
}
p->fangwen = 0;
p = p->next;
} while (p != q);
Q = Q->next;
return p;
}
void print(int f){
printf("请求号:%d 缺页:", qi);
if(f)printf("√");
printf("\n");
p = q = Q;
do{
printf("%d ", p->yehao);
p = p->next;
} while (p != q);
printf("\n");
}
int main(){
Q = &temp[0];
for (int i = 0; i < 5;i++)
temp[i].next = &temp[(i + 1)%5];
printf("请输入请求队列:\n");
while(scanf("%d",&qi)&&qi){
flag = 0;
p = Qfind(qi);
if(p){
p->fangwen = 1;
}else{//缺页
flag = 1;
p = zhihuan();
p->yehao = qi;
p->fangwen = 1;
b++;
a++;
}
c++;
print(flag);
}
printf("缺页次数:%d\n置换次数:%d\n缺页率:%.1f\%\n", a, b, (float)a / c*100);
}
//1 3 4 2 5 6 3 4 7 0
五、实验结果