操作系统实验 存储管理
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; }