操作系统C语言实现计算FIFO,LRU,OPT,LFU,NUR缺页率
修改 “计算机操作系统教程第四版习题解答与实验指导 ” 中实验三置换算法存在的bug
该程序是比较这5种页面置换算法的缺页率
设定320个页面,模拟这五种算法,计算缺页次数和缺页率,比较这五种算法哪种置换更好
1.先进先出置换算法(FIFO):是最简单的页面置换算法。这种算法的基本思想是:当需要淘汰一个页面时,总是选择驻留主存时间最长的页面进行淘汰,即先进入主存的页面先淘汰。其理由是:最早调入主存的页面不再被使用的可能性最大。
2.最佳置换算法(OPT)(理想置换算法):从主存中移出永远不再需要的页面;如无这样的页面存在,则选择最长时间不需要访问的页面。于所选择的被淘汰页面将是以后永不使用的,或者是在最长时间内不再被访问的页面,这样可以保证获得最低的缺页率。
3.最近最久未使用(LRU)算法:这种算法的基本思想是:利用局部性原理,根据一个作业在执行过程中过去的页面访问历史来推测未来的行为。它认为过去一段时间里不曾被访问过的页面,在最近的将来可能也不会再被访问。所以,这种算法的实质是:当需要淘汰一个页面时,总是选择在最近一段时间内最久不用的页面予以淘汰。
4.最近最少使用(LFU):基于“如果一个数据在最近一段时间内使用次数很少,那么在将来一段时间内被使用的可能性也很小”的思路。LFU是基于访问次数的。
5.最近未使用(NUR)
缺页率 = 1 - 缺页次数/页面数
运行结果
引入头文件、定义常数值、结构体、函数声明
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <unistd.h>
#define TRUE 1
#define FALSE 0
#define INVALID -1
#define total_instruction 320
#define total_vp 32
#define clear_period 50
typedef struct
{
int pn, pfn, counter,time;
}pl_type;
pl_type pl[32];
typedef struct pfc_struct
{
int pn,pfn;
struct pfc_struct *next;
}pfc_type;
pfc_type pfc[32],*freepf_head, *busypf_head,*busypf_tail;
int diseffect=0, a[total_instruction];
int page[total_instruction],offset[total_instruction];
void initialize();
void FIFO();
void LRU();
void OPT();
void LFU();
void NUR();
initialize函数
void initialize(total_pf)
int total_pf;
{
int i;
diseffect=0;
for(i=0;i<total_vp;i++){
pl[i].pn=i;
pl[i].pfn=INVALID;
pl[i].counter=0;
pl[i].time=-1;
}
for (i=0;i<total_pf-1;i++){
pfc[i].next=&pfc[i+1];
pfc[i].pfn=i;
}
pfc[total_pf-1].next=NULL;
pfc[total_pf-1].pfn=total_pf-1;
freepf_head=&pfc[0];
}
main()函数
void main(){
int s,i,j;
srand(10 * getpid());
s= (float)319 * rand()/32767/32767/2+1;
for(i=0;i<total_instruction;i+=4)
{
if (s<0)
{
printf("When i==%d,Error,s==%d\n",i,s);
exit(0);
}
a[i]=s;
a[i+1]=a[i]+1;
a[i+2]= (float)a[i] * rand()/32767/32767/2;
a[i+3]=a[i+2]+1;
s=(float)(318-a[i+2]) * rand()/32767/32767/2+a[i+2]+2;
//if((a[i+2]<318))
//printf("a[%d+ 2],a number which is:%d and s==%d\n",i,a[i+2],s);
}
for (i=0;i<total_instruction;i++)
{
page[i]=a[i]/10;
offset[i]=a[i]%10;
}
for(i=4;i<=32;i++)
{
printf("%2d page frames: ",i);
FIFO(i);
LRU(i);
OPT(i);
LFU(i);
NUR(i);
printf("\n");
}
}
FIFO函数
void FIFO(total_pf)
int total_pf;
{
int i,j;
pfc_type *p;
initialize(total_pf);
busypf_head= busypf_tail=NULL;
for(i=0;i<total_instruction;i++){
if(pl[page[i]].pfn==INVALID){
diseffect+=1;
if(freepf_head==NULL){
p=busypf_head->next;
pl[busypf_head->pn].pfn=INVALID;
freepf_head=busypf_head;
freepf_head->next=NULL;
busypf_head=p;
}
p=freepf_head->next;
freepf_head->next=NULL;
freepf_head->pn=page[i];
pl[page[i]].pfn= freepf_head->pfn;
if (busypf_tail==NULL)
busypf_head=busypf_tail=freepf_head;
else{
busypf_tail->next=freepf_head;
busypf_tail=freepf_head;
}
freepf_head=p;
}
}
printf("FTFO:%6.4f,diseffect:%3d\t\t",1-(float)diseffect/320,diseffect);
}
LRU函数
void LRU(total_pf)
int total_pf;
{
int min,minj,i,j,present_time;
initialize(total_pf);
present_time=0;
for(i=0;i<total_instruction;i++)
{
if(pl[page[i]].pfn==INVALID){
diseffect++;
if(freepf_head==NULL){
min=32767;
for(j=0;j<total_vp;j++)
if (min> pl[j].time&&pl[j].pfn!=INVALID){
min=pl[j].time;
minj=j;
}
freepf_head=&pfc[pl[minj].pfn];
pl[minj].pfn=INVALID;
pl[minj].time=-1;
freepf_head->next= NULL;
}
pl[page[i]].pfn=freepf_head->pfn;
pl[page[i]].time=present_time;
freepf_head=freepf_head->next;
}
else
pl[page[i]].time=present_time;
present_time++;
}
printf("LRU:%6.4f,diseffect:%3d\t\t",1-(float)diseffect/320,diseffect);
}
NUR函数
void NUR(total_pf)
int total_pf;
{
int i,j,dp,cont_flag,old_dp;
pfc_type *t;
initialize(total_pf);
dp=0;
for (i=0;i<total_instruction;i++){
if (pl[page[i]].pfn== INVALID){
diseffect++;
if (freepf_head==NULL){
cont_flag= TRUE;
old_dp=dp;
while(cont_flag)
if (pl[dp].counter== 0&&pl[dp].pfn!=INVALID)
cont_flag= FALSE;
else{
dp++;
if (dp==total_vp)
dp=0;
if (dp==old_dp){
for(j=0;j<total_vp;j++)
pl[j].counter=0;
}
}
freepf_head=&pfc[pl[dp].pfn];
pl[dp].pfn=INVALID;
freepf_head->next=NULL;
}
pl[page[i]].pfn=freepf_head->pfn;
freepf_head=freepf_head->next;
}
else
pl[page[j]].counter=1;
if(i%clear_period==0)
for(j=0;j<total_vp;j++)
pl[j].counter=0;
}
printf("NUR:%6.4f,diseffect:%3d\t\t",1-(float)diseffect/320,diseffect);
}
OPT函数
void OPT(total_pf)
int total_pf;
{
int i,j, max, maxpage,d,dist[total_vp];
pfc_type *t;
initialize(total_pf);
for(i=0;i<total_instruction;i++)
{
if(pl[page[i]].pfn==INVALID){
diseffect++;
if(freepf_head==NULL){
for(j=0;j<total_vp;j++)
if(pl[j].pfn!=INVALID)
dist[j]=32767;
else
dist[j]=0;
d=1;
for(j=i+ 1;j<total_instruction;j++){
if(pl[page[j]].pfn!=INVALID)
dist[page[j]]=d;
d++;
}
max=-1;
for (j=0;j<total_vp;j++)
if (max<dist[j]){
max=dist[j];
maxpage=j;
}
freepf_head=&pfc[pl[maxpage].pfn];
freepf_head->next=NULL;
pl[maxpage].pfn= INVALID;
}
pl[page[i]].pfn=freepf_head->pfn;
freepf_head= freepf_head->next;
}
}
printf ("OPT:%6.4f,diseffect:%3d\t\t",1- (float)diseffect/320,diseffect);
}
LFU函数
void LFU(total_pf)
int total_pf;
{
int i, j,min,minpage;
pfc_type *t;
initialize(total_pf);
for (i=0;i<total_instruction;i++)
{
if (pl[page[i]].pfn==INVALID){
diseffect++;
if (freepf_head==NULL){
min=32767;
for (j=0;j<total_vp;j++){
if (min>pl[j].counter&&pl[j].pfn!=INVALID){
min=pl[j].counter;
minpage=j;
}
pl[j].counter=0;
}
freepf_head=&pfc[pl[minpage].pfn];
pl[minpage].pfn=INVALID;
freepf_head->next=NULL;
}
pl[page[i]].pfn=freepf_head->pfn;
freepf_head=freepf_head->next;
pl[page[i]].counter++;
}
else
pl[page[i]].counter++;
}
printf("LFU:%6.4f,diseffect:%3d\t\t",1-(float)diseffect/320,diseffect);
}
运行结果