采用多道程序思想设计一个程序,模拟页存储管理地址变换的过程,可采用FIFO、LRU、LFU、OPT四页面置换算法

采用多道程序思想设计一个程序,模拟页存储管理地址变换的过程,可采用FIFO、LRU、LFU、OPT四页面置换算法。基本要求如下:
(1)需要建立访问页表线程、访问快表线程、缺页中断处理线程、访问内存线程等,协同这些线程模拟完成地址变换的过程。
(2)输入一个逻辑页面访问序列和随机产生逻辑页面访问序列,分别由四个算法完成页面置换;
(3)能够设定驻留内存页面的个数、内存的存取时间、缺页中断的时间、快表的时间,并提供合理省缺值,可以暂停和继续系统的执行;
(4)能够设定页号序列中逻辑页面个数和范围;
(5)能够设定有快表和没有快表的运行模式;
(6)提供良好图形界面,同时能够展示四个算法运行的结果;
(7) 给出每种页面置换算法每个页面的存取时间;
(8) 能够将每次的实验输入和实验结果存储起来,随时可查询;
(9) 完成多次不同设置的实验,总结实验数据,看看能得出什么结论。

#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);
/*主函数*/
void main()
{
    int i,k,code;
	system("color 0A");
	designBy();
	printf("┃请按任意键进行初始化操作...                       ┃\n");
	printf("┗━━━━━━━━━━━━━━━━━━━━━━━━━┛\n");
	printf(" >>>");
	getch();
	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("按任意键重新选择置换算法:>>>");
		getch();
		system("cls");
    }while (code!=4);
	getch();
}
/*载入数据*/
void download()
{
	int i;
	system("color 0D");
	printf("╔════════════╗\n");
	printf("║正在载入数据,请稍候 !!!║\n");
	printf("╚════════════╝\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载入成功,按任意键进入置换算法选择界面:>>>");
	getch();
}
/*设置延迟*/
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("┃                学号:081001117                   ┃\n");
	printf("┃                  姓名:邢磊      <Visual C++ 6.0>┃\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);
}

完整实验报告下载地址
我上传到资料里面有 。

  • 5
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
本文采用多道程序思想设计一个程序,模拟页式存储管理fifolrulfuopt四个页面置换算法。 首先,我们需要定义一些必要的数据结构和变量,如页表、页面队列和访问记录等。页表用于记录每个页面的信息,包括页面号和在内存中的位置。页面队列用于记录内存中的页面,并按照页面的访问顺序进行排列。访问记录用于记录每个页面的访问次数或者最近访问的时间戳。 接下来,我们需要实现四个页面置换算法。首先是fifo算法,它按照页面的进入顺序进行置换,即先进入内存的页面先被置换出去。实现fifo算法时,我们只需要维护一个页面队列即可。 其次是lru算法,它通过维护页面的访问顺序来进行置换,即最近最少使用的页面先被置换出去。实现lru算法时,我们可以使用一个页面队列和一个访问记录来实现。 第三个是lfu算法,它根据页面的访问次数来进行置换,即访问次数最少的页面先被置换出去。实现lfu算法时,我们需要维护一个页面队列和一个访问记录。 最后是opt算法,它根据未来的访问情况来进行置换,即未来最长时间不会被访问的页面先被置换出去。实现opt算法时,我们需要维护一个页面队列和一个访问记录,并根据未来的访问情况来更新访问记录。 综上所述,本文使用多道程序思想设计了一个模拟页式存储管理fifolrulfuopt四个页面置换算法程序。通过实现相应的数据结构和算法,我们可以模拟和比较不同页面置换算法的效果和性能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

gitupmen

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值