最新计算机操作系统实验模拟比较页面置换页算法及缺页率(1)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
计算机操作系统实验
模拟比较页面置换页算法及缺页率
学号200510020220
姓名乔峰
班级信息052
实验名称: 模拟比较页面置换页算法及缺页率
实验目的:(1)掌握先进先出页面置换算法;
(2)掌握最近未用页面置换算法;
(3)了解最近最久未使用页面置换算法以及其他页面置换算法;
(4)熟悉C/C++编程。
实验学时:6学时
实验内容:编写程序,设置不同的页面数,使用不同的页面替换策略算法进行模拟页面替换。
先进先出,最近未用页面置换算法等,并计算缺页
率。
实验环境:
(1).PC微机
(2).Windows 操作系统
(3).C/C++开发环境
实验原理及算法参考程序段:
#include <conio.h>
#include <stdio.h>
#include <dos.h>
#include <stdlib.h>
#include <math.h>
int add[256]/*地址*/,page[256]/*页面*/;
int k,j,ram,t;
float rate;/*缺页率*/
struct s1
{ int page;
int free;
int tag;
} fifo[33],opt[33],lru[33];
struct s2
{ int time;
};
void address();
float FIFO(int ram);/*先进先出*/
float LRU(int ram);/*最近最久未使用页面置换*/
void address() /*产生指令地址*/
{ int i;
add[0]=1000;
for (i=1; i<=255; i++)
{ int x=random(1024);
if ((x>=0)&&(x<512))
add[i]=add[i-1]+1;
if ((x>=512)&&(x<768))
add[i]=random(add[i-1]-1)+1;
if ((x>=768)&&(x<1024))
add[i]=add[i-1]+random(30*1024-add[i-1]-1)+1; }
}
float FIFO(int ram)
{ int absent=0,t=0,i,z,l,yn;
for (i=0; i<ram; i++)
{ fifo[i].page=-1;
fifo[i].free=1;
fifo[i].tag=0;
}
i=0;
while (i<j)
{ yn=0;
for (z=0; z<ram; z++) /*the page is in the ram?*/
if (fifo[z].page==page[i])
{yn=1;
for (z=0; z<ram; z++)
if (fifo[z].free==0)
fifo[z].tag+=1;
}
if (yn!=1)
{ absent+=1; /*count the absent page*/
l=0;
while ((l<ram)&&(fifo[l].free==0))
l++;
if ((l<ram)&&(fifo[l].free==1)) /*any free ram?*/
{ fifo[l].page=page[i];
fifo[l].free=0;
for (l=0; l<ram; l++)
if (fifo[l].free==0 )
fifo[l].tag+=1;
}
else /*there is no free ram*/
{ t=0;
for (l=0; l<ram; l++)
if ( fifo[l].tag<fifo[t].tag)
t=l;
fifo[t].page=page[i];
fifo[t].free=0;
fifo[t].tag=1;
l=0;
}
}
i++;
}
rate=(float)absent/j*100;
return rate;
}
float LRU(int ram)
{ int absent=0,yn,t,i,l,z,now=0;
struct s2 P[250];
for (i=0;i<j;i++)
P[i].time=0;
for (i=0; i<ram; i++)
{ lru[i].page=-1;
lru[i].free=1;
}
i=0;
while(i<j)
{ for(l=0; l<ram; l++)
yn=0;
{ for(z=0; z<ram; z++)
if (lru[z].page==page[i])
{ now+=1;
P[lru[z].page].time=now;
yn=1;
}
if (yn!=1)
{ absent+=1; now+=1;
l=0;
while ((l<=ram)&&(lru[l].free==0))
l++;
if ((l<=ram)&&(lru[l].free==1)) /*any free ram?*/
{ lru[l].page=page[i];
P[lru[l].page].time=now;
lru[l].free=0;
}
else /*there is no ram*/
{ t=0;
for (l=0; l<ram; l++)
if ( P[lru[l].page].time<P[lru[t].page].time)
t=l;
lru[t].page=page[i];
P[lru[t].page].time=now;
}
}
}
i++;
}
rate=(float)absent/j*100;
return rate;
}
void main()
{ int i,p[256];/*页号*/
clrscr();
address();
for (k=1; k<=8;) /*页面大小: 1k,2k,4k,8K*/
{ printf("the size of a page is %d k\n ",k);
printf("the page num is ...\n");
for (i=0; i<256; i++)
{p[i]=add[i]/(k*1024);/*将指令地址生成相应的页号*/
printf("%d ",p[i]);
}
j=0;
for (i=0; i<256; i++)
{ while (p[i]==p[i+1])
i++;
page[j]=p[i];
j++;
}
printf("\nafter connect the same pages the page num is:\n");
for (i=0; i<j; i++)
printf("%d ",page[i]);
printf("\n");
getch();
for (ram=1; ram<=32; ram++)
{ if (ram==10) getch();
printf("\nblock=%d pages= %d,absent rate: ",ram,j);
printf("FIFO=%0.2f%%",FIFO(ram));
printf("LRU =%0.2f%%",LRU(ram));
printf("OPT =%0.2f%%",OPT(ram));
}
k=k*2;
getch();
}
}
实验小结:
通过本次实验掌握了先进先出和最近最久未使用页面置换算法,同时也对其他的页面置换算法也更加熟悉。
在实验过程中熟悉了C语言的编程环境,并能够用C编程模拟比较也面置换算法,对编程也有一定的提高。
代码:
#include "stdio.h"
#include "stdlib.h"
#include "conio.h"
#include "ctype.h"
//定义页,采用双向链表存储结构
struct page
{
unsigned int number;//页号
unsigned int baseaddress;//页开始地址
//其它信息
struct page *nextpage,*priorpage;//下一页和前一页
};
//定义页表
struct pagetable
{
unsigned int pid;//进程号
unsigned int pagenum;//页表大小
unsigned int pagetablesize;//页表最大表目
struct page *head;//页表头指针,指向头结点,头结点指向第一页
};
//FIFO页面访问程序,函数调用时要传递过来页表pt,要访问的页面号accesspage,返回是否发生缺页中断(1是0否)
int access(struct pagetable *pt, unsigned int accesspage)
{
struct page *newpage;//新页面
struct page *currentpage=pt->head->nextpage;//当前页
struct page * replacedpage;//要淘汰的页
//在当前页中寻找要访问的页号
while(currentpage&¤tpage->number!=accesspage)
{
currentpage=currentpage->nextpage;
}
//找到页号则打印√,并返回0
if(currentpage!=NULL&¤tpage->number==accesspage)
{
printf("√");
return 0;
}
//没找到则判断页表是否已经满了,没满则调入新页并打印×返回1 else if(pt->pagenum<pt->pagetablesize)
{
newpage=(struct page *)malloc(sizeof(struct page));
newpage->number=accesspage;
newpage->nextpage=newpage->priorpage=NULL;
newpage->nextpage=pt->head->nextpage;
if(pt->head->nextpage)
{
pt->head->nextpage ->priorpage=newpage;
}
pt->head->nextpage=newpage;
newpage->priorpage=pt->head;
pt->pagenum++;
printf("×");
return 1;
}
//如页表已经满,则采用fifo算法进行淘汰选择
else
{
currentpage=pt->head->nextpage;
replacedpage=NULL;
while(currentpage->nextpage)
{
currentpage=currentpage->nextpage;
}
replacedpage=currentpage;
if(replacedpage->nextpage)
{
replacedpage->nextpage->priorpage=replacedpage->priorpage;
}
replacedpage->priorpage->nextpage=replacedpage->nextpage;
free(replacedpage);
newpage=(struct page *)malloc(sizeof(struct page));
newpage->number=accesspage;
newpage->nextpage=newpage->priorpage=NULL;
newpage->nextpage=pt->head->nextpage;
if(pt->head->nextpage)
{
pt->head->nextpage->priorpage=newpage;
}
pt->head->nextpage=newpage;
newpage->priorpage=pt->head;
printf("×");
return 1;
}
}
main()
{
struct pagetable pt;
unsigned int totalabsence=0,totalpagenum=10;
unsigned int restpage[100];
unsigned int i=0;
pt.pagenum=0;
pt.pagetablesize=3;
pt.head=(struct page*)malloc(sizeof(struct page));
pt.head->nextpage=pt.head->priorpage=NULL;
//从文件获取要读入的页面流
FILE *fp;
fp=fopen("IN.dat","r");
if(fp==NULL)
{printf("can not open file IN.DAT!");return;}
while(!feof(fp))
{
fscanf(fp,"%d",&restpage[i]);
i++;
}
fclose(fp);
totalpagenum=i;
printf("this program for fifo \n\n");
//打印要访问的页
for(i=0;i<totalpagenum;i++)
{
printf("%2d",restpage[i]);
}
printf("\n");
//调用函数访问页
for(i=0;i<totalpagenum;i++)
{
totalabsence+=access(&pt,restpage[i]);
}
printf("\nabsence times:%d\ntotal access times:%d\nabsence ratio:%.2f%%\n",totalabsence,totalpagenum,totalabsence*100.0/totalpagenum);
getchar();
}。