段页式虚拟存储管理_第1页
段页式虚拟存储管理_第2页
段页式虚拟存储管理_第3页
段页式虚拟存储管理_第4页
段页式虚拟存储管理_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、word#include <stdio.h>#include <time.h>#include <stdlib.h>#define Processcount 10/假设进程数为10#define AssumeBlock100/假设内存块大小有100块#define Segnumber 4/假设每个进程最大段数是4#define Keepmemory 8/驻留集大小#define SegLength 16/段长最长16/*页表相关信息*/ typedef struct int pageNumber; int frameNumber; int pageFlag;

2、 int accesstime; int runcount; Page;/段表相关信息*typedef struct int segmentNumber; int segmentlength; /段长即每一个段的页数 int startAddress; Page pagenumSegLength; int segFlag; int pagereal; Segment;/*进程相关信息*/ typedef struct Segment segmentSegnumber; int isInmemory; int segtotalnumber; int inpage;/载入内存中的页数 int se

3、greal; Process;int blocksize;/块大小int blocknumbers;/块数量int processnumber;/进程数量int AvailableBlock;/内存中可用块数量int offset;/页内偏移量Process processProcesscount;/进相关信息程int memoryAssumeBlock;/内存块相关信息int occupied;/已被占用的内存块数量void Applyspace() printf("*内存空间申请*n");printf("输入进程数目:");scanf("%

4、d",&processnumber);while(processnumber<=0|processnumber>Processcount)printf("警告:进程数目不能大于10且不能小于0,请重新输入:");scanf("%d",&processnumber);for(int i=0;i<processnumber;i+)printf("n");printf("%d号进程有几个段:",i);scanf("%d",&processi.segt

5、otalnumber);while(processi.segtotalnumber<=0|processi.segtotalnumber>4)printf("警告:进程每个段的数目不能大于4且不能小于0,请重新输入:");scanf("%d",&processi.segtotalnumber);for(int j=0;j<processi.segtotalnumber;j+)printf("%d号段需要的段长是多少:",j);scanf("%d",&processi.segment

6、j.segmentlength);while(processi.segmentj.segmentlength<0|processi.segmentj.segmentlength>16)printf("警告:进程每个段的段长不能大于16且不能小于0,请重新输入:");scanf("%d",&processi.segmentj.segmentlength);for(int k=0;k<processi.segmentj.segmentlength;k+)processi.segmentj.pagenumk.accesstime=0;

7、processi.segmentj.pagenumk.runcount=0;processi.segmentj.pagenumk.frameNumber=-1;processi.segment0.startAddress=0;int address=processi.segment0.startAddress;for(int c=0;c<processi.segtotalnumber;c+)processi.segmentc+1.startAddress=address+processi.segmentc.segmentlength*1024;void InitMemory()int i

