操作系统实验 存储管理

操作系统实验 存储管理

1.运行环境 Dev5.6.1 
2.实验要求

#include<stdio.h>
#include<time.h>
#include<stdlib.h>
#include<stdbool.h>
#include<string.h>
/*
**指令结构体,
** int 指令号 [1-320];
** int 页号; 
*/
typedef struct Order
{
	int OrderNum;
	int PageNum;
}Order;

/*
**地址流 
*/
Order Command[321];

/*
**初始化地址流。 
*/ 
void InitAdd()
{
	int m1,m2;
	for(int i=0;i<320;)
	{
		m1=rand()%317;//m1 最大只能为 316. 
		Command[i++].OrderNum=m1+1;// 1-317; 
		m2=rand()%(m1+2);//2-318 
		Command[i++].OrderNum=m2+1;//319;
		Command[i++].OrderNum=(rand()%(318-m2))+m2+2;
	}
}

/*
**初始化页号 
*/ 
void BuildPageNum()
{
	for(int i=0;i<320;i++)
	{
		Command[i].PageNum=Command[i].OrderNum/10;
	}
}

/*
**输入算法号 
*/
void InPutChoiceNum(int *ChoiceNum)
{
	printf("There are algorithms in the program:\n");
	printf("\t1、Optimization algorithm\n");
	printf("\t2、Least recently used algorithm\n");
	printf("\t3、First in first out algorithm\n");
	printf("\t4、Least frequently used algorithm\n");
	printf("Select an algorithm number, please.\n");
	int temp;
	scanf("%d",&temp);
	while(temp<1||temp>4)
	{
		printf("there is not the algorithm int the program\n");
		printf("There are algorithms in the program:\n");
		printf("\t1、Optimization algorithm***********************\n");
		printf("\t2、Least recently used algorithm\n");
		printf("\t3、First in first out algorithm\n");
		printf("\t4、Least frequently used algorithm**************\n");
		printf("Select an algorithm number, please.\n");
		scanf("%d",&temp);
	}
	*ChoiceNum=temp;
}

void FIFO();
void LRU();
/*
**模拟函数 
*/
void simulation(int ChoiceNum)
{
	switch(ChoiceNum)
	{
		case 1:
			{
				//OPT();
				break;
			}
		case 2:
			{
				LRU();
				break;
			}
		case 3:
			{
				FIFO();
				break;
			}
		case 4:
			{
			//	LFU();
				break;
			}
		default:
			{
				printf("wrong\n");
			}
	}
}

