操作系统实验存储器管理页面置换算法

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

#include<conio.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<time.h>
#define bsize 0
#define psize m
typedef struct Page
{
int num; /*记录页面号*/
int time; /*记录调入内存时间*/
}Page;
Page b[bsize]; /*内存单元数*/
int c[bsize][psize]; /*暂保存内存当前的状态:缓冲区*/
int queue[100]; /*记录调入队列*/
int K; /*调入队列计数变量*/
int clear_period=5;
int phb[bsize]={0}; /*物理块*/
int pro[psize]={0}; /*进程号*/
int flag[bsize]={0}; /*进程等待次数(存放最久未被使用的进程标志)*/ int i=0,j=0,k=0; /*i表示进程序列号,j表示物理块号*/
int m=-1,n=-1; /*物理块空闲和进程是否相同判断标志*/
int max=-1,maxflag=0; /*标记替换物理块进程下标*/
int count=0; /*统计页面缺页次数*/
int* build()
{
for(i=0;i<psize;i++)
{
pro[i]=rand()%10+1;
printf("%d ",pro[i]);
}
printf("\n");
return(pro);
}
/*寻找未使用的物理块*/
int searchpb()
{
for(j=0;j<bsize;j++)
{
if(phb[j]==0)
{
m=j;
return m;
break;
}
}
return -1;
}
/*判断进程是否已经在物理块中*/ int searchpro()
{
for(j=0;j<bsize;j++)
{
if(phb[j]==pro[i])
{
n=j;
return j;
}
}
return -1;
}
/*清空物理块和错误次数*/
void empty()
{
for(i=0;i<bsize;i++)
phb[i]=0;
count=0;
}
void FIFO()
{
for(i=0;i<psize;i++)
printf("%d ",pro[i]);
printf("\n\n");
for(i=0;i<psize;i++)
{
m=searchpb();
for(j=0;j<bsize;j++)
{
if(flag[j]>maxflag)
{
maxflag=flag[j];
max=j;
}
}
if(n==-1) /*不存在相同进程*/
{
if(m!=-1) /*存在空闲物理块*/
{
phb[m]=pro[i];
count++;
flag[m]=0;
for(j=0;j<=m;j++) /*已经进入的flag加1,刚进的为1*/
{
flag[j]++;
}
m=-1;
}
else /*不存在空闲物理块*/
{
phb[max]=pro[i];
flag[max]=0;
for(j=0;j<bsize;j++)
{
flag[j]++;
}
max=-1; /*恢复默认*/
maxflag=0;
count++; /*错误数*/
}
}
else /*存在相同的进程*/
{
n=-1;
}
for(j=0;j<bsize;j++)
{
printf("%d ",phb[j]);
}
}
printf("Page fault:%d\n",count);
printf("Page replacement:%d\n",count-bsize);
printf("Page default rate:%6.3f",(float)count/psize);
}
/*初始化内存单元、缓冲区*/
void Init(Page *b,int c[bsize][psize])
{
for(i=0;i<bsize;i++)
{
b[i].num=-1;
b[i].time=bsize-i-1;
}
for(i=0;i<bsize;i++)
for(j=0;j<psize;j++)
c[i][j]=-1;
}
/*取得在内存中停留最久的页面,默认状态下为最早调入的页面*/ int GetMax(Page *b)
{
int max=-1;
int tag=0;
for(i=0;i<bsize;i++)
{
if(b[i].time>max)
{
max=b[i].time;
tag=i;
}
}
return tag;
}
/*判断页面是否已在内存中*/
int Equation(int fold,Page *b)
{
int i;
for(i=0;i<bsize;i++)
{
if (fold==b[i].num)
return i;
}
}
/*LRU核心部分*/
void Lruu(int fold,Page *b)
{
int i;
int val;
val=Equation(fold,b);
if (val>=0) /*如果内存中已经存在进程fold*/
{
b[val].time=0;
for(i=0;i<bsize;i++)
if (i!=val)
b[i].time++;
}
else /*内存中没有进程fold,包括有空物理块的情况*/ {
K++;
val=GetMax(b);
b[val].num=fold;
b[val].time=0;
for(i=0;i<bsize;i++)
if(i!=val)
b[i].time++;
}
}
void LRU()
{
K=0;
Init(b,c);
for(j=0;j<psize;j++)
{
Lruu(pro[j],b);
for(i=0;i<bsize;i++)
c[i][j]=b[i].num;
}
for(i=0;i<bsize;i++)
{ for(j=0;j<psize;j++)
{
if(c[i][j]==-1)
printf("|%2c ",48); /*48是0,32是空格*/
else
printf("|%2d ",c[i][j]);
}
printf("|\n");
}
printf("\nThe number of page default: %6d\nPage default rate: %6.3f",K,(float)K/psize); }
void main()
{
int sel ;
do{
printf("0 exit\n");
printf("1 creat numbers of processes\n");
printf("2 FIFO\n");
printf("3 LRU\n");
printf("4 NUR\n");
printf("Please choose(0/1/2/3/4):");
scanf("%d",&sel);
switch(sel)
{
case 1:build();break;
case 3:printf("LRU\n");LRU();empty();printf("\n");break;
case 2:printf("FIFO\n");FIFO();empty();printf("\n");break;
case 4:printf("NUR\n");NUR();empty();printf("\n");break;
}
}while(sel。

相关文档
最新文档