8、;int ran1,ran2,ran3,ran4;printf("*内存初始化*n");printf("请输入内存块数正整数形式:n");scanf("%d",&blocknumbers);while(blocknumbers<=0|blocknumbers>AssumeBlock)printf("警告:内存输入无效,请重新输入!n");scanf("%d",&blocknumbers);AvailableBlock=blocknumbers;printf("

9、;请输入内存中块大小正整数形式n");scanf("%d",&blocksize);while(blocksize<=0|blocksize>20)printf("警告:块大小输入无效,请重新输入!n");scanf("%d",&blocksize);/*初始时内存中各块均初始化为空*/for(i=0;i<blocknumbers;i+)memoryi=0;srand(unsigned)time(NULL);ran1=rand()%64;ran2=rand()%64;ran3=rand()%

10、64;ran4=rand()%64;memoryran1=1;memoryran2=1;memoryran3=1;memoryran4=1;printf("已被占用的块有:%d,%d,%d,%dn",ran1,ran2,ran3,ran4);void printfAvailable(int j)int i=0;AvailableBlock=blocknumbers-occupied;if(AvailableBlock!=0)printf("对于%d号进程有%d块可用",j,AvailableBlock);printf("n");int

11、 Judge(int use,int block1)if(use>=block1)printf("内存已满n");return 2;else return 3;int Judgekeepmemory(int i,int inpage1)if(inpage1>=Keepmemory)printf("%d号进程的驻留集已满n",i);return 2;else return 3;void printTable(int j)printf("*%d号进程的段表信息如下*n",j);printf(" 段号 在内存中 段长

12、基地址 n");for(int m=0;m<processj.segtotalnumber;m+)printf(" %d %d %d %dn",m,processj.segmentm.segFlag,processj.segmentm.segmentlength,processj.segmentm.startAddress);for(int k=0;k<processj.segtotalnumber;k+)printf("n");printf("n");printf("*%d号进程%d号段的页表信息如下

13、*n",j,k);for(int m=0;m<processj.segmentk.segmentlength;m+)printf("页号 块号 载入时间 n");printf(" %d%d %d n",m,processj.segmentk.pagenumm.frameNumber,processj.segmentk.pagenumm.runcount);printf("n");void Allocate()occupied=0;int mem;int i=0;int page1,seg;printf("*内

14、存分配*n");while(i<processnumber)mem=0;printf("n");printfAvailable(i);processi.inpage=0;processi.segreal=0;for( seg=0;seg<processi.segtotalnumber;seg+)processi.segmentseg.pagereal=0;for( page1=0;page1<processi.segmentseg.segmentlength;page1+)while(memorymem=1)/查找内存中的空闲块mem+;/*判断

15、驻留集是否满*/int judge1=Judgekeepmemory(i,processi.inpage);/*判断内存是否已满*/int judge2=Judge(occupied,blocknumbers);if(judge1=2)seg=processi.segtotalnumber;page1=processi.segmentseg.segmentlength;else if(judge2=3)processi.isInmemory=1;processi.inpage+;occupied+;processi.segmentseg.pagenumpage1.frameNumber=mem

16、;processi.segmentseg.pagenumpage1.pageFlag=1;processi.segmentseg.segFlag=1;processi.segmentseg.pagereal+;memorymem=1;mem+;for(int p1=0;p1<=processi.segtotalnumber;p1+)for(int p=0;p<=processi.segmentp1.segmentlength;p+)if(processi.segmentp1.pagenump.pageFlag=1)processi.segmentp1.pagenump.runcou

17、nt+;processi.segmentp1.pagenump.accesstime+;elseprocessi.segmentp1.pagenump.frameNumber=-1;elsei=processnumber;/内存已满时跳出循环,不再进行内存分配/end for(int page1=0;page1<processi.segmentseg.segmentlength;page1+)if(processi.segmentseg.segFlag=1)processi.segreal+;/end for(int seg=0;seg<processi.segtotalnumbe

18、r;seg+)i+;for(int j=0;j<processnumber;j+) printf("*%d号进程的段表信息如下*n",j);printf(" 段号 在内存中 段长 基地址 n");for(int m=0;m<processj.segtotalnumber;m+)printf(" %d %d %d %dn",m,processj.segmentm.segFlag,processj.segmentm.segmentlength,processj.segmentm.startAddress);for(int k=

19、0;k<processj.segtotalnumber;k+)printf("n");printf("n");printf("*%d号进程%d号段的页表信息如下*n",j,k);for(int m=0;m<processj.segmentk.segmentlength;m+)printf("页号 块号 载入时间n");printf(" %d%d %dn",m,processj.segmentk.pagenumm.frameNumber,processj.segmentk.pagenu

20、mm.runcount);printf("n");void transform(int processnumber7,int segmentnumber7, int pagenumber7,int seglong,int pagelong)processprocessnumber7.segmentsegmentnumber7.pagenumpagenumber7.frameNumber=processprocessnumber7.segmentseglong.pagenumpagelong.frameNumber;processprocessnumber7.segments

21、egmentnumber7.pagenumpagenumber7.pageFlag=1;processprocessnumber7.segmentsegmentnumber7.segFlag=1;processprocessnumber7.segmentseglong.pagenumpagelong.frameNumber=-1;processprocessnumber7.segmentseglong.pagenumpagelong.pageFlag=0;processprocessnumber7.segmentseglong.pagenumpagelong.accesstime=0;proc

22、essprocessnumber7.segmentseglong.pagenumpagelong.runcount=0;for(int p1=0;p1<=processprocessnumber7.segtotalnumber;p1+)for(int p=0;p<=processprocessnumber7.segmentp1.segmentlength;p+)if(processprocessnumber7.segmentp1.pagenump.pageFlag=1)processprocessnumber7.segmentp1.pagenump.runcount+;proces

23、sprocessnumber7.segmentp1.pagenump.accesstime+;LRU(int processnumber7,int segmentnumber7,int pagenumber7)int pagelong=0,seglong=0;int maxtime=process0.segment0.pagenum0.accesstime;for(int i=0;i<processprocessnumber7.inpage;i+)for(int j=0;j<processprocessnumber7.segtotalnumber;j+)for(int k=0;k&

24、lt;processprocessnumber7.segmentj.segmentlength;k+)if(processprocessnumber7.segmentj.pagenumk.pageFlag=1)if(maxtime<processprocessnumber7.segmentj.pagenumk.accesstime)maxtime=processprocessnumber7.segmentj.pagenumk.accesstime;seglong=j;pagelong=k;transform(processnumber7,segmentnumber7, pagenumbe

25、r7,seglong,pagelong);return 1;void FIFO(int processnumber6,int segmentnumber6,int pagenumber6)int seglong=0,pagelong=0;int longest=processprocessnumber6.segment0.pagenum0.runcount;for(int i=0;i<processprocessnumber6.inpage;i+)for(int j=0;j<processprocessnumber6.segtotalnumber;j+)for(int k=0;k&

26、lt;processprocessnumber6.segmentj.segmentlength;k+)if(longest<processprocessnumber6.segmentj.pagenumk.runcount)longest=processprocessnumber6.segmentj.pagenumk.runcount;seglong=j;pagelong=k;transform(processnumber6,segmentnumber6, pagenumber6,seglong,pagelong);/*地址映射*/void printPhysical(int proces

27、snumber5,int segmentnumber5,int pagenumber5,int offset1)int physicalAddress=processprocessnumber5.segmentsegmentnumber5.pagenumpagenumber5.frameNumber*1024;printf("该逻辑地址所对应的物理地址是%d n", physicalAddress+offset1);/*页面置换*/void replace(int processnumber6,int segmentnumber6,int pagenumber6)int o

28、ffset1,flag;int seg1=0;printf("%d号进程的%d号段中的%d号页将被装入内存n",processnumber6,segmentnumber6,pagenumber6);printf("输入1表使用LRU策略,输入其他表示使用FIFO策略n");scanf("%d",&flag);if(flag=1)LRU(processnumber6,segmentnumber6,pagenumber6 );printf("%d号进程的%d段%d页已被装入内存,请输入其业内偏移量n",proc

29、essnumber6,segmentnumber6,pagenumber6);scanf("%d",&offset1);printPhysical(processnumber6,segmentnumber6,pagenumber6,offset1);elseFIFO(processnumber6,segmentnumber6,pagenumber6);printf("%d号进程的%d段%d页已被装入内存,请输入其业内偏移量n",processnumber6,segmentnumber6,pagenumber6);scanf("%d&qu

30、ot;,&offset1);printPhysical(processnumber6,segmentnumber6,pagenumber6,offset1);printTable(processnumber6);void replaceseg(int processnumber4,int segmentnumber4,int seglength)int offset1,flag;int seg1=0;for(int p=0;p<=processprocessnumber4.segmentsegmentnumber4.pagereal;p+)printf("%d号进程的%

31、d号段中的%d号页将被装入内存n",processnumber4,segmentnumber4,p);printf("输入1表使用LRU策略,输入其他表示使用FIFO策略n");scanf("%d",&flag);if(flag=1)LRU(processnumber4,segmentnumber4,p );printf("%d号进程的%d段%d页已被装入内存,请输入其业内偏移量n",processnumber4,segmentnumber4,p);scanf("%d",&offset1)

32、;printPhysical(processnumber4,segmentnumber4,p,offset1);elseFIFO(processnumber4,segmentnumber4,p);printf("%d号进程的%d段%d页已被装入内存,请输入其业内偏移量n",processnumber4,segmentnumber4,p);scanf("%d",&offset1);printPhysical(processnumber4,segmentnumber4,p,offset1);/*进程缺段缺页判断*/void Locate()int p

33、rocessnumber4,segmentnumber4,pagenumber4;printf("请输入你想要访问的进程号n");scanf("%d",&processnumber4);if(processnumber4<=processnumber)if(processprocessnumber4.isInmemory!=1)printf("该进程不在内存中n");elseprintf("请输入你想要访问的段号n");scanf("%d",&segmentnumber4)

34、;if(segmentnumber4>processprocessnumber4.segtotalnumber)printf("段地址越界,访问失败n");else if(processprocessnumber4.segmentsegmentnumber4.segFlag!=1)printf("该段不在内存中,将进行缺段处理n");replaceseg(processnumber4,segmentnumber4,processprocessnumber4.segmentsegmentnumber4.segmentlength);elseprint

35、f("请输入你想要访问的页号n");scanf("%d",&pagenumber4);if(pagenumber4>processprocessnumber4.segmentsegmentnumber4.segmentlength)printf("页地址越界,访问失败n");elseif(processprocessnumber4.segmentsegmentnumber4.pagenumpagenumber4.pageFlag!=1)printf("该页不在内存中,将进行缺页处理n");replac

36、e(processnumber4,segmentnumber4,pagenumber4);elseprintf("请输入页内偏移量n");scanf("%d",&offset);processprocessnumber4.segmentsegmentnumber4.pagenumpagenumber4.accesstime=1;processprocessnumber4.segmentsegmentnumber4.pagenumpagenumber4.runcount+;printPhysical(processnumber4,segmentnumber4,pagenumber4,offset);for(int p1=0;p1<=processprocessnumber4.segreal;p1+)for(int p=0;p<=

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论