/*
**最佳置换算法。 
*/
/*
void OPT()
{
	int msize;
	int Msize=32;
	for(msize=2;msize<=Msize;msize++)
	{
		int queue[33];
		int NowVisit=0;
		int NowSize=0;
		int LackPageTimes=0;
		double HitRate=0.0;
		queue[NowSize++]=Command[NowVisit++].PageNum;
		while(NowVisit<320)
		{
			bool m=false;
			for(int i=0;i<NowSize;i++)
			{
				if(queue[i]==Command[NowVisit].PageNum)
				{
					m=true;
					NowVisit++;
					break;
				}
			}
			if(m==false)
			{
				LackPageTimes++;
				if(NowSize<msize)
				{
					queue[NowSize++]=Command[NowVisit].PageNum;
				}
				else
				{
					int book[msize];
					memset(book,0,sizeof(book));
					int temp=NowVisit;
					int cout=1;
					int pos=-1;
					int flag=0;
					for(int j=temp;j<320;j++)
					{
						for(int k=0;k<msize;k++)
						{
							if(Command[j].Page==queue[k])
							{
								book[k]++;
								if(book[k]==1)
								{
									cout++;
									if(cout>=msize)
									{
										break;
									}
								}
								
							}
						}
						if(cout>=msize)
						{
							break;
						}
					}
					if(cout<msize)
					{
						for(int i=0;i<NowSize-1;i++)
						{
							
						}
					}
					for(int i=0;i<msize;i++)
					{
						if(book[i]==0)
						{
							pos=i;
							break;
						}
					}
					queue[pos]=Command[NowVisit].PageNum;
				}
				NowVisit++;
			}
		}
		HitRate=LackPageTimes/320.00;
		printf("LRU : 物理块为%4d时,缺页率为:%6.2lf\n",msize,HitRate); 
	} 
} */
/*
**最近最少使用算法 
*/
void LRU()
{
	int msize;
	int Msize=32;
	for(msize=2;msize<=Msize;msize++)
	{
		int queue[33];
		int NowVisit=0;
		int NowSize=0;
		int LackPageTimes=0;
		double HitRate=0.0;
		queue[NowSize++]=Command[NowVisit++].PageNum;
		while(NowVisit<320)
		{
			bool m=false;
			for(int i=0;i<NowSize;i++)
			{
				if(queue[i]==Command[NowVisit].PageNum)
				{
					m=true;
					NowVisit++;
					break;
				}
			}
			if(m==false)
			{
				LackPageTimes++;
				if(NowSize<msize)
				{
					queue[NowSize++]=Command[NowVisit].PageNum;
				}
				else
				{
					int min=NowVisit;//要置换的位置。找到最小的就是。 
					int temp=9999999;
					for(int j=0;j<msize;j++)
					{
						for(int k=NowVisit-1;k>=0;k--)
						{
							if(queue[j]==Command[k].PageNum)
							{
								temp=k;
								break;
							}
						}
						if(temp<min)
						{
							min=temp;
						}
					}
					int pos=NowVisit;
					for(int j=0;j<msize;j++)
					{
						if(queue[j]==Command[min].PageNum)
						{
							pos=j;
						}
					}
					queue[pos]=Command[NowVisit].PageNum;
				}
				NowVisit++;
			}
		}
		HitRate=LackPageTimes/320.00;
		printf("LRU : 物理块为%4d时,缺页率为:%6.2lf\n",msize,HitRate); 
	} 
}

/*
**先进先出算法 
*/
void FIFO()
{
	int msize;
	int Msize=32;
	for(msize=2;msize<=Msize;msize++)
	{
		int queue[321];
		int head=0,tail=0;
		int NowVisit=0;
		int LackPageTimes=0;
		double HitRate=0.0;
		queue[tail]=Command[NowVisit++].PageNum;
		tail++;
		while(NowVisit<320)
		{
			bool m=false;
			for(int i=head;i<tail;i++)
			{
				if(queue[i]==Command[NowVisit].PageNum)
				{
					m=true;
					NowVisit++;
					break;
				}
			}
			if(m==false)
			{
				LackPageTimes++;
				if(tail-head<msize)
				{
					queue[tail++]=Command[NowVisit].PageNum;
				}
				else
				{
					head++;
					queue[tail++]=Command[NowVisit].PageNum;
				}
				NowVisit++;
			}
		}
		HitRate=LackPageTimes/320.00;
		printf("FIFO: 物理块为%4d时,缺页率为:%6.2lf\n",msize,HitRate); 
	} 
}
/*
**主函数。 
*/
int main()
{
	printf("Start memory management.\n");
	printf("Producing address flow, wait for while, please.\n");
	srand(time(NULL));
	InitAdd();//生成地址流
	BuildPageNum();//生成页号。
	int  ChoiceNum;
	int next=1;
	char ch;
	while(next)
	{
		InPutChoiceNum(&ChoiceNum);
		simulation(ChoiceNum);
		printf("do you try again with anther algorithm(y/n)\n");
		fflush(stdin);
		ch=getchar();
		if(ch=='y'||ch=='Y')
		{
			next=1;
		}
		else if(ch=='n'||ch=='N')
		{
			next=0;
		}
		else
		{
			printf("input wrong (y/n).\n");
			next=0;
		}
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/wang_huizhang/article/details/80096333