资源描述
实验原理:
在内存运行过程中,若其所要访问得页面不在内存而需要把她们调入内存,但内存已经没有空闲空间时,为了保证该进程能正常运行,系统必须从内存中调出一页程序或数据送磁盘得对换区中。但应将那个页面调出,需根据一定得算法来确定.通常,把选择换出页面得算法成为页面置换算法.置换算法得好坏,将直接影响到系统得性能。
一个好得页面置换算法,应具有较低得页面更换频率.从理论上讲,应将那些以后不再会访问得页面置换出,或者把那些在较长时间内不会在访问得页面调出.目前存在着许多种置换算法(如FIFO,OPT,LRU),她们都试图更接近理论上得目标。
实验目得:
1.熟悉FIFO,OPT与LRU算法
2.比较三种算法得性能优劣
实验内容:
写出FIFO,OPT与LRU算法得程序代码,并比较它们得算法性能.
实验步骤:
代码如下:
#include <stdio、h>
#define M 4 //物理页数
#define N 20ﻩ//需要调入得页数
typedef struct page
{
int num;
int time;
}Page; ﻩ//物理页项,包括调入得页号与时间
Page mm[M]; //4个物理页
int queue1[20],queue2[20],queue3[20];ﻩ//记录置换得页
int K=0,S=0,T=0;ﻩ//置换页数组得标识
int pos=0;//记录存在最长时间项
//初始化内存页表项及存储内存情况得空间
void INIT(){
int i;
for(i=0;i<M;i++){
ﻩmm[i]、num =-1;
ﻩﻩmm[i]、time =0;
}
}
//取得内存中存在时间最久得位置
int GetMax(){
ﻩint max=—1;
int i;
for(i=0;i〈M;i++){
ﻩﻩif(mm[i]、time 〉 max){
ﻩmax=mm[i]、time ;
ﻩ pos=i;
ﻩ}
}
ﻩreturn pos;
}
//检查最长时间不使用页面
int longesttime(int fold)
{
ﻩint i;
int max=-1;
ﻩfor(i=fold;i〈N;i++){
ﻩﻩif(mm[0]、num!=i){
ﻩmm[0]、time++;
}ﻩ
ﻩﻩif(mm[1]、num!=i){
ﻩﻩﻩmm[1]、time++;
ﻩ}ﻩ
ﻩﻩif(mm[2]、num!=i){
ﻩ mm[2]、time++;
ﻩﻩ}ﻩ
ﻩif(mm[3]、num!=i){
ﻩ mm[3]、time++;
ﻩ }ﻩ
}
for(i=0;i〈M;i++){
if(mm[i]、time>max){
ﻩ max=mm[i]、time;
ﻩﻩﻩpos=i;
ﻩ }
}
ﻩreturn pos;
}
//检查某页就是否在内存
int Equation(int fold){
int i;
for(i=0;i〈M;i++){
if(mm[i]、num == fold)
ﻩﻩreturn i;
ﻩ}
ﻩreturn -1;
}
//检查物理内存就是否已满,-1表满,其她不满
int Check(){
ﻩint i;
ﻩfor(i=0;i<M;i++){
if(mm[i]、num == -1)
ﻩ ﻩreturn i;
}
return —1;
}
//先进先出
void FIFO(int fold){
int i;
ﻩint a,b,c;
ﻩa=Equation(fold);
ﻩ//页已存在
if(a != -1){}
//页不存在
else{
ﻩb=Check();
//内存还有空闲
ﻩﻩif(b != -1){
mm[b]、num = fold;
ﻩﻩ}
ﻩﻩ//内存已满,需要置换
ﻩelse {
ﻩ c=GetMax();
ﻩ mm[c]、num = fold;
ﻩmm[c]、time = 0;
ﻩﻩ}
ﻩﻩqueue1[K++]=fold;
ﻩ}
for(i=0;i<M;i++){
ﻩif(mm[i]、num != —1){
ﻩﻩmm[i]、time ++;
}
ﻩ}
}
void OPT(int fold)
{
int a,b,c;
ﻩa=Equation(fold);
ﻩif(a == —1){//页不在内存
ﻩ b=Check();
//内存还有空闲
ﻩﻩif(b != -1){
ﻩ mm[b]、num = fold;
ﻩ}
ﻩﻩ//内存已满,需要置换
ﻩ else{
ﻩ c=longesttime(fold);
mm[c]、num = fold;
ﻩﻩ mm[c]、time = 0;
ﻩﻩ}
ﻩqueue3[T++]=fold;
}
}
void LRU(int fold)
{
ﻩint i;
int a,b;
int p;
ﻩa=Equation(fold);
if(a != —1)//页已在内存
{
ﻩ //把此项移动到链表最后一项
ﻩﻩif(a==3)//此项已经在最后,不需要做任何改动
ﻩ return;
ﻩﻩelse
ﻩﻩ{
ﻩ ﻩp=Equation(-1);
ﻩ if(p==-1)//链表就是满得
{
ﻩﻩ for(;a<3;a++)
ﻩ ﻩﻩﻩmm[a]、num=mm[a+1]、num;
ﻩﻩmm[3]、num=fold;
ﻩ }
ﻩﻩﻩelse if(p〈=3)//链表不满
ﻩ ﻩ{
ﻩ for(;a<p-1;a++)
ﻩ mm[a]、num=mm[a+1]、num;
ﻩﻩﻩ mm[a]、num=fold;
ﻩﻩ}
ﻩﻩ}
ﻩ}
else
ﻩ{
ﻩﻩb=Check();
ﻩﻩif(b!=-1)//不满
ﻩﻩ mm[b]、num=fold;
ﻩ else
{
ﻩﻩ for(i=0;i〈3;i++)
ﻩﻩﻩﻩmm[i]、num=mm[i+1]、num;
ﻩﻩﻩmm[3]、num=fold; ﻩﻩ
ﻩﻩ}
ﻩqueue2[S++]=fold;
ﻩ}
}
void main()
{
ﻩint A[N],B[N];
int i;
INIT();
printf(”请依次输入%d个页面号:\n",N);
for(i=0;i〈N;i++){
ﻩ scanf("%d",&A[i]);
ﻩ}
//FIFO
for(i=0;i<N;i++){
B[i]=A[i];
}
for(i=0;i<N;i++){
FIFO( B[i] );ﻩ ﻩ
ﻩ}
printf(”FIFO得");
printf("调入队列为:”);
ﻩfor(i=0;i<K;i++)
ﻩﻩprintf("%3d”,queue1[i]);
printf(”\n缺页次数为:%6d\n缺页率:%16。6f\n\n",K,(float)K/N);
//LRU
INIT();
ﻩfor(i=0;i<N;i++){
ﻩB[i]=A[i];
ﻩ}
for(i=0;i<N;i++){
ﻩLRU( B[i] ); ﻩ
ﻩ}
ﻩprintf("LRU得”);
ﻩprintf("调入队列为:");
ﻩfor(i=0;i<S;i++)
ﻩ printf("%3d",queue2[i]);
printf("\n缺页次数为:%6d\n缺页率:%16.6f\n\n”,S,(float)S/N);
//OPT
ﻩINIT();
for(i=0;i<N;i++){
ﻩB[i]=A[i];
}
for(i=0;i〈N;i++){
ﻩOPT( B[i] );
ﻩ}
ﻩprintf("OPT得");
ﻩprintf("调入队列为:”);
for(i=0;i<T;i++)
ﻩﻩprintf(”%3d”,queue3[i]);
ﻩprintf("\n缺页次数为:%6d\n缺页率:%16。6f\n\n”,T,(float)T/N);
}
展开阅读全文