操作系统实验4-请求分页存储管理模拟实验
请求分页存储管理(虚拟存储)
任务四、请求分页存储管理(虚拟存储)一、实验目的通过请求分页存储管理的设计,让学生了解虚拟存储器的概念和实现方法。
进行运行时不需要将所有的页面都调入内存,只需将部分调入内存,即可运行,在运行的过程中若要访问的页面不在内存时,则需求有请求调入的功能将其调入。
假如此时若内存没有空白物理块,则通过页面置换的功能将一个老的不用的页面淘汰出来,其中淘汰的算法有多种。
二、实验内容模拟仿真请求分页调度算法,其中淘汰的算法可选下列其一1、先进先出算法2、最近最久算法3、CLOCK算法三、实验代码#include<iostream>#include<vector>using namespace std;int n;typedef struct Queue{int time;int data;struct Queue *next;}Queue,*QueuePtr;typedef struct {QueuePtr front;QueuePtr rear;}LinkQueue;//fifo=======================================void InitQueue(LinkQueue &Q);void FiFoEnQueueRear(LinkQueue &Q,int e,vector<int> &v);void FiFoDeQueueFront(LinkQueue &Q);inline void PrintQueue(LinkQueue &Q);void FiFoFiFoDoQueueEarly(LinkQueue &Q,int a,vector<int> &v);void FiFoDoQueue(LinkQueue &Q,int a,vector<int> &v);inline int PanDuan(LinkQueue &Q,int a);inline int YeMianCount(LinkQueue &Q);void fifo();//lru=============================================void InitQueue(LinkQueue &Q);void EnQueueMid(LinkQueue &Q,int e,QueuePtr p,vector<int> &v);void EnQueueTheFist(LinkQueue &Q,int e);void PrintQueue(LinkQueue &Q);//void ZhiZhenInit(int n);void DoQueueEarly(LinkQueue &Q,int e,vector<int> &v);void EnQueueRear(LinkQueue &Q,int e,QueuePtr p,vector<int> &v);//void DeQueueFront(LinkQueue &Q);QueuePtr ZhiZhen(LinkQueue &Q,int e);void EnQueue(LinkQueue &Q,int e,vector<int> &v);//void DeQueue(LinkQueue &Q,QueuePtr p);int PanDuan(LinkQueue &Q,int a);int YeMianCount(LinkQueue &Q);void lru();QueuePtr OptimalZhiZhen(LinkQueue &Q,int e);//求出需要置换的页面的上一个页面的位置void EnQueue(LinkQueue &Q,int e,vector<int> &v,int i,vector<int> &vc);inline int YeMianCount(LinkQueue &Q);//使用内敛函数,提高性能inline int Destance(vector<int> &v,int i);inline void SubbDestance(LinkQueue &Q);//=================================================int main(){int k;for(;;){cout<<"请选择!"<<endl;cout<<"1——FiFo算法"<<endl;cout<<"2——LRU算法"<<endl;cout<<"0——退出"<<endl;cin>>k;if(k==0)break;else{switch(k){case 1:fifo();break;case 2:lru();break;default:cout<<" 请从以上的选择中选择一个选项!!"<<endl;}}}}//fifo========================================void InitQueue(LinkQueue &Q){Q.front=Q.rear=(QueuePtr)malloc(sizeof(Queue));if(!Q.front)cout<<"initqueue worng!"<<endl;Q.front->next=NULL;//return OK;}void FiFoEnQueueRear(LinkQueue &Q,int e,vector<int> &v){ QueuePtr p;p=(QueuePtr)malloc(sizeof(Queue));if(!p)cout<<"cannot malloc EnQueue of the p"<<endl;p->data=e;p->next=NULL;Q.rear->next=p;Q.rear=p;v.push_back(e);//cout<<p->data;//return OK;}void FiFoDeQueueFront(LinkQueue &Q){QueuePtr p;if(Q.front==Q.rear)cout<<"the Queue is empty,cannot delete !!"<<endl;p=Q.front->next;Q.front->next=p->next;free(p);if(Q.rear==p)Q.rear=Q.front;//return OK}void PrintQueue(LinkQueue &Q){QueuePtr p;if(Q.front==Q.rear)cout<<"the Queue is empty,cannot print!"<<endl;p=Q.front;for(p=Q.front;p->next!=NULL;p=p->next){cout<<p->next->data<<" ";}cout<<endl;//retrun OK;}void FiFoFiFoDoQueueEarly(LinkQueue &Q,int a,vector<int> &v){ QueuePtr p;int count=0;//设置标志位,记录重复的个数。
实验四 存储管理
存储管理1 实验目的:通过请求页式存储管理中页面置换算法模拟设计,了解虚拟存储技术的特点,掌握请求页式存储管理的页面置换算法。
2 实验内容:1)通过随机数产生一个指令序列,共320条指令;2)将指令序列变换为页面号;3)计算FIFO算法在分配不同内存块下的命中率。
(假设分配的内存块从4块至32块。
)<程序设计>设计一个虚拟存储区和内存工作区,使用FIFO算法计算访问命中率。
首先用Srand()和rand()函数定义和产生指令序列,然后将指令序列变换成相应的页面号,并针对FIFO算法计算相应的命中率。
命中率=1-缺页率相关定义如下:1.数据结构(1)页面类型结构pl_type中pn页号,pfn块号,counter为一个周期内访问页面次数,time为访问时间(2)页面控制结构中pfc[total_vp]定义用户进程虚页控制结构*freepf_head为空页面头的指针*busypf_head为忙页面头的指针*busypf_tail为忙页面尾的指针2.函数定义(1)void initialize():初始化函数,给每个相关的页面赋值(2)void FIFO():计算使用FIFO算法时的命中率3.变量定义(1)int a[total_instruction]:指令流数组(2)int page[total_instruction]:每条指令所属页号(3)int offset[total_instruction]:每页装入10条指令后取模运算页号偏移值(4)int total_pf:用户进程的内存块数(5)int diseffect:页面失效次数,即缺页次数[root@localhost ~]# cd wuxiaofeng[root@localhost wuxiaofeng]# pwd/root/wuxiaofeng[root@localhost wuxiaofeng]# cat >fifo.c#include <stdio.h>#include <stdlib.h>#include <sys/types.h>#include <unistd.h>#define TRUE 1#define FALSE 0#define INVALID -1#define NULL 0#define total_instruction 320 //指令流长#define total_vp 32 //虚页长#define clear_period 50 //清零周期typedef struct{ //定义页面类型int pn; //pn为页号int pfn; //pfn为块号int counter; //为一个周期内访问页面次数int time; //为访问时间}pl_type;pl_type pl[total_vp]; //页面结构数组struct pfc_struct{ //定义页面控制结构int pn,pfn;struct pfc_struct *next;};typedef struct pfc_struct pfc_type;pfc_type pfc[total_vp],*freepf_head,*busypf_head,*busypf_tail;[root@localhost wuxiaofeng]# cp www.c mmm.c//pfc[total_vp]定义用户进程虚页控制结构//*freepf_head为空内存块号的头指针//*busypf_head为忙内存块的头指针//*busypf_tail为忙内存块的尾指针int diseffect, a[total_instruction];int page[total_instruction], offset[total_instruction];//int a[total_instruction]:指令流数组//int page[total_instruction]:每条指令所属页号//int offset[total_instruction]:每页装入10条指令后取模运算页号偏移值//int diseffect:页面失效次数void initialize();void FIFO();main(){int S,i,j,temp;srand(getpid()*10); //由于每次运行时进程号不同,故可用来作为初始化[root@localhost wuxiaofeng]# cp www.c mmm.c随机数队列的“种子”S=(float)319*rand()/32767+1;for(i=0;i<total_instruction;i+=4) //产生指令队列{a[i]=S; //任选一指令访问点a[i+1]=a[i]+1; //顺序执行一条指令a[i+2]=(float)a[i]*rand()/RAND_MAX; //执行前地址指令m'a[i+3]=a[i+2]+1; //执行后地址指令S=(float)rand()*(318-a[i+2])/RAND_MAX+a[i+2]+2;}for(i=0;i<total_instruction;i++) //将指令序列变换成页地址流{page[i]=a[i]/10;offset[i]=a[i]%10;}for(i=4;i<=32;i++) //用户内存工作区从4个块到32个块{printf("%2d page frames",i);[root@localhost wuxiaofeng]# cp www.c mmm.cFIFO(i);printf("\n");}}void FIFO(total_pf)int total_pf; //用户进程的内存块数{int i,j;pfc_type *p,*t;initialize(total_pf); //初始化相关内存块控制用数据结构busypf_head=busypf_tail=NULL;for(i=0;i<total_instruction;i++){if(pl[page[i]].pfn==INVALID) //页面失效{diseffect+=1; // 失效次数if(freepf_head==NULL) //无空闲块{p=busypf_head->next;pl[busypf_head->pn].pfn=INVALID;freepf_head=busypf_head; //释放忙内存块队列中的第一个块freepf_head->next=NULL;busypf_head=p;[root@localhost wuxiaofeng]# cp www.c mmm.c}p=freepf_head->next; //按FIFO方式调新页面入内存块freepf_head->next=NULL;freepf_head->pn=page[i];pl[page[i]].pfn=freepf_head->pfn;if(busypf_tail==NULL)busypf_head=busypf_tail=freepf_head;else{busypf_tail->next=freepf_head;busypf_tail=freepf_head;}freepf_head=p;}}printf(" FIFO:%6.4f",1-(float)diseffect/320);}void initialize(total_pf) //初始化相关数据结构int total_pf; //用户进程的内存页面数{int i;diseffect=0;for(i=0;i<total_vp;i++){pl[i].pn=i;pl[i].pfn=INVALID; //置页面控制结构中的页号,页面为空pl[i].counter=0;pl[i].time=-1; //页面控制结构中的访问次数为0,时间为-1}for(i=1;i<total_pf;i++){pfc[i-1].next=&pfc[i];pfc[i-1].pfn=i-1; //建立pfc[i-1]和pfc[i]之间的连接}pfc[total_pf-1].next=NULL;pfc[total_pf-1].pfn=total_pf-1;freepf_head=&pfc[0]; //空页面队列的头指针为pfc[0]}[root@localhost wuxiaofeng]# lsa.out fifo.c[root@localhost wuxiaofeng]# /root/wuxiaofeng/a.out4 page frames FIFO:0.54065 page frames FIFO:0.56256 page frames FIFO:0.58137 page frames FIFO:0.59068 page frames FIFO:0.60629 page frames FIFO:0.612510 page frames FIFO:0.637511 page frames FIFO:0.656212 page frames FIFO:0.671913 page frames FIFO:0.681314 page frames FIFO:0.696915 page frames FIFO:0.715616 page frames FIFO:0.728117 page frames FIFO:0.750018 page frames FIFO:0.759419 page frames FIFO:0.771920 page frames FIFO:0.775021 page frames FIFO:0.781222 page frames FIFO:0.809423 page frames FIFO:0.843824 page frames FIFO:0.843825 page frames FIFO:0.843826 page frames FIFO:0.843827 page frames FIFO:0.850028 page frames FIFO:0.887529 page frames FIFO:0.893830 page frames FIFO:0.893831 page frames FIFO:0.893832 page frames FIFO:0.9000[root@localhost wuxiaofeng]#实验小结:通过本次实验,我收获很多。
实验四 操作系统存储管理实验报告
实验四 操作系统存储管理实验报告一、实验目的存储管理的主要功能之一是合理地分配空间。
请求页式管理是一种常用的虚拟存储管理技术。
本实验的目的是通过请求页式管理中页面置换算法模拟设计,了解虚拟存储技术的特点,掌握请求页式存储管理的页面置换算法。
二、实验内容(1) 通过计算不同算法的命中率比较算法的优劣。
同时也考虑了用户内存容量对命中率的影响。
页面失效次数为每次访问相应指令时,该指令所对应的页不在内存中的次数。
在本实验中,假定页面大小为1k ,用户虚存容量为32k ,用户内存容量为4页到32页。
(2) produce_addstream 通过随机数产生一个指令序列,共320条指令。
A 、 指令的地址按下述原则生成:1) 50%的指令是顺序执行的2)25%的指令是均匀分布在前地址部分3) 25%的指令是均匀分布在后地址部分B 、 具体的实施方法是:1)在[0,319]的指令地址之间随机选取一起点m ; 2) 顺序执行一条指令,即执行地址为m+1的指令;3) 在前地址[0,m+1]中随机选取一条指令并执行,该指令的地址为m ’; 4)顺序执行一条指令,地址为m ’+1的指令 5)在后地址[m ’+2,319]中随机选取一条指令并执行; 6) 重复上述步骤1)~5),直到执行320次指令页地址流长度页面失效次数命中率-=1C、将指令序列变换称为页地址流在用户虚存中,按每k存放10条指令排列虚存地址,即320条指令在虚存中的存放方式为:第0条~第9条指令为第0页(对应虚存地址为[0,9]);第10条~第19条指令为第1页(对应虚存地址为[10,19]);。
第310条~第319条指令为第31页(对应虚存地址为[310,319]);按以上方式,用户指令可组成32页。
(3)计算并输出下属算法在不同内存容量下的命中率。
1)先进先出的算法(FIFO);2)最近最少使用算法(LRU);3)最佳淘汰算法(OPT);4)最少访问页面算法(LFR);其中3)和4)为选择内容三、系统框图五运行结果首先打印出产生的指令信息,第一列为指令序列号,第二列为指令地址,第三列为指令所在的虚页号选择FIFO调度算法,并且内存从3也开始逐渐增加到32页,打印出缺页次数缺页率,命中率选择LRU调度算法,并且内存从3也开始逐渐增加到32页,打印出缺页次数缺页率,命中率选择OPT调度算法,并且内存从3也开始逐渐增加到32页,打印出缺页次数缺页率,命中率六实验程序产生指令流文件produce_addstream.h #ifndef PRODUCE_ADDSTREAM_H #define PRODUCE_ADDSTREAM_H #include<stdio.h>#include<stdlib.h>#include<time.h>#include<iomanip.h>#include<vector>using namespace std;#define random(x) (rand()%x)#define MAX_LENGTH 320struct produce{int num; //指令序号int zhiling; //指令地址int virtualpage; //指令虚页号produce *next;};struct produce*creatlist();void insert(struct produce *first,struct produce *s); //插入一个节点(尾插法)void print(struct produce *first); //打印函数int max(vector<vector<int> >,int );struct produce*creatlist(){srand((int)time(0));struct produce*first=new produce;first->next=NULL;int m=0,m1=0;/*int yanzheng[20]={7,0,1,2,0,3,0,4,2,3,0,3,2,1,2,0,1,7,0,1};for (int i=0;i<(MAX_LENGTH/4);i++){struct produce *s0;s0=new produce;s0->num=i*4+0;s0->zhiling=yanzheng[i*4+0];s0->virtualpage=s0->zhiling;insert(first,s0);struct produce *s1;s1=new produce;s1->num=i*4+1;s1->zhiling=yanzheng[i*4+1];s1->virtualpage=s1->zhiling;insert(first,s1);struct produce *s2;s2=new produce;s2->num=i*4+2;s2->zhiling=yanzheng[i*4+2];s2->virtualpage=s2->zhiling;insert(first,s2);struct produce *s3;s3=new produce;s3->num=i*4+3;s3->zhiling=yanzheng[i*4+3];s3->virtualpage=s3->zhiling;insert(first,s3);}//*///*for (int i=0;i<(MAX_LENGTH/4);i++){struct produce *s0;s0=new produce;m=random(MAX_LENGTH);s0->num=i*4+0;s0->zhiling=m+1;s0->virtualpage=s0->zhiling/10;insert(first,s0);m1=random(m+1);struct produce *s1;s1=new produce;s1->num=i*4+1;s1->zhiling=m1;s1->virtualpage=s1->zhiling/10;insert(first,s1);struct produce *s2;s2=new produce;s2->num=i*4+2;s2->zhiling=m1+1;s2->virtualpage=s2->zhiling/10;insert(first,s2);struct produce *s3;s3=new produce;s3->num=i*4+3;s3->zhiling=random(MAX_LENGTH-m1-2)+m1+2;s3->virtualpage=s3->zhiling/10;insert(first,s3);}//*/return first;}void insert(struct produce *first,struct produce *s){struct produce *r=first;struct produce *p;while(r){p=r;r=r->next;}p->next=s;p=s;p->next=NULL;}void print(struct produce *first) //打印函数{struct produce *p;p =first->next;cout<<"随机产生的指令的信息如下"<<endl;cout<<"指令序号"<<"指令地址"<<"指令虚页号"<<endl;while (p){cout<<p->num<<'\t'<<p->zhiling<<setw(14)<<p->virtualpage<<endl;p=p->next;}}int max(vector<vector<int> > page,int Maxpage){int a=0,position=0;for (int i=0;i<Maxpage;i++){if (page[i][1]>a){a=page[i][1];position=i;}}return position;}#endif先来先出调度算法:fifo.h#ifndef FIFO_H#define FIFO_Hvoid fifo(struct produce *first,int Maxpage){vector<int> page(Maxpage);//for (int i=0;i<Maxpage;i++)page[i]=-1;int rear=0;//定义一个变量,指向要被替换的位置int pages;//定义变量保存当前指令的所在的地址int count1=0;//int count2=0;//缺页次数int find=1;struct produce *p=first->next;while (p){pages=p->virtualpage;for(int i=0;i<Maxpage;i++){if (page[i]==-1||count1<Maxpage){page[i]=pages;count1 ++;count2 ++;find =1;break;}else if (page[i]==pages){find =1;break;}find=0;}if (find==0){page[rear]=pages;rear ++;rear=rear%Maxpage;count2 ++;}p=p->next;}cout<<"FIFO调度算法缺页次数缺页率命中率"<<endl;cout<<count2<<setw(25)<<double(count2)/MAX_LENGTH<<setw(10)<<1-dou ble(count2)/MAX_LENGTH<<endl;}#endif FIFO_HLRU调度算法lru.h#ifndef LRU_H#define LRU_H#include<vector>using namespace std;//int max(vector<vector<int> >,int );void lru(struct produce*first,int Maxpage){struct produce*p=first->next;vector<vector<int> > page2(Maxpage, vector<int>(2));int count1=0; //定义内存已经被占用的页数int count2=0; //定义记录缺页次数int equal=0; //定义判断如果当前页数与比较的页数,如果相等则为1,否则为0int place=0; //定义要替换的位置for (int i=0;i<Maxpage;i++){page2[i][0]=-1;page2[i][1]=0;}while (p){if (count1<Maxpage){for (int i=0;i<Maxpage;i++){page2[i][1]=page2[i][1]+1;if (page2[i][0]==-1){page2[i][0]=p->virtualpage;count2++;break;}else if (page2[i][0]==p->virtualpage){page2[i][1] =1;}}count1++;}else{for (int i=0;i<Maxpage;i++){page2[i][1] +=1;if (page2[i][0]==p->virtualpage){equal=1;place=i;break;}}if (equal==1){page2[place][1] =1;equal=0;}else{place = max(page2,Maxpage);page2[place][1]=1;page2[place][0]=p->virtualpage;count2++;}}p=p->next;}cout<<"LRU调度算法缺页次数缺页率命中率"<<endl;cout<<count2<<setw(24)<<double(count2)/MAX_LENGTH<<setw(10)<<1-dou ble(count2)/MAX_LENGTH<<endl;}#endif LRU_HOPT调度算法opt.h#ifndef OPT_H#define OPT_H#include<vector>using namespace std;int search(struct produce*place,int position);void opt(struct produce*first,int Maxpage){struct produce*p =first->next;vector<vector<int> > page3(Maxpage, vector<int>(2));int count1=0; //定义内存已被使用的页数int count2=0; //定义缺页次数int current=0; //定义当前工作位置int equal=0; //定义判断如果当前页数与比较的页数,如果相等则为1,否则为0int place=0; //定义要替换的位置for (int i=0;i<Maxpage;i++){page3[i][0]=-1;page3[i][1]=0;}while (p){//cout<<1111<<endl;if (count1<Maxpage){for (int i=0;i<Maxpage;i++){if (page3[i][0]==-1){page3[i][0]=p->virtualpage;page3[i][1]=search(p,current);count2++;break;}else if (page3[i][0]==p->virtualpage){page3[i][1]=search(p,current);}}count1++;}else{for (int i=0;i<Maxpage;i++){if (page3[i][0]==p->virtualpage){equal=1;place=i;break;}}if (equal==1){page3[place][1] =search(p,current);equal=0;}else{place = max(page3,Maxpage);page3[place][1]=search(p,current);page3[place][0]=p->virtualpage;count2 +=1;}}p=p->next;current +=1;}cout<<"OPT调度算法缺页次数缺页率命中率"<<endl;cout<<count2<<setw(25)<<double(count2)/MAX_LENGTH<<setw(10)<<1-dou ble(count2)/MAX_LENGTH<<endl;}int search(struct produce*place,int position){struct produce*p=place->next;int current=place->virtualpage;int position1=position+1;while(p){if (current==p->virtualpage){return position1;}position1++;p=p->next;}return position1;}#endif主函数控制台ccglmain.cpp#include<iostream.h>#include "produce_addstream.h"#include "fifo.h"#include "lru.h"#include "opt.h"void main(){int S; //定义变量记录用户选择char again; //定义变量用户选择继续还是退出cout<<"开始产生内存指令"<<endl;struct produce *first=creatlist();//产生随机指令cout<<"打印产生的指令信息"<<endl;print(first);//打印产生的指令信息while (1){int Maxpage=3;//定义内存最大页面数cout<<"输入你的选择"<<endl;cout<<"1:FIFO(先进先出)调度算法\n"<<"2:LRU(最近最少使用算法)\n"<<"3:OPT(最佳淘汰算法)\n"<<"4:清屏"<<endl;cin>>S;while(S>4||S<1){cout<<"输入错误重新输入"<<endl;cin>>S;}if (S!=4){while(Maxpage<=32){switch(S){case 1:fifo(first,Maxpage);break;case 2:lru(first,Maxpage);break;case 3:opt(first,Maxpage);break;default:break;}Maxpage++;}cout<<"是否继续调用其他算法?是请按y/Y,否请按其它键"<<endl;cin>>again;if(again=='y'||again=='Y'){continue;}else break;}else system("cls");}}。
操作系统:实验4 存储管理(实验报告)
欢迎共阅班级: 姓名: 学号:5) 当前计算机的实际内存大小为:______________________________________ 分析程序4-1,请回答问题:1) 理论上每个Windows 应用程序可以独占的最大存储空间是:_____________2) 程序中,用于检查系统中虚拟内存特性的API 函数是:__________________ 4.2 Windows 虚拟内存本节实验的目的是:实验4存储管理1) 通过实验了解Windows内存的使用,学习如何在应用程序中管理内存,体会Windows应用程序内存的简单性和自我防护能力。
2) 学习检查虚拟内存空间或对其进行操作;3) 了解Windows的内存结构和虚拟内存的管理,进而了解进程堆和Windows为使用内存而提供的一些扩展功能。
1. 工具/准备工作在开始本节实验之前,请回顾教材的相关内容。
需要准备一台运行Windows系统的计算机,且安装了C/C++编译器。
2. 实验内容与步骤将系统当前的保留区(reserved)虚拟地址空间填入表4.3中。
表4.3 实验记录2) 根据运行结果,请简单描述程序运行的流程:_________________________________________________________________________________________________________________________________________的程序段,该段程序试图通过VirtualAlloc()函数,然后利用物理备用内存将整个块分配到虚拟内存空间的任何位置。
这种技术只对拥有1GB以上的RAM且都有换页文件的计算机可行。
从运行结果看,这种技术成功了吗?_________________。
3) 程序中说明为___________________________________________________的程序段,该段程序利用VirtualAlloc()函数,如果函数成功,则获得大块内存,但不将任何物理内存调配到此块中。
操作系统实验4-请求分页存储管理模拟实验
实验四请求分页存储管理模拟实验一:实验目得通过对页面、页表、地址转换与页面置换过程得模拟,加深对请求分页存储管理系统得原理与实现技术得理解.二:实验内容假设每个页面可以存放10条指令,分配给进程得存储块数为4。
用C语言或Pascal语言模拟一进程得执行过程。
设该进程共有320条指令,地址空间为32个页面,运行前所有页面均没有调入内存。
模拟运行时,如果所访问得指令已经在内存,则显示其物理地址,并转下一条指令;如果所访问得指令还未装入内存,则发生缺页,此时需要记录缺页产生次数,并将相应页面调入内存,如果4个内存块已满,则需要进行页面置换。
最后显示其物理地址,并转下一条指令。
在所有指令执行完毕后,显示进程运行过程中得缺页次数与缺页率.页面置换算法:分别采用OPT、FIFO、LRU三种算法。
进程中得指令访问次序按如下原则生成:50%得指令就是顺序执行得。
25%得指令就是均匀分布在低地址部分.25%得指令就是均匀分布在高地址部分.三:实验类别分页存储管理四:实验类型模拟实验五:主要仪器计算机六:结果OPT:LRU:FIFO:七:程序# i nclude 〈stdio 、h 〉# incl ude 〈stdlib 、h 〉# include 〈conio 、h># def ine blockn um 4//页面尺寸大小int m; //程序计数器,用来记录按次序执行得指令对应得页号s ta ti c in t num [320]; //用来存储320条指令typedef s truct BLOCK //声明一种新类型—-物理块类型{ﻩint pagenum; //页号ﻩint acces sed; //访问量,其值表示多久未被访问}BLOCK ;BLOCK bl ock [bl ocknum ]; //定义一大小为8得物理块数组void init () //程序初始化函数,对bl ock 初始化{for (int i=0;i <blo cknum;i++)block[i]、pagenum=—1;block[i]、accessed=0;ﻩm=0;}}int pageExist(int curpage)//查找物理块中页面就是否存在,寻找该页面curpage就是否在内存块block中,若在,返回块号{ﻩfor(int i=0;i<blocknum; i++)ﻩ{ﻩﻩif(block[i]、pagenum == curpage )ﻩﻩreturn i; //在内存块block中,返回块号ﻩ}return -1;}int findSpace()//查找就是否有空闲物理块,寻找空闲块block,返回其块号{for(int i=0;i<blocknum;i++)ﻩ{if(block[i]、pagenum==-1)ﻩreturn i;//找到了空闲得block,返回块号}ﻩreturn -1;}int findReplace()//查找应予置换得页面{ﻩint pos = 0;ﻩfor(int i=0;i〈blocknum;i++){if(block[i]、accessed 〉block[pos]、accessed)ﻩpos = i; //找到应该置换页面,返回BLOCK中位置ﻩ}return pos;}void display()//显示物理块中得页面号{ﻩﻩfor(int i=0; i〈blocknum; i++)ﻩ{ﻩif(block[i]、pagenum != -1)ﻩ{ﻩﻩprintf(” %02d ",block[i]、pagenum);ﻩﻩﻩprintf("%p |”,&block[i]、pagenum);ﻩﻩ}printf("\n");}void randam()//产生320条随机数,显示并存储到num[320]{int flag=0;printf(”请为一进程输入起始执行指令得序号(0~320):\n”);ﻩscanf("%d",&m);//用户决定得起始执行指令printf("******进程中指令访问次序如下:(由随机数产生)*******\n");for(int i=0;i〈320;i++){//进程中得320条指令访问次序得生成ﻩﻩnum[i]=m;//当前执行得指令数,ﻩﻩif(flag%2==0)ﻩm=++m%320;//顺序执行下一条指令ﻩﻩif(flag==1)ﻩﻩm=rand()%(m-1);//通过随机数,跳转到低地址部分[0,m—1]得一条指令处,设其序号为m1if(flag==3)ﻩﻩm=m+1+(rand()%(320-(m+1)));//通过随机数,跳转到高地址部分[m1+2,319]得一条指令处,设其序号为m2ﻩﻩflag=++flag%4;ﻩprintf(” %03d”,num[i]);//输出格式:3位数ﻩﻩif((i+1)%10==0)//控制换行,每个页面可以存放10条指令,共32个页面ﻩprintf(”\n”);}}void pagestring() //显示调用得页面序列,求出此进程按次序执行得各指令所在得页面号并显示输出{for(int i=0;i〈320;i++)ﻩ{printf(”%02d",num[i]/10);//输出格式:2位数if((i+1)%10==0)//控制换行,每个页面可以存放10条指令,共32个页面ﻩﻩprintf("\n”);}}void OPT() //最佳替换算法{ﻩint n=0;//记录缺页次数int exist,space,position;ﻩintcurpage;//当前指令得页面号ﻩfor(int i=0;i<320;i++)ﻩ{ﻩm=num[i];ﻩcurpage=m/10;ﻩﻩexist=pageExist(curpage);ﻩif(exist==-1)ﻩﻩ{ //当前指令得页面号不在物理块中space=findSpace();ﻩﻩif(space != -1)ﻩﻩ{//当前存在空闲得物理块ﻩﻩblock[space]、pagenum= curpage;//将此页面调入内存ﻩﻩﻩdisplay();//显示物理块中得页面号ﻩﻩn++;//缺页次数+1ﻩ}ﻩﻩelseﻩﻩ{ //当前不存在空闲得物理块,需要进行页面置换for(intk=0;k<blocknum;k++)ﻩﻩﻩﻩ{for(int j=i;j〈320;j++)ﻩ{//找到在最长(未来)时间内不再被访问得页面ﻩﻩﻩﻩif(block[k]、pagenum!= num[j]/10)ﻩﻩﻩ{ﻩﻩblock[k]、accessed = 1000;ﻩﻩﻩ} //将来不会被访问,设置为一个很大数ﻩﻩﻩelseﻩﻩﻩ{ //将来会被访问,访问量设为jﻩﻩﻩblock[k]、accessed = j;ﻩﻩﻩﻩﻩbreak;ﻩﻩﻩﻩ}ﻩﻩﻩ}ﻩ}ﻩposition = findReplace();//找到被置换得页面,淘汰ﻩblock[position]、pagenum = curpage;// 将新页面调入display();ﻩﻩn++; //缺页次数+1ﻩ}}ﻩ}ﻩprintf(”缺页次数:%d\n",n);printf("缺页率:%f%%\n",(n/320、0)*100);}void LRU() //最近最久未使用算法{int n=0;//记录缺页次数ﻩint exist,space,position ;ﻩint curpage;//当前指令得页面号ﻩfor(int i=0;i<320;i++)ﻩ{ﻩm=num[i];ﻩﻩcurpage=m/10;ﻩexist = pageExist(curpage);ﻩif(exist==-1)ﻩﻩ{ //当前指令得页面号不在物理块中space = findSpace();ﻩﻩif(space!= —1)ﻩ{ //当前存在空闲得物理块ﻩﻩblock[space]、pagenum = curpage;//将此页面调入内存ﻩﻩdisplay();//显示物理块中得页面号ﻩn++;//缺页次数+1ﻩﻩ}else{ //当前不存在空闲得物理块,需要进行页面置换ﻩﻩposition= findReplace();ﻩblock[position]、pagenum = curpage;ﻩﻩdisplay();ﻩn++;//缺页次数+1ﻩ}ﻩﻩ}elseﻩﻩblock[exist]、accessed = -1;//恢复存在得并刚访问过得BLOCK中页面accessed为-1for(int j=0; j<blocknum; j++)ﻩﻩ{//其余得accessed++ﻩﻩblock[j]、accessed++;}ﻩ}printf("缺页次数:%d\n”,n);ﻩprintf("缺页率:%f%%\n",(n/320、0)*100);}void FIFO(){int n=0;//记录缺页次数int exist,space,position ;ﻩ int curpage;//当前指令得页面号int blockpointer=-1;for(int i=0;i<320;i++)ﻩ{ﻩ m=num[i];curpage=m/10;ﻩexist = pageExist(curpage);ﻩ if(exist==-1){//当前指令得页面号不在物理块中ﻩ space = findSpace();ﻩﻩif(space !=-1)ﻩ { //当前存在空闲得物理块ﻩﻩ blockpointer++;ﻩﻩﻩblock[space]、pagenum=curpage; //将此页面调入内存ﻩ n++;//缺页次数+1ﻩﻩﻩ display();//显示物理块中得页面号ﻩ}ﻩ elseﻩ { //没有空闲物理块,进行置换ﻩﻩﻩﻩposition = (++blockpointer)%4;ﻩ block[position]、pagenum = curpage;//将此页面调入内存ﻩﻩn++;ﻩﻩ display();ﻩ}ﻩ }}printf("缺页次数:%d\n",n);printf("缺页率:%f%%\n",(n/320、0)*100);}void main(){ﻩint choice;ﻩprintf("************请求分页存储管理模拟系统*************\n");ﻩrandam();printf("************此进程得页面调用序列如下**************\n”);pagestring();ﻩwhile(choice!= 4){ﻩﻩprintf("********1:OPT 2:LRU 3:FIFO 4:退出*********\n”);ﻩprintf("请选择一种页面置换算法:”);ﻩscanf("%d",&choice);ﻩinit();ﻩswitch(choice)ﻩ{ﻩcase 1:ﻩﻩﻩprintf(”最佳置换算法OPT:\n");ﻩprintf("页面号物理地址页面号物理地址页面号物理地址页面号物理地址\n");ﻩﻩﻩOPT();ﻩbreak;ﻩcase 2:ﻩﻩprintf("最近最久未使用置换算法LRU:\n");ﻩprintf("页面号物理地址页面号物理地址页面号物理地址页面号物理地址\n");ﻩLRU();ﻩﻩﻩbreak;ﻩﻩcase 3:ﻩprintf("先进先出置换算法FIFO:\n");ﻩprintf("页面号物理地址页面号物理地址页面号物理地址页面号物理地址\n");FIFO();ﻩﻩbreak;ﻩ}}}。
实验四 操作系统存储管理实验报告
实验四操作系统存储管理实验报告一、实验目的本次操作系统存储管理实验的主要目的是深入理解操作系统中存储管理的基本原理和方法,通过实际操作和观察,掌握内存分配、回收、地址转换等关键技术,提高对操作系统存储管理机制的认识和应用能力。
二、实验环境操作系统:Windows 10开发工具:Visual Studio 2019三、实验原理1、内存分配方式连续分配:分为单一连续分配和分区式分配(固定分区和动态分区)。
离散分配:分页存储管理、分段存储管理、段页式存储管理。
2、内存回收算法首次适应算法:从内存低地址开始查找,找到第一个满足要求的空闲分区进行分配。
最佳适应算法:选择大小最接近作业需求的空闲分区进行分配。
最坏适应算法:选择最大的空闲分区进行分配。
3、地址转换逻辑地址到物理地址的转换:在分页存储管理中,通过页表实现;在分段存储管理中,通过段表实现。
四、实验内容及步骤1、连续内存分配实验设计一个简单的内存分配程序,模拟固定分区和动态分区两种分配方式。
输入作业的大小和请求分配的分区类型,程序输出分配的结果(成功或失败)以及分配后的内存状态。
2、内存回收实验在上述连续内存分配实验的基础上,添加内存回收功能。
输入要回收的作业号,程序执行回收操作,并输出回收后的内存状态。
3、离散内存分配实验实现分页存储管理的地址转换功能。
输入逻辑地址,程序计算并输出对应的物理地址。
4、存储管理算法比较实验分别使用首次适应算法、最佳适应算法和最坏适应算法进行内存分配和回收操作。
记录不同算法在不同作业序列下的内存利用率和分配时间,比较它们的性能。
五、实验结果与分析1、连续内存分配实验结果固定分区分配方式:在固定分区大小的情况下,对于作业大小小于或等于分区大小的请求能够成功分配,否则分配失败。
内存状态显示清晰,分区的使用和空闲情况一目了然。
动态分区分配方式:能够根据作业的大小动态地分配内存,但容易产生内存碎片。
2、内存回收实验结果成功回收指定作业占用的内存空间,内存状态得到及时更新,空闲分区得到合并,提高了内存的利用率。
实验四操作系统存储管理实验报告
实验四操作系统存储管理实验报告一、实验目的本次实验的主要目的是深入理解操作系统中存储管理的基本原理和方法,通过实际操作和观察,掌握内存分配与回收、页面置换算法等关键概念,并能够分析和解决存储管理中可能出现的问题。
二、实验环境本次实验在装有 Windows 操作系统的计算机上进行,使用了 Visual Studio 等编程工具和相关的调试环境。
三、实验内容(一)内存分配与回收算法实现1、首次适应算法首次适应算法从内存的起始位置开始查找,找到第一个能够满足需求的空闲分区进行分配。
在实现过程中,我们通过建立一个空闲分区链表来管理内存空间,每次分配时从表头开始查找。
2、最佳适应算法最佳适应算法会选择能够满足需求且大小最小的空闲分区进行分配。
为了实现该算法,在空闲分区链表中,分区按照大小从小到大的顺序排列,这样在查找时能够快速找到最合适的分区。
3、最坏适应算法最坏适应算法则选择最大的空闲分区进行分配。
同样通过对空闲分区链表的排序和查找来实现。
(二)页面置换算法模拟1、先进先出(FIFO)页面置换算法FIFO 算法按照页面进入内存的先后顺序进行置换,即先进入内存的页面先被置换出去。
在模拟过程中,使用一个队列来记录页面的进入顺序。
2、最近最久未使用(LRU)页面置换算法LRU 算法根据页面最近被使用的时间来决定置换顺序,最近最久未使用的页面将被置换。
通过为每个页面设置一个时间戳来记录其最近使用的时间,从而实现置换策略。
3、时钟(Clock)页面置换算法Clock 算法使用一个环形链表来模拟内存中的页面,通过指针的移动和页面的访问标志来决定置换页面。
四、实验步骤(一)内存分配与回收算法的实现步骤1、初始化内存空间,创建空闲分区链表,并为每个分区设置起始地址、大小和状态等信息。
2、对于首次适应算法,从链表表头开始遍历,找到第一个大小满足需求的空闲分区,进行分配,并修改分区的状态和大小。
3、对于最佳适应算法,在遍历链表时,选择大小最接近需求的空闲分区进行分配,并对链表进行相应的调整。
操作系统-请求页式存储管理实验报告分析解析
操作系统-请求页式存储管理实验报告分析解析实验背景在计算机系统中,内存是一项很重要的资源。
其中,操作系统需要管理内存,以便为用户进程和内核提供适当的内存空间。
页式内存管理是操作系统能够管理和维护内存的一种方式。
在页式内存管理中,主存分为固定大小的框架,称为页框,而进程的地址空间被分割为固定大小的页。
页式内存管理系统采用了一种称为“请求页式存储”的技术,允许进程只存取正在使用的那些页面。
这样可以节省空间,并且提高了处理器访问内存的速度。
实验环境本次实验使用的操作系统是 Ubuntu 20.04 LTS 操作系统。
实验目标本次实验的主要目标是通过模拟请求页式内存管理系统,来了解和深入理解页式内存管理技术。
本次实验需要完成以下任务:1.编写一个简单的请求页式存储模拟器;2.使用该模拟器对作业和内存进行模拟;3.分析模拟结果并撰写实验报告。
实验过程阅读并理解作业说明在开始实验之前,我们首先需要阅读和了解具体的作业说明。
在本次实验中,我们需要完成一个请求页式存储模拟器,以及使用该模拟器对作业与内存进行模拟。
编写模拟器在了解了作业说明后,我们开始按照作业的要求,编写请求页式内存管理模拟器。
在这里,我们需要使用到Python 编程语言。
实际上,我们在编写该模拟器时,主要分为以下几步:1.文件操作:首先,我们需要通过读取文件中的数据来模拟进程对内存的请求。
在输入文件中,每一行表示一个请求,包含了进程 ID、请求的地址和访问类型。
2.内存分配:接着,我们需要模拟请求页式内存管理系统中对于内存分配的操作,即在访问时,将需要的页加载到内存中,如果内存已满,则需要选择一个页面将其从内存中移除,为新的页面腾出空间。
3.页面置换:如果进行页面置换,则需要选出最久未访问的页面并移出内存,空出空间用于新的页面,这就是所谓的“最久未使用”(LRU)策略。
进行模拟有了模拟器之后,我们就可以针对不同的作业和内存大小进行实验。
在实验的过程中,我们可以观察不同大小的内存和不同的作业怎样影响模拟的结果。
基本分页存储管理的模拟实现
基本分页存储管理的模拟实现学院:专业:学生姓名:学号:指导教师:2014年3月 18 日目录一、设计内容 (2)二、相关操作系统的知识介绍 (2)三、课程设计的目的及要求 (2)四、程序功能说明 (3)五、算法整体思想 (3)六、主要功能模块进程图 (3)七、实验结果 (4)八、实验总结 (7)九、程序代码 (7)一、设计内容根据设计要求实现对基本分页存储管理的模拟二、相关操作系统的知识介绍连续分配方式会形成许多“碎片”,虽然可通过“紧凑”方法将许多碎片拼接成可用的大块空间,但须为之付出很大的开销。
如果允许将一个进程直接分散的装入到许多不相邻接的分区中,则无需在进行“紧凑”。
基于这一思想而产生了离散分配方式。
如果离散分配的基本单位是页,则称为分页存储管理方式;如果离散分配的基本单位是段,则称为分段存储管理方式。
在分页存储管理方式中,如果不具备页面对换功能,则称为基本的分页存储管理方式,或称为纯分页存储管理方式,它不具有支持实现虚拟存储的功能,它要求把每个作业全部装入内存后方能运行。
三、课程设计的目的及要求1、课程设计的目的操作系统课程设计是计算机专业重要的教学环节,它为我们提供了一个既动手又动脑,将课本上的理论知识和实际有机的结合起来,独立分析和解决实际问题的机会。
●进一步巩固和复习操作系统的基础知识。
●培养我们结构化程序、模块化程序设计的方法和能力。
●提高我们调试程序的技巧和软件设计的能力。
●提高我们分析问题、解决问题以及综合利用 C 语言进行程序设计的能力。
2、设计要求1.选择恰当的数据结构表示页表2.进程名,进程所需页数,进程进行的操作(装入/退出)等操作可有键盘输入,也可从文件读出。
3.每进行一次进程的装入或者退出操作,就显示出操作执行后内存中各页的分配情况。
四、程序功能说明函数各模块部分功能void CreatA()//创建内存新函数void NewNode(LinkList &L)//建立新进程void FreeNode(LinkList &L)//回收进程,释放内存void Printf(LinkList L)//显示所有进程所占物理块信息void look(LinkList L)//查看进程信息void showit()//显示内存块使用信息函数的整体功能这个程序是为了实现离散分配方式,以消减内存的外零头,提高内存的利用率,由系统把逻辑地址划分为页号和页内地址两部分。
实验报告关于请求调页存储管理方式
《网络操作系统》课程设计报告书题目:请求调页存储管理方式的模拟学号:学生姓名:指导教师:年月日目录一. 实验内容................................................... 错误!未定义书签。
二. 实验目的................................................... 错误!未定义书签。
三. 设计思想................................................... 错误!未定义书签。
四. 程序流程图................................................. 错误!未定义书签。
五. 程序清单................................................... 错误!未定义书签。
六. 运行结果及分析............................................. 错误!未定义书签。
七. 总结....................................................... 错误!未定义书签。
一、实验内容1.假设每个页面中可存放10条指令,分配给作业的内存块数为4。
2.用C语言或C++语言模拟一个作业的执行过程,该作业共有320条指令,即它的地址空间为32页,目前它的所有页都还未调入内存。
在模拟过程中,如果所访问的指令已在内存,则显示其物理地址,并转下一条指令。
如果所访问的指令还未装入内存,则发生缺页,此时需记录缺页的次数,并将相应页调入内存。
如果4个内存块均已装入该作业,则需进行页面置换,最后显示其物理地址,并转下一条指令。
在所有320指令执行完毕后,请计算并显示作业运行过程中发生的缺页率。
3.置换算法:请分别考虑最佳置换算法(OPT)、先进先出(FIFO)算法和最近最久未使用(LRU)算法。
操作系统课程设计模拟请求页式存储管理
操作系统课程设计报告项目:模拟请求页式存储管理一、目的和要求1、实训目的(1)通过编写和调试存储管理的模拟程序以加深对存储管理方案的理解。
熟悉虚存管理的各种页面淘汰算法(2)通过编写和调试地址转换过程的模拟程序以加强对地址转换过程的了解。
2、实训要求编写并调试完成请求页式存储管理程序。
页面置换算法:最佳置换算法(OPT)、先进先出算法(FIFO)和最近最少用算法(LRU)。
要求打印每个页面置换算法的页面置换变化示意图、缺页中断次数和缺页中断率,以比较各种算法的优缺点。
二、设计思路及过程1、概要设计1.1 问题概述根据三种不同的置换算法(FIFO、LRU、OPT),依据其不同的算法方式,分别计算该页面引用串在不同算法下的缺页次数与缺页率,并显示各页面的变化情况。
1.2 内容分析对于该课程设计中模拟的请求页式存储管理的页面置换过程,只要掌握其中最基本的三种算法,包括FIFO、LRU及OPT。
另外,对于同一个页面引用串,要求能够调用不同的算法对它进行操作。
2、过程设计2.1模块设计在下图的主模块设计图中,只注重描绘了请求页式存储管理的三种主要算法,未描绘出细节部分。
图2.1 请求页式存储管理的主模块设计图2.2 算法原理分析要成功实现算法,首先要知道各个方法是怎么做的,即原理是怎样的,下面是三种算法的原理。
(1)FIFO算法:该算法认为刚被调入的页面在最近的将来被访问的可能性很大,而在主存中滞留时间最长的页面在最近的将来被访问的可能性很小。
因此。
FIFO算法总是淘汰最先进入主存的页面,即淘汰在主存中滞留时间最长的页面。
(2)LRU算法是最近最久未使用,当当前内存中没有正要访问的页面时,置换出在当前页面中最近最久没有使用的页面。
该算法总是选择最近一段时间内最长时间没有被访问过的页面调出。
它认为那些刚被访问过的页面可能在最近的将来还会经常访问他们,而那些在较长时间里未被访问的页面,一般在最近的将来再被访问的可能性较小。
实验四操作系统存储管理实验报告
实验四操作系统存储管理实验报告一、实验目的1.了解存储管理的概念和意义;2.掌握内存管理的基本原理和技术;3.了解常见的存储管理策略。
二、实验内容1.使用C/C++编程语言,设计并实现一个模拟内存管理的程序;2.实现内存的分配和回收算法,模拟内存的分配和释放过程;3.实现不同的内存管理策略,并通过实验比较它们的效果。
三、实验过程1.阅读相关的参考资料,了解存储管理的概念和意义,以及常用的内存管理策略;2.使用C/C++编程语言,设计并实现一个模拟内存管理的程序;3.设计并实现内存的分配和回收算法,模拟内存的分配和释放过程;4.设计并实现不同的内存管理策略,如首次适应算法、最佳适应算法和最坏适应算法;5.运行程序,测试不同的内存管理策略,比较它们的效果。
四、实验结果与分析在模拟的内存管理程序中,我们实现了三种常见的内存管理策略:首次适应算法、最佳适应算法和最坏适应算法。
这些策略在进行内存分配时,从空闲内存块列表中选择合适的内存块进行分配,并在内存回收时对已使用的内存块进行释放。
我们通过对不同策略的测试,得到了以下的实验结果。
首次适应算法:该算法会从空闲内存块列表中选择第一个满足要求的内存块进行分配。
该算法的优点是速度较快,但容易出现内存碎片的问题。
在实验中,我们发现该算法的分配速度相对较快,但在长时间运行后,可能会出现大量的内存碎片,导致无法分配较大的连续内存块。
最佳适应算法:该算法会遍历空闲内存块列表,选择大小最合适的内存块进行分配。
该算法的优点是能够更好地利用内存空间,减少内存碎片的发生。
在实验中,我们发现该算法的分配效果较好,但需要遍历整个空闲内存块列表,所以速度较慢。
最坏适应算法:该算法会选择大小最大的内存块进行分配。
该算法的优点是可以防止内存碎片的发生,但由于每次选择的内存块较大,可能会导致较多的内存浪费。
在实验中,我们发现该算法的分配效果较好,但会造成较多的内存浪费。
根据实验结果和分析,我们可以根据具体的需求选择合适的内存管理策略。
实验四 页式虚拟存储管理
页式虚拟存储管理中地址转换和缺页中断一、实验目的模拟请求页式存储管理中硬件的地址转换和缺页中断,并用先进先出调度算法(FIFO)处理缺页中断。
二、实验内容1.内容:模拟请求页式存储管理中硬件的地址转换和缺页中断处理2.思想:装入新页置换旧页时,若旧页在执行中没有被修改过,则不必将该页重写磁盘。
因此,页表中增加是否修改过的标志,执行“存”指令和“写”指令时将对应的三、程序及截图程序主要代码:#include<iostream>#include<iomanip>#include<list>using namespace std;char useSign[12][5]={{'+'},{'-'},{'*'},{"存"},{"取"},{'-'},{"移位"},{'+'},{"存"},{"取"},{'+'},{"存"}};int PageAddress[12]={70,50,15,21,56,40,53,23,37,78,01,84};int PageNum[12]={0,1,2,3,0,6,4,5,1,2,4,6};int S_Station;int pPageNum[7];//页号pPageint pSign[7];int pStool[7];//页架号int pModify[7];//修改标志int pStation[7];//磁盘位置static int z=0;void Store(){for(int i=0;i<7;i++){if(i<4){pSign[i]=1;}elsepSign[i]=0;pPageNum[i]=i;pModify[i]=0;}int p1=1,p2=2,p3=3;for(i=0;i<7;i++){if(i<3){pStation[i]=p1;p1++;}elseif(i<6){pStation[i]=p2;p2++;}elsepStation[i]=p3;}pStool[0]=5;pStool[1]=8;pStool[2]=9;pStool[3]=1;}void CShow(){cout<<"操作";cout<<"页号";cout<<"页内地址";cout<<"标志";cout<<"绝对地址";cout<<"修改页号";cout<<"页架号";cout<<"绝对地址";cout<<endl;}void Find(){int m_Pagenum;int m_Station;int Y_Station;//绝对地址int m_Stool;cout<<"输入页号及页内地址查询操作:";cin>>m_Pagenum>>m_Station;CShow();int i,j=0;//string m_Modify;for(i=0;i<12;i++){if(PageAddress[i]==m_Station){break;}}Y_Station=pStool[m_Pagenum]*1024+m_Station;if(pSign[m_Pagenum]==1){if(strcpy(useSign[i],"存")!=0){pModify[m_Pagenum]=1;}}cout<<useSign[i]<<" ";cout<<m_Pagenum<<" ";cout<<m_Station<<" ";cout<<pSign[m_Pagenum]<<" ";if(Y_Station!=m_Station){cout<<Y_Station<<" ";cout<<" ";cout<<pStool[m_Pagenum]<<" ";cout<<Y_Station<<endl;}else{cout<<"*"<<m_Pagenum<<" ";for(j=z;j<7;j++){if(pSign[j]==1){z++;break;}}cout<<m_Pagenum<<"->"<<j<<" ";pStool[m_Pagenum]=pStool[j];pSign[j]=0;pStool[j]=0;cout<<pStool[m_Pagenum]<<" ";cout<<pStool[m_Pagenum]*1024+m_Station<<endl;}}int main(void){Store();char judge='Y';while(judge=='Y'){Find();cout<<"是否继续输入?Y = 是N=否"<<endl;cin>>judge;}return 0;}运行结果截图:五.心得体会在实验过程中,在调试的过程中遇到了一些问题,导致出现很多错误,在同学的帮助下,基本都解决了所有问题。
实验四 分页式存储管理
实验四分页式存储管理自动化1203 张千伟201203870323一、实验目的1.熟悉分页式存储管理2.掌握最久未使用算法以及FIFO算法二、实验内容1.实验代码#include<conio.h>#include<stdio.h>#include<stdlib.h>#include<string.h>#define bsize 4 //物理块大小#define psize 16 //进程大小typedef struct page{int num; /*记录页面号*/int time; /*记录调入内存时间*/}Page; /* 页面逻辑结构,结构为方便算法实现设计*/Page b[bsize]; /*内存单元数*/int c[bsize][psize]; /*暂保存内存当前的状态:缓冲区*/int queue[100]; /*记录调入队列*/int K; /*调入队列计数变量*/int phb[bsize]={0}; //物理块标号int pro[psize]={0}; //进程序列号int flag[bsize] = {0}; //进程等待次数(存放最久未被使用的进程标志)int i = 0, j = 0,k = 0; //i表示进程序列号,j表示物理块号int m = -1, n = -1; //物理块空闲和进程是否相同判断标志int max = -1,maxflag = 0; //标记替换物理块进程下标int count = 0; //统计页面缺页次数//**************************************************************//随机产生序列号函数int* build(){printf("随机产生一个进程序列号为:\n");int i = 0;for(i=0; i<psize; i++){pro[i] = 10*rand()/(RAND_MAX+1)+1;printf("%d ",pro[i]);}printf("\n");return(pro);}//查找空闲物理块int searchpb(){for(j=0; j<bsize; j++){if(phb[j] == 0){m = j;return m;break;}}return -1;}int searchpro()//查找相同进程{for(j = 0; j < bsize; j++){if(phb[j] == pro[i]){n = j;return j;}}return -1;}void empty()//初始化内存{for(i=0;i<bsize;i++)phb[i]=0;count=0; //计数器置零}void FIFO()//先进先出页面置换算法{for(i = 0; i<psize; i++){m=searchpb();n=searchpro(); //找flag值最大的for(j = 0; j < bsize;j++){if(flag[j]>maxflag){maxflag = flag[j];max = j;}}if(n == -1) //不存在相同进程{if(m != -1) //存在空闲物理块{phb[m] = pro[i]; //进程号填入该空闲物理块count++;flag[m] = 0;for(j = 0;j <= m; j++){flag[j]++;}m = -1;}else//不存在空闲物理块{phb[max] = pro[i];flag[max] = 0;for(j = 0;j < bsize; j++){flag[j]++;}max = -1;maxflag = 0;count++;}}else//存在相同的进程{phb[n] = pro[i];for(j = 0;j < bsize; j++){flag[j]++;}n = -1;}for(j = 0 ;j < bsize; j++){printf("%d ",phb[j]);}printf("\n");}printf("缺页次数为:%d\n",count);printf("\n");}void Init(Page *b,int c[bsize][psize]) /*初始化内存单元、缓冲区*/{int i,j;for(i=0;i<psize;i++){b[i].num=-1;b[i].time=psize-i-1;}for(i=0;i<bsize;i++)for(j=0;j<psize;j++)c[i][j]=-1;}int GetMax(Page *b) /*取得在内存中停留最久的页面,默认状态下为最早调入的页面*/ {int i;int max=-1;int tag=0;for(i=0;i<bsize;i++){if(b[i].time>max){max=b[i].time;tag=i;}}return tag;}int Equation(int fold,Page *b) /*判断页面是否已在内存中*/{int i;for(i=0;i<bsize;i++){if (fold==b[i].num)return i;}return -1;}/*LRU核心部分*/void Lruu(int fold,Page *b){int i;int val;val=Equation(fold,b);if (val>=0){b[val].time=0;for(i=0;i<bsize;i++)if (i!=val)b[i].time++;}else{queue[++K]=fold;/*记录调入页面*/val=GetMax(b);b[val].num=fold;b[val].time=0;for(i=0;i<bsize;i++)if (i!=val)b[i].time++;}}void LRU(){int i,j;K=-1;Init(b, c);for(i=0;i<psize;i++){Lruu(pro[i],b);c[0][i]=pro[i];/*记录当前的内存单元中的页面*/for(j=0;j<bsize;j++)c[j][i]=b[j].num;}/*结果输出*/printf("内存状态为:\n");printf("|---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---|\n");for(j=0;j<psize;j++)printf("|%2d ",pro[j]);printf("|\n");printf("|---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---|\n");for(i=0;i<bsize;i++){ for(j=0;j<psize;j++){if(c[i][j]==-1)printf("|%2c ",32);elseprintf("|%2d ",c[i][j]);}printf("|\n");}printf("|---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---|\n"); printf("\n调入队列为:");for(i=0;i<K+1;i++)printf("%3d",queue[i]);printf("\n缺页次数为:%6d\n缺页率:%16.6f",K+1,(float)(K+1)/psize);}// 主函数void main(){int sel ;do{printf("**********************************************************************\n");printf("\t欢迎进入操作系统界面\n");printf("\t1、产生随机序列\n");printf("\t2、最久未使用算法LRU\n");printf("\t3、先进先出算法FIFO\n");printf("\t4、比较两种算法\n");printf("\t0、退出\n");printf("请选择所要执行的操作0~5:\n");scanf("%d",&sel);switch(sel){case 0:printf("\n");system("pause");break;case 1:build();break;case 2:printf("最久未使用算\n");LRU();empty();printf("\n");break;case 3:printf("先进先出算\n");FIFO();empty();printf("\n");break;case 4:printf("先进先出算法\n");FIFO();empty();printf("最久未使用算法\n");LRU();empty();break;default: printf("请输入正确的选项号!");printf("\n\n");break;}}while(sel!=0);}2.实验结果三、实验总结本次实验使用c语言让我熟悉了分页置换存储管理的几种算法,理解了书上长篇幅的文字,形象的展示出两种算法的优缺点,加深了我对存储管理这一章内容的理解。
计算机操作系统实验_源码_模拟请求分页虚拟存储管理中的硬件地址变换过程[技巧]
地址变换算法框图如图10—1所示。
运行设计的地址变换程序 ,显示或打印运行结果。。因为只是模拟地址变换,并不
cin>>menu;
while(menu)
{
switch(menu)
{
case 1:
cout<<"请输入指令的逻辑地址:";
cin>>ins;
changeaddr(p,ins);
break;
case 2:
cout<<"谢谢使用,下次再见~"<<endl;
exit(0);
break;
default:
cout<<"输入有误,请重新输入~"<<endl;
cout<<"----------\t\t1.输入指令\t\t---------"<<endl;
cout<<"----------\t\t2.退出程序\t\t---------"<<endl;
cout<<"----------欢迎使用分页虚拟存储器硬件地址变换算法---------"<<endl;
cout<<endl<<"请输入您的选择:";
p[2].pno=2;p[2].flag=1;p[2].cno=9;p[2].modf=0;p[2].addr=013;
操作系统_请求分页存储管理模拟实现
操作系统请求分页存储管理模拟实现#include<stdlib.h>#include<iomanip.h>#include"windows.h"#include"os.h"#define n 64//实验中假定主存的长度#define m 4//实验中假定每个作业分得主存块块数int p[m];//定义页struct{short int lnumber;//页号short int flag;//表示该页是否在主存,“1”表示在主存,“0”表示不在主存short int pnumber;//该页所在主存块的块号short int write;//该页是否被修改过,“1”表示修改过,“0”表示没有修改过short int dnumber;//该页存放在磁盘上的位置,即磁盘块号short int times;//被访问的次数,用于LRU算法}page[n];//定义页表//各个函数的实现如下:computer::computer(){int i;for(i=0;i<n;i++){page[i].lnumber = i;page[i].flag = 0;page[i].pnumber = 10000;//用10000表示为空page[i].write = 0;page[i].dnumber = i;page[i].times = 0;}//初始化页表for(i=0;i<m;i++){page[i].pnumber = i;}for(i=0;i<m;i++){p[i] = i;page[i].flag = 1;}//初始化页}void computer::showpagelist(){int i;cout<<"页号"<<"\t"<<"是否在主存中"<<"\t"<<"块号"<<"\t"<<"是否被修改过"<<"\t"<<"磁盘块号"<<"\t"<<"访问次数"<<endl;for(i=0;i<n;i++){cout<<page[i].lnumber<<"\t"<<page[i].flag<<""<<page[i].pnumber<<"\t"<<page[i].write<<" "<<page[i].dnumber<<" \t"<<page[i].times<<endl;}}void computer::showpage(){int i;for(i=0;i<m;i++){cout<<"\t"<<p[i];}cout<<endl;}void computer::transformation(){unsignedlogicAddress,logicNumber,innerAddress,physicsAddress,physicsNumber;int i,head=0,fail = 0;int method,temppage=0;short int times = 10000;cout<<"请输入一个逻辑地址(四位十六进制数):";cin>>hex>>logicAddress;//读入逻辑地址logicNumber = logicAddress >> 10;//得到页号cout<<"页号为:"<<logicNumber<<endl;innerAddress = logicAddress & 0x03ff;//得到页内地址cout<<"页内地址为:"<<innerAddress<<endl;for(i=0;i<n;i++){if(logicNumber==(unsigned)page[i].lnumber){if(page[i].flag == 1){cout<<"请求的页面在主存中!"<<endl;page[i].times++;physicsNumber = page[i].pnumber;//由页号得到块号cout<<"请求的主存块号为:"<<physicsNumber<<endl;physicsAddress = physicsNumber << 10 |innerAddress;//得到物理地址cout<<"请求的物理地址为:"<<physicsAddress<<endl;//输出物理地址break;}else{cout<<"请求的页面不在主存中! 将进行缺页中断处理!"<<endl<<"请选择算法!"<<endl; cout<<"1.先进先出"<<endl<<"2.最近最少用"<<endl<<"请选择置换算法:";cin>>method;if(method == 1) //采用先进先出算法{cout<<"采用先进先出算法!"<<endl;fail = p[head];cout<<"第"<<fail<<"页将被替换!"<<endl;p[head] = logicNumber;head = (head+1) % m;if(page[fail].write == 1)cout<<"第"<<fail<<"页曾被修改过!"<<endl;page[fail].flag = 0;page[logicNumber].flag = 1;page[logicNumber].write = 0;page[logicNumber].pnumber = page[fail].pnumber; page[fail].pnumber = 10000;page[logicNumber].times++;break;}else if(method == 2) //采用最近最少用算法{cout<<"采用最近最少用算法!"<<endl;for(i=0;i<n;i++){if(page[i].flag == 1){if(page[i].times<times){times = page[i].times;temppage = page[i].lnumber;}}}cout<<"第"<<temppage<<"页将被替换!"<<endl; for(i=0;i<m;i++){if(p[i] == temppage){p[i] = logicNumber;}}if(page[temppage].write == 1)cout<<"第"<<temppage<<"页曾被修改过!"<<endl; page[temppage].flag = 0;page[logicNumber].flag = 1;page[logicNumber].write = 0;page[logicNumber].pnumber = page[temppage].pnumber; page[temppage].pnumber = 10000;page[logicNumber].times++;break;}else{ cout<<"你输入有误,即将退出!";exit(1);}}}}}void main(){char c,d;computer os;cout<<"页表正在初始化中...,3秒钟后为你显示页和页表!"<<endl; Sleep(3000);os.showpage();os.showpagelist();T:os.transformation();cout<<"是否显示页和页表?(Y/N)";cin>>c;switch(c){case 'y':os.showpage();os.showpagelist();case 'n':cout<<"是否继续进行请求分页?(Y/N)";cin>>d;if (d=='Y'||d=='y')goto T;else if (d=='N'||d=='n')exit(1);elsecout<<"输入错误!"<<endl; default:cout<<"输入错误!"<<endl; } }。
请求分页存储管理模拟实验
操作系统模拟实验实验名称:请求分页存储管理模拟实验实验目的:通过实验了解windows系统中的线程同步如何使用,进一步了解操作系统的同步机制。
实验内容:调用Windows API,模拟解决生产者-消费者问题;思考在两个线程函数中哪些是临界资源?哪些代码是临界区?哪些代码是进入临界区?哪些代码是退出临界区?进入临界区和退出临界区的代码是否成对出现?学习Windows API中的如何创建线程,互斥,临界区等。
程序运行结果:源程序:#include "stdAfx.h"//包含头文件以支持多线程#include "windows.h"#include "stdio.h"//用于标志所有的子线程是否结束//每次子线程结束后,此值便加1。
static long ThreadCompleted = 0;//互斥量HANDLE mutex;//信号量,用于生产者通知消费者HANDLE full;//信号量,用于消费者通知生产者HANDLE empty;//信号量,当所有的子线程结束后,通知主线程,可以结束。
HANDLE evtTerminate;//生产标志#define p_item 1//消费标志#define c_item 0//哨兵#define END 10//缓冲区最大长度const int max_buf_size=11;const int cur_size=10;//缓冲区定义int BUFFER[max_buf_size];//放消息指针int in=0;//取消息指针int out=0;int front=0;int tail=0;int sleep_time=1000;bool flag=true;//线程函数的标准格式unsigned long __stdcall p_Thread(void *theBuf);unsigned long __stdcall c_Thread(void *theBuf);//打印缓冲区内容void PrintBuf(int buf[],int buf_size);int main(int argc, char* argv[]){//初始化缓冲区unsigned long TID1, TID2;for(int i=0;i<cur_size;i++)BUFFER[i]=0;//互斥量和信号量的创建,函数用法可查看MSDNmutex=CreateMutex(NULL,false,"mutex");full=CreateSemaphore(NULL,0,1,"full");empty=CreateSemaphore(NULL,max_buf_size,max_buf_size,"empty");evtTerminate = CreateEvent(NULL, FALSE, FALSE, "Terminate");//创建一个生产者线程和消费者线程。
分页存储管理实验报告
分页存储管理实验报告分页存储管理实验报告篇一:分页存储管理的模拟实验上机报告分页存储管理的模拟实验上机报告页面管理的基本原理及方法:各进程的虚拟空间被划分成若干个长度相等的页(page)。
页长的划分和内存外存之间的数据传输速度以及内存大小等有关。
页式管理还把内存空间也按也的大小划分为页面(page frame)。
然后把页式虚拟地址与内存页面物理地址建立一一对应页表,并用相应的硬件地址变换机构,来解决离散地址变换问题。
在作业或进程开始执行之前,把该作业或进程的程序段和数据全部装入内存的各个页面中,并通过页表(page mapping table)和硬件地址变换机构实现虚拟地址到内存物理地址的地址映射。
1. 内存页面分配静态页面管理的第一步是为要求内存的作业或进程分配足够的页面。
系统依靠存储页面表,请求表及页表来完成内存的分配工作。
a. 页表页表由页号与页面号组成。
如右图所示页表的大小由进程或作业的长度决定。
例如,对于一个每页长1k,大小为20k的进程来说,如果一个内存单元存放一个页表项,则只要分配给该页表20个存储单元即可。
页式管理是每个进程至少拥有一个页表。
实验中对页表的定义如下(采用数组形式,数组下标表示页号,数组单元存放与数组下标(页号)相应的页面号):int pagetable[100] b.请求表(作业申请表)请求表用来确定作业或进程的虚拟空间的各页在内存中的对应位置。
为了完成这个认为,系统必须知道每个作业或进程的页表起始地址(本实验中假定为0)和长度,以进行内存分配和地址变换。
另外请求表中还包括每个作业或进程所要求的页面数。
请求表整个系统一张,实验中对请求表的定义如下(采用结构体数组形式,并将页表也作为其中一个成员(即域)):#define u 5 struct application_table{char name[8];/*作业名*/int size;/*作业大小――即将上表中的请求页面数改用字节表示*/int paddress; /*页表起始地址*/ int length;/*页表长度――以页面数表示*/int state; /*内存的分配状态,以分配的用1表示,未分配的用0表示*/int pagetable[100];/*页表,放在这里是为了方便虚地址转换及作业撤销的操作*/ }application[u];c.存储页面表(本实验中采用位示图法)位示图也是整个系统一张,它指出内存各页面是否已被分配出去,以及未分配页面的总数。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验四请求分页存储管理模拟实验一:实验目的通过对页面、页表、地址转换和页面置换过程的模拟,加深对请求分页存储管理系统的原理和实现技术的理解。
二:实验容假设每个页面可以存放10条指令,分配给进程的存储块数为4。
用C语言或Pascal语言模拟一进程的执行过程。
设该进程共有320条指令,地址空间为32个页面,运行前所有页面均没有调入存。
模拟运行时,如果所访问的指令已经在存,则显示其物理地址,并转下一条指令;如果所访问的指令还未装入存,则发生缺页,此时需要记录缺页产生次数,并将相应页面调入存,如果4个存块已满,则需要进行页面置换。
最后显示其物理地址,并转下一条指令。
在所有指令执行完毕后,显示进程运行过程中的缺页次数和缺页率。
页面置换算法:分别采用OPT、FIFO、LRU三种算法。
进程中的指令访问次序按如下原则生成:50%的指令是顺序执行的。
25%的指令是均匀分布在低地址部分。
25%的指令是均匀分布在高地址部分。
三:实验类别分页存储管理四:实验类型模拟实验五:主要仪器计算机六:结果OPT:LRU:FIFO:七:程序# include<stdio.h># include<stdlib.h># include<conio.h># define blocknum 4//页面尺寸大小int m; //程序计数器,用来记录按次序执行的指令对应的页号static int num[320]; //用来存储320条指令typedef struct BLOCK //声明一种新类型--物理块类型{int pagenum; //页号int accessed; //访问量,其值表示多久未被访问}BLOCK;BLOCK block[blocknum]; //定义一大小为8的物理块数组void init() //程序初始化函数,对block初始化{for(int i=0;i<blocknum;i++){block[i].pagenum=-1;block[i].accessed=0;m=0;}}int pageExist(int curpage)//查找物理块中页面是否存在,寻找该页面curpage是否在存块block中,若在,返回块号{for(int i=0; i<blocknum; i++){if(block[i].pagenum == curpage )return i; //在存块block中,返回块号}return -1;}int findSpace()//查找是否有空闲物理块,寻找空闲块block,返回其块号{for(int i=0;i<blocknum;i++){if(block[i].pagenum==-1)return i; //找到了空闲的block,返回块号}return -1;}int findReplace()//查找应予置换的页面{int pos = 0;for(int i=0;i<blocknum;i++){if(block[i].accessed > block[pos].accessed)pos = i; //找到应该置换页面,返回BLOCK中位置}return pos;void display()//显示物理块中的页面号{for(int i=0; i<blocknum; i++){if(block[i].pagenum != -1){printf(" %02d ",block[i].pagenum);printf("%p |",&block[i].pagenum);}}printf("\n");}void randam()//产生320条随机数,显示并存储到num[320]{int flag=0;printf("请为一进程输入起始执行指令的序号(0~320):\n");scanf("%d",&m);//用户决定的起始执行指令printf("******进程中指令访问次序如下:(由随机数产生)*******\n");for(int i=0;i<320;i++){//进程中的320条指令访问次序的生成num[i]=m;//当前执行的指令数,if(flag%2==0)m=++m%320;//顺序执行下一条指令if(flag==1)m=rand()%(m-1);//通过随机数,跳转到低地址部分[0,m-1]的一条指令处,设其序号为m1if(flag==3)m=m+1+(rand()%(320-(m+1)));//通过随机数,跳转到高地址部分[m1+2,319]的一条指令处,设其序号为m2flag=++flag%4;printf(" %03d",num[i]);//输出格式:3位数if((i+1)%10==0) //控制换行,每个页面可以存放10条指令,共32个页面printf("\n");}}void pagestring() //显示调用的页面序列,求出此进程按次序执行的各指令所在的页面号并显示输出{for(int i=0;i<320;i++){printf(" %02d",num[i]/10);//输出格式:2位数if((i+1)%10==0)//控制换行,每个页面可以存放10条指令,共32个页面printf("\n");}}void OPT() //最佳替换算法{int n=0;//记录缺页次数int exist,space,position;int curpage;//当前指令的页面号for(int i=0;i<320;i++){m=num[i];curpage=m/10;exist=pageExist(curpage);if(exist==-1){ //当前指令的页面号不在物理块中space=findSpace();if(space != -1){ //当前存在空闲的物理块block[space].pagenum = curpage; //将此页面调入存display();//显示物理块中的页面号n++;//缺页次数+1}else{ //当前不存在空闲的物理块,需要进行页面置换for(int k=0;k<blocknum;k++){for(int j=i;j<320;j++){//找到在最长(未来)时间不再被访问的页面if(block[k].pagenum!= num[j]/10){block[k].accessed = 1000;} //将来不会被访问,设置为一个很大数else{ //将来会被访问,访问量设为jblock[k].accessed = j;break;}}}position = findReplace();//找到被置换的页面 ,淘汰block[position].pagenum = curpage;// 将新页面调入display();n++; //缺页次数+1}}}printf("缺页次数:%d\n",n);printf("缺页率:%f%%\n",(n/320.0)*100);}void LRU() //最近最久未使用算法{int n=0;//记录缺页次数int exist,space,position ;int curpage;//当前指令的页面号for(int i=0;i<320;i++){m=num[i];curpage=m/10;exist = pageExist(curpage);if(exist==-1){ //当前指令的页面号不在物理块中space = findSpace();if(space != -1){ //当前存在空闲的物理块block[space].pagenum = curpage; //将此页面调入存display();//显示物理块中的页面号n++;//缺页次数+1}else{ //当前不存在空闲的物理块,需要进行页面置换position = findReplace();block[position].pagenum = curpage;display();n++; //缺页次数+1}}elseblock[exist].accessed = -1;//恢复存在的并刚访问过的BLOCK中页面accessed为-1for(int j=0; j<blocknum; j++){//其余的accessed++block[j].accessed++;}}printf("缺页次数:%d\n",n);printf("缺页率:%f%%\n",(n/320.0)*100);}void FIFO(){int n=0;//记录缺页次数int exist,space,position ;int curpage;//当前指令的页面号int blockpointer=-1;for(int i=0;i<320;i++){m=num[i];curpage=m/10;exist = pageExist(curpage);if(exist==-1){ //当前指令的页面号不在物理块中space = findSpace();if(space != -1){ //当前存在空闲的物理块blockpointer++;block[space].pagenum=curpage; //将此页面调入存n++;//缺页次数+1display();//显示物理块中的页面号}else{ // 没有空闲物理块,进行置换position = (++blockpointer)%4;block[position].pagenum = curpage; //将此页面调入存n++;display();}}}printf("缺页次数:%d\n",n);printf("缺页率:%f%%\n",(n/320.0)*100);}void main(){int choice;printf("************请求分页存储管理模拟系统*************\n");. . .randam();printf("************此进程的页面调用序列如下**************\n");pagestring();while(choice != 4){printf("********1:OPT 2:LRU 3:FIFO 4:退出*********\n");printf("请选择一种页面置换算法:");scanf("%d",&choice);init();switch(choice){case 1:printf("最佳置换算法OPT:\n");printf("页面号物理地址页面号物理地址页面号物理地址页面号物理地址\n");OPT();break;case 2:printf("最近最久未使用置换算法LRU:\n");printf("页面号物理地址页面号物理地址页面号物理地址页面号物理地址\n");LRU();break;case 3:printf("先进先出置换算法FIFO:\n");printf("页面号物理地址页面号物理地址页面号物理地址页面号物理地址\n");FIFO();break;}}}.. ..。