您的位置:首页 > 编程语言

操作系统实验四 页面置换算法(fifo 算法代码------页面置换代码集合)

2016-06-14 23:13 344 查看
实验四 存储器管理
一、     实验目的

1.       理解连续存储管理方式的原理和分类。 

2.       理解离散存储管理方式的原理和分类。

3.       理解虚拟存储器的原理和分类。

4.       掌握动态分区分配的常用算法。

5.       掌握页式虚拟管理中常用页面置换算法。 

二、     实验设备

1.     安装windows或者linux操作系统的PC机

2.     C程序编译环境

三、     实验内容

用C语言编程模拟实现一种或多种动态分区分配算法或页面置换算法。常见的动态分区分配算法有最先适应算法、循环首次适应算法、最佳适应算法、最坏适应算法等,常见的页面置换算法有先进先出(FIFO)页面置换算法、最近最久未使用(LRU)置换算法、最少使用(LFU)置换算法等。

四、     实验要求

1.     上机编写并调试动态分区分配算法(或页面置换算法)的模拟程序。

2.     要把相应的程序代码及程序运行结果写入实验报告中。


 先进先出(FIFO)页面置换算法

#include "stdio.h"

#include "stdlib.h"

#include "math.h"

#include "conio.h"

#include "time.h"

#define TRUE 1

#define FALSE 0

#define NULL 0

#define total_instruction 20

#define total_vp 10

typedef struct

{ int pn,pfn;

}pv_type;

pv_type pv[10];

typedef struct pf_struct

{ int pn,pfn;

struct pf_struct *next;

}pf_type;

pf_type pf[20],*free_head,*busy_head,*busy_tail,*q;

int page[total_instruction];

int total_pf;

int count;

void initialiaze()

{ int i;

count=0;

for(i=0;i<total_vp;i++)

{ pv[i].pn=i;

pv[i].pfn=-1;

}

printf("请输入实页数目:");

scanf("%d",&total_pf);

for(i=0;i<=total_pf-1;i++)

{ pf[i].next=&pf[i+1];

pf[i].pfn=i+1;

pf[i].pn=-1;

}

pf[total_pf-1].next=NULL;

free_head=&pf[0];

printf("随机产生的页地址流为:\n");

for(i=0;i<total_instruction;i++)

{ page[i]=rand()%10;

printf("%2d",page[i]);

}

}

void FIFO()

{ int i,j;

pf_type *p;

q=busy_head=busy_tail=NULL;

for(i=0;i<=total_instruction-1;i++)

{ printf("\n第%d次执行:",i+1);

if(pv[page[i]].pfn==-1)

{ count+=1;

printf("缺页,缺页次数count=%d,",count);

if(free_head==NULL)

{

printf("实页%d中的页面%d将被置换出去",busy_head->pfn,busy_head->pn);

p=busy_head->next;

pv[busy_head->pn].pfn=-1;

free_head=busy_head;

free_head->next=NULL;

busy_head=p;

}

p=free_head->next;

free_head->next=NULL;

free_head->pn=page[i];

pv[page[i]].pfn=free_head->pn;

if(busy_tail==NULL)

busy_head=busy_tail=free_head;

else

{ busy_tail->next=free_head;

busy_tail=free_head;

}

free_head=p;

}

else printf("命中,缺页次数不变,仍为count=%d",count);

printf("\npfn pn");

for(j=0;j<=total_pf-1;j++)

{if(pf[j].pn!=-1)

printf("\n%d%8d",pf[j].pfn,pf[j].pn);

}

}

printf("\n先进先出算法的命中率为:%6.4f\n缺页总次数为%d\n",1-(float)count/20,count);

}

int main()

{

srand((unsigned)time(NULL));

initialiaze();

FIFO();

return 0;
<h2 style="text-align: center;">}
常见的页面置换算法有先进先出(FIFO)页面置换算法、最近最久未使用(LRU)置换算法、最少使用(LFU)置换算法等。</h2>


