您好,欢迎访问三七文档
当前位置:首页 > 行业资料 > 其它行业文档 > 段页式存储管理设计文档
项目一单处理器系统的进程调度11《操作系统》综合实训项目设计文档一、基本信息项目名称:段页式虚拟存储管理完成人姓名:余凡学号:2011118009完成日期:2014年5月29日二、实验内容与目的编写程序完成段页式虚拟存储管理存储分配、地址重定位和缺段,缺页中断处理。(1)为一个进程的内存申请(多少个段,每个段多大)分配内存,当一个进程(完成)结束时回收内存;(2)对一个给定逻辑地址,判断其是否缺段、缺页,若不缺段、不缺页,则映射出其物理地址;(3)若缺段则进行缺段中断处理,若缺页则进行缺页中断处理。(4)由用户确定输入内存块数量和块大小,进程逻辑地址空间最多4个段,每个段最大16K,进程驻留集大小为8页。假设进程运行前未预先装入任何地址空间,页面淘汰策略采用局部(驻留集内)置换策略。输出每次存储分配/回收时,内存自由块分布情况、相关进程的段表和页表信息。实验目的1、加深理解段页式虚拟存储管理的概念和原理。2、掌握段页式存储管理中存储分配(和回收)方法;3、深入了解段页式虚拟存储管理中地址重定位(即地址映射)方法。4、深入理解段页式虚拟存储管理中缺段、缺页中断处理方法。三、主要设计思路和流程图设计思路:从进程和内存两大模块出发:(1)内存初始化,提示用户输入内存块数和大小,每一块内存初值都置为0,表示内存空闲;(2)进程申请空间,用户输入进程数目,每个进程的段数,每段的页数,设置每个进程每段每页的页框号均为-1,表示未被载入内存,每页的运行时间也都为0,方便之后的LRU算法或者FIFO算法置换被淘汰的页;(3)为进程分配内存,对于每个进程每段每页都先判断当前内存是否已满,若未满,则判断该进程驻留集是否已满,若驻留集未满,则为该页分配一块内存,将该块内存的值置为1,该页的页框号即为找到的空闲块号,该页和该段的页标志量均置为1,每次为当前页分配内存时,都将该进程中已载入内存中的页的runtime和accesstime加1,方便方便之后的LRU算法或者FIFO算法置换被淘汰的页,并输出系统为其分配内存后的段表和页表内容。若该进程的驻留集已满,则执行下一个进程,重复执行上述动作。若内存已满,则停止内存分配,跳出该循环,询问用户是否进行地址重定位;(4)地址重定位时,提醒用户输入要访问的进程号,判断该进程是否在内存中,若在则提醒输入进程段号,判断该进程的这个段的标志量是否为1,若是则输入页号,判断页标志量是否为1,若是则输入偏移量,完成逻辑地址到物理地项目一单处理器系统的进程调度22址的映射,若段标志量或页标志量不为1,则发生缺段或缺页中断,进行中断处理,选择LRU或者FIFO中断处理,并输出缺段或缺页中断处理后的段表和页表信息。流程图:初始化内存块,输入内存块数和内存块大小,每个内存块的初值置为0进程申请空间,确定进程数目,每个进程的段数,每段的页数,初始化每页的相关信息内存分配,修改该页相关信息地址转换N开始内存分配判断内存是否已满判断进程驻留集是否已满YNY项目一单处理器系统的进程调度33访问的输入要访问的进程号跳出本该进程的内存分配循环,开始下一个进程的内存分配判断是否缺段缺段中断处理YLRU页面置换或者FIFONLRU缺页置换Y判断进程是否在内存中输入段号输入页号判断是否缺页FIFO缺页置换完成逻辑地址到物理地址的映射NY输出页面置换后的段表页表信息项目一单处理器系统的进程调度44N项目一单处理器系统的进程调度55四、主要数据结构及其说明/*页表相关信息*/typedefstruct{intframeNumber;intpageFlag;intaccesstime;intruncount;}Page;/*段表相关信息*/typedefstruct{intsegmentlength;//段长即每一个段的页数intstartAddress;Pagepagenum[SegLength];intsegFlag;intpagereal;}Segment;/*进程相关信息*/typedefstruct{Segmentsegment[Segnumber];intisInmemory;intsegtotalnumber;intinpage;//载入内存中的页数intsegreal;}Process;intblocksize;//块大小intblocknumbers;//块数量intprocessnumber;//进程数量intAvailableBlock;//内存中可用块数量intoffset;//页内偏移量Processprocess[Processcount];//进相关信息程intmemory[AssumeBlock];//内存块相关信息intoccupied;//已被占用的内存块数量五、程序运行时的初值和运行结果测试用例如下:确定内存块数为23;块大小为1K;进程个数2;(1)0号进程有3个段0号段的页数21号段的页数3项目一单处理器系统的进程调度662号段的页数4(2)1号进程有3个段0号段的页数31号段的页数42号段的页数5(3)需要进行地址映射的进程号,段号,页号,页内偏移量进程号0段号0页号1页内偏移量234进程号1段号2页号1程序的运行结果:进程空间申请完毕,各进程的段表页表信息项目一单处理器系统的进程调度77项目一单处理器系统的进程调度88开始内存访问,访问成功的情况内存访问发生缺页中断项目一单处理器系统的进程调度99缺页中断处理后,打印段表页表信息项目一单处理器系统的进程调度1010六、源程序及注释#includestdio.h#defineProcesscount10//假设进程数为10#defineAssumeBlock100//假设内存块大小有100块#defineSegnumber4//假设每个进程最大段数是4#defineKeepmemory8//驻留集大小#defineSegLength16//段长最长16/*页表相关信息*/typedefstruct{intpageNumber;intframeNumber;intpageFlagintaccesstime;intruncount;}Page;/*段表相关信息*typedefstruct{intsegmentNumber;intsegmentlength;//段长即每一个段的页数intstartAddress;Pagepagenum[SegLength]intsegFlag;intpagereal;}Segment;项目一单处理器系统的进程调度1111/*进程相关信息*/typedefstruct{Segmentsegment[Segnumber];intisInmemory;intsegtotalnumber;intinpage;//载入内存中的页数intsegreal;}Process;intblocksize;//块大小intblocknumbers;//块数量intprocessnumber;//进程数量intAvailableBlock;//内存中可用块数量intoffset;//页内偏移量Processprocess[Processcount];//进相关信息程intmemory[AssumeBlock];//内存块相关信息intoccupied;//已被占用的内存块数量voidApplyspace(){printf(*************内存空间申请**************\n);printf(输入进程数目:);scanf(%d,&processnumber);while(processnumber=0||processnumberProcesscount){printf(警告:进程数目不能大于10且不能小于0,请重新输入:);scanf(%d,&processnumber);}for(inti=0;iprocessnumber;i++){printf(\n);printf(%d号进程有几个段:,i);scanf(%d,&process[i].segtotalnumber);while(process[i].segtotalnumber=0||process[i].segtotalnumber4){printf(警告:进程每个段的数目不能大于4且不能小于0,请重新输入:);scanf(%d,&process[i].segtotalnumber);}for(intj=0;jprocess[i].segtotalnumber;j++){项目一单处理器系统的进程调度1212printf(%d号段需要的段长是多少:,j);scanf(%d,&process[i].segment[j].segmentlength);while(process[i].segment[j].segmentlength0||process[i].segment[j].segmentlength16){printf(警告:进程每个段的段长不能大于16且不能小于0,请重新输入:);scanf(%d,&process[i].segment[j].segmentlength);}for(intk=0;kprocess[i].segment[j].segmentlength;k++){process[i].segment[j].pagenum[k].accesstime=0;process[i].segment[j].pagenum[k].runcount=0;process[i].segment[j].pagenum[k].frameNumber=-1;}}process[i].segment[0].startAddress=0;intaddress=process[i].segment[0].startAddress;for(intc=0;cprocess[i].segtotalnumber;c++)process[i].segment[c+1].startAddress=address+process[i].segment[c].segmentlength*1024;}}voidInitMemory(){inti;printf(**************内存初始化***************\n);printf(请输入内存块数(正整数形式):\n);scanf(%d,&blocknumbers);while(blocknumbers=0||blocknumbersAssumeBlock){printf(警告:内存输入无效,请重新输入!\n);scanf(%d,&blocknumbers);}AvailableBlock=blocknumbers;printf(请输入内存中块大小(正整数形式)\n);scanf(%d,&blocksize);while(blocksize=0||blocksize20){项目一单处理器系统的进程调度1313printf(警告:块大小输入无效,请重新输入!n);scanf(%d,&blocksize);}/*初始时内存中各块均初始化为空*/for(i=0;iblocknumbers;i++){memory[i]=0;}}voidprintfAvailable(intj){inti=0;AvailableBlock=blocknumbers-occupied;if(AvailableBlock!=0)printf(对于%d号进程有%d块可用,j,AvailableBlock);/*while(iblocknumbers){if(memory[i]==0)printf(%d,i);i++;}*/printf(\n);}intJudge(intuse,intblock1){if(use=block1){printf(内存已满\n);return2;}elsereturn3;}intJudgekeepmemory(inti,intinpage1){if(inpage1=Keepmemory)
本文标题:段页式存储管理设计文档
链接地址:https://www.777doc.com/doc-5755077 .html