版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024版二手摩托车买卖合同中违约责任与赔偿条款3篇
- 2024年度装修材料供应与质量验收合同2篇
- 2024版宿舍消防设施检查维护合同2篇
- 2024年版园林绿化工程分包合同
- 2024版企业融资租赁保函担保服务协议2篇
- 2024年度OEM新能源设备委托制造及市场推广合同2篇
- 2024年个人汽车贷款抵押协议样本2篇
- 2024版办公场地租赁合同-含办公家具租赁及升级2篇
- 2024年企业融资借款合同3篇
- 幼儿学期工作计划范文合集八篇
- 钹式换能器的共振特性研究
- 《我们去看海》阅读答案
- 智慧酒店无人酒店综合服务解决方案
- 考研英语一新题型历年真题(2005-2012)
- 健身房会籍顾问基础培训资料
- 9脊柱与四肢、神经系统检查总结
- 秀场内外-走进服装表演艺术智慧树知到答案章节测试2023年武汉纺织大学
- 【高分复习笔记】王建《现代自然地理学》(第2版)笔记和课后习题详解
- TSGD0012023年压力管道安全技术监察规程-工业管道(高清晰版)
- SMM英国建筑工程标准计量规则中文 全套
- 2023-2024学年浙江省富阳市小学数学四年级上册期末通关题
评论
0/150
提交评论