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

实验四 存储器管理

一、     实验目的

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);
}



  • 0
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值