#include <stdio.h>
#include <stdlib.h>
/*È«¾Ö±äÁ¿*/
int mSIZE; /*ÎïÀí¿éÊý*/
int pSIZE; /*Ò³ÃæºÅÒýÓô®¸öÊý*/
static int memery[10]={0}; /*ÎïÀí¿éÖеÄÒ³ºÅ*/
static int page[100]={0}; /*Ò³ÃæºÅÒýÓô®*/
static int temp[100][10]={0}; /*¸¨ÖúÊý×é*/
/*Öû»Ëã·¨º¯Êý*/
void FIFO();
void LRU();
void OPT();
/*¸¨Öúº¯Êý*/
void print(unsigned int t);
void designBy();
void download();
void mDelay(unsigned int Delay);
/*Ö÷º¯Êý*/
int main()
{
int i,k,code;
system("color 0A");
designBy();
printf("©§Çë°´ÈÎÒâ¼ü½øÐгõʼ»¯²Ù×÷...                       ©§\n");
printf("©»©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¿\n");
printf(" >>>");
getchar();
system("cls");
system("color 0B");
printf("ÇëÊäÈëÎïÀí¿éµÄ¸öÊý(M<=10)£º");
scanf("%d",&mSIZE);
printf("ÇëÊäÈëÒ³ÃæºÅÒýÓô®µÄ¸öÊý(P<=100)£º");
scanf("%d",&pSIZE);
puts("ÇëÒÀ´ÎÊäÈëÒ³ÃæºÅÒýÓô®(Á¬ÐøÊäÈ룬ÎÞÐè¸ô¿ª)£º");
for(i=0;i<pSIZE;i++)
scanf("%1d",&page[i]);
download();
system("cls");
system("color 0E");
do{
puts("ÊäÈëµÄÒ³ÃæºÅÒýÓô®Îª£º");
for(k=0;k<=(pSIZE-1)/20;k++)
{
for(i=20*k;(i<pSIZE)&&(i<20*(k+1));i++)
{
if(((i+1)%20==0)||(((i+1)%20)&&(i==pSIZE-1)))
printf("%d\n",page[i]);
else
printf("%d   ",page[i]);
}
}
printf("* * * * * * * * * * * * * * * * * * * * * * *\n");
printf("* ÇëÑ¡ÔñÒ³ÃæÖû»Ëã·¨£º\t\t\t    *\n");
printf("* ----------------------------------------- *\n");
printf("* 1.ÏȽøÏȳö(FIFO)    2.×î½ü×î¾ÃδʹÓÃ(LRU) *\n");
printf("* 3.×î¼Ñ(OPT)         4.Í˳ö                *\n");
printf("* * * * * * * * * * * * * * * * * * * * * * *\n");
printf("ÇëÑ¡Ôñ²Ù×÷£º[ ]\b\b");
scanf("%d",&code);
switch(code)
{
case 1:
FIFO();
break;
case 2:
LRU();
break;
case 3:
OPT();
break;
case 4:
system("cls");
system("color 0A");
designBy(); /*ÏÔʾÉè¼ÆÕßÐÅÏ¢ºóÍ˳ö*/
printf("©§Ð»Ð»Ê¹ÓÃÒ³ÃæÖû»Ëã·¨ÑÝʾÆ÷!                       ©§\n");
printf("©»©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¿\n");
exit(0);
default:
printf("ÊäÈë´íÎó£¬ÇëÖØÐÂÊäÈ룺");
}
printf("°´ÈÎÒâ¼üÖØÐÂÑ¡ÔñÖû»Ëã·¨£º>>>");
getchar();
system("cls");
}while (code!=4);
getch();
return 0;
}
/*ÔØÈëÊý¾Ý*/
void download()
{
int i;
system("color 0D");
printf("¨X¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨[\n");
printf("¨UÕýÔÚÔØÈëÊý¾Ý£¬ÇëÉÔºò !!!¨U\n");
printf("¨^¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨a\n");
printf("Loading...\n");
printf("                                                  O");
for(i=0;i<51;i++)
printf("\b");
for(i=0;i<50;i++)
{
mDelay((pSIZE+mSIZE)/2);
printf(">");
}
printf("\nFinish.\nÔØÈë³É¹¦£¬°´ÈÎÒâ¼ü½øÈëÖû»Ë㷨ѡÔñ½çÃ棺>>>");
getchar();
}
/*ÉèÖÃÑÓ³Ù*/
void mDelay(unsigned int Delay)
{
unsigned int i;
for(;Delay>0;Delay--)
{
for(i=0;i<124;i++)
{
printf(" \b");
}
}
}
/*ÏÔʾÉè¼ÆÕßÐÅÏ¢*/
void designBy()
{
printf("©³©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©·\n");
printf("©§             ʵÑéËÄ£ºÒ³ÃæÖû»Ëã·¨                 ©§\n");
printf("©§                °à¼¶£º                            ©§\n");
printf("©§                  ÐÕÃû£ºÕÅͬѧ                    ©§\n");
printf("©Ç©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©Ï\n");
}
void print(unsigned int t)
{
int i,j,k,l;
int flag;
for(k=0;k<=(pSIZE-1)/20;k++)
{
for(i=20*k;(i<pSIZE)&&(i<20*(k+1));i++)
{
if(((i+1)%20==0)||(((i+1)%20)&&(i==pSIZE-1)))
printf("%d\n",page[i]);
else
printf("%d   ",page[i]);
}
for(j=0;j<mSIZE;j++)
{
for(i=20*k;(i<mSIZE+20*k)&&(i<pSIZE);i++)
{
if(i>=j)
printf(" |%d|",temp[i][j]);
else
printf(" | |");
}
for(i=mSIZE+20*k;(i<pSIZE)&&(i<20*(k+1));i++)
{
for(flag=0,l=0;l<mSIZE;l++)
if(temp[i][l]==temp[i-1][l])
flag++;
if(flag==mSIZE)/*Ò³ÃæÔÚÎïÀí¿éÖÐ*/
printf("    ");
else
printf(" |%d|",temp[i][j]);
}
/*ÿÐÐÏÔʾ20¸ö*/
if(i%20==0)
continue;
printf("\n");
}
}
printf("----------------------------------------\n");
printf("ȱҳ´ÎÊý£º%d\t\t",t+mSIZE);
printf("ȱҳÂÊ£º%d/%d\n",t+mSIZE,pSIZE);
printf("Öû»´ÎÊý£º%d\t\t",t);
printf("·ÃÎÊÃüÖÐÂÊ£º%d%%\n",(pSIZE-(t+mSIZE))*100/pSIZE);
printf("----------------------------------------\n");
}
/*¼ÆËã¹ý³ÌÑÓ³Ù*/
void compute()
{
int i;
printf("ÕýÔÚ½øÐÐÏà¹Ø¼ÆË㣬ÇëÉÔºò");
for(i=1;i<20;i++)
{
mDelay(15);
if(i%4==0)
printf("\b\b\b\b\b\b      \b\b\b\b\b\b");
else
printf("¦¨");
}
for(i=0;i++<30;printf("\b"));
for(i=0;i++<30;printf(" "));
for(i=0;i++<30;printf("\b"));
}
/*ÏȽøÏȳöÒ³ÃæÖû»Ëã·¨*/
void FIFO()
{
int memery[10]={0};
int time[10]={0}; /*¼Ç¼½øÈëÎïÀí¿éµÄʱ¼ä*/
int i,j,k,m;
int max=0; /*¼Ç¼»»³öÒ³*/
int count=0; /*¼Ç¼Öû»´ÎÊý*/
/*Ç°mSIZE¸öÊýÖ±½Ó·ÅÈë*/
for(i=0;i<mSIZE;i++)
{
memery[i]=page[i];
time[i]=i;
for(j=0;j<mSIZE;j++)
temp[i][j]=memery[j];
}
for(i=mSIZE;i<pSIZE;i++)
{
/*ÅжÏÐÂÒ³ÃæºÅÊÇ·ñÔÚÎïÀí¿éÖÐ*/
for(j=0,k=0;j<mSIZE;j++)
{
if(memery[j]!=page[i])
k++;
}
if(k==mSIZE) /*Èç¹û²»ÔÚÎïÀí¿éÖÐ*/
{
count++;
/*¼ÆËã»»³öÒ³*/
max=time[0]<time[1]?0:1;
for(m=2;m<mSIZE;m++)
if(time[m]<time[max])
max=m;
memery[max]=page[i];
time[max]=i; /*¼Ç¼¸ÃÒ³½øÈëÎïÀí¿éµÄʱ¼ä*/
for(j=0;j<mSIZE;j++)
temp[i][j]=memery[j];
}
else
{
for(j=0;j<mSIZE;j++)
temp[i][j]=memery[j];
}
}
compute();
print(count);
}
/*×î½ü×î¾ÃδʹÓÃÖû»Ëã·¨*/
void LRU()
{
int memery[10]={0};
int flag[10]={0}; /*¼Ç¼ҳÃæµÄ·ÃÎÊʱ¼ä*/
int i,j,k,m;
int max=0; /*¼Ç¼»»³öÒ³*/
int count=0; /*¼Ç¼Öû»´ÎÊý*/
/*Ç°mSIZE¸öÊýÖ±½Ó·ÅÈë*/
for(i=0;i<mSIZE;i++)
{
memery[i]=page[i];
flag[i]=i;
for(j=0;j<mSIZE;j++)
temp[i][j]=memery[j];
}
for(i=mSIZE;i<pSIZE;i++)
{
/*ÅжÏÐÂÒ³ÃæºÅÊÇ·ñÔÚÎïÀí¿éÖÐ*/
for(j=0,k=0;j<mSIZE;j++)
{
if(memery[j]!=page[i])
k++;
else
flag[j]=i; /*ˢиÃÒ³µÄ·ÃÎÊʱ¼ä*/
}
if(k==mSIZE) /*Èç¹û²»ÔÚÎïÀí¿éÖÐ*/
{
count++;
/*¼ÆËã»»³öÒ³*/
max=flag[0]<flag[1]?0:1;
for(m=2;m<mSIZE;m++)
if(flag[m]<flag[max])
max=m;
memery[max]=page[i];
flag[max]=i; /*¼Ç¼¸ÃÒ³µÄ·ÃÎÊʱ¼ä*/
for(j=0;j<mSIZE;j++)
temp[i][j]=memery[j];
}
else
{
for(j=0;j<mSIZE;j++)
temp[i][j]=memery[j];
}
}
compute();
print(count);
}
/*×î¼ÑÖû»Ëã·¨*/
void OPT()
{
int memery[10]={0};
int next[10]={0}; /*¼Ç¼ÏÂÒ»´Î·ÃÎÊʱ¼ä*/
int i,j,k,l,m;
int max; /*¼Ç¼»»³öÒ³*/
int count=0; /*¼Ç¼Öû»´ÎÊý*/
/*Ç°mSIZE¸öÊýÖ±½Ó·ÅÈë*/
for(i=0;i<mSIZE;i++)
{
memery[i]=page[i];
for(j=0;j<mSIZE;j++)
temp[i][j]=memery[j];
}
for(i=mSIZE;i<pSIZE;i++)
{
/*ÅжÏÐÂÒ³ÃæºÅÊÇ·ñÔÚÎïÀí¿éÖÐ*/
for(j=0,k=0;j<mSIZE;j++)
{
if(memery[j]!=page[i])
k++;
}
if(k==mSIZE) /*Èç¹û²»ÔÚÎïÀí¿éÖÐ*/
{
count++;
/*µÃµ½ÎïÀí¿ìÖи÷Ò³ÏÂÒ»´Î·ÃÎÊʱ¼ä*/
for(m=0;m<mSIZE;m++)
{
for(l=i+1;l<pSIZE;l++)
if(memery[m]==page[l])
break;
next[m]=l;
}
/*¼ÆËã»»³öÒ³*/
max=next[0]>=next[1]?0:1;
for(m=2;m<mSIZE;m++)
if(next[m]>next[max])
max=m;
/*ÏÂÒ»´Î·ÃÎÊʱ¼ä¶¼ÎªpSIZE,ÔòÖû»ÎïÀí¿éÖеÚÒ»¸ö*/
memery[max]=page[i];
for(j=0;j<mSIZE;j++)
temp[i][j]=memery[j];
}
else {
for(j=0;j<mSIZE;j++)
temp[i][j]=memery[j];
}
}
compute();
print(count);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: