实验三 存储管理实验

合集下载

实验三存储管理实验

实验三存储管理实验

实验三存储管理实验 Pleasure Group Office【T985AB-B866SYT-B182C-BS682T-STT18】实验三存储管理实验一. 目的要求:1、通过编写和调试存储管理的模拟程序以加深对存储管理方案的理解。

熟悉虚存管理的各种页面淘汰算法。

2、通过编写和调试地址转换过程的模拟程序以加强对地址转换过程的了解。

二.实验内容:1、设计一个固定式分区分配的存储管理方案,并模拟实现分区的分配和回收过程。

可以假定每个作业都是批处理作业,并且不允许动态申请内存。

为实现分区的分配和回收,可以设定一个分区说明表,按照表中的有关信息进行分配,并根据分区的分配和回收情况修改该表。

算法描述:本算法将内存的用户区分成大小相等的四个的分区,设一张分区说明表用来记录分区,其中分区的表项有分区的大小、起始地址和分区的状态,当系统为某个作业分配主存空间时,根据所需要的内存容量,在分区表中找到一个足够大的空闲分区分配给它,然后将此作业装入内存。

如果找不到足够大的空闲分区,则这个作业暂时无法分配内存空间,系统将调度另一个作业。

当一个作业运行结束时,系统将回收改作业所占据的分区并将该分区改为空闲。

算法原程序#include ""#include ""#include <>#include <>#define PCB_NUM 5 行程序.");printf("\n\t\t\t0.退出程序.");scanf("%d",&m);switch(m){case1:break;case0:system("cls");menu();break;default:system("cls");break;}}void paixu(struct MemInf* ComMem,int n){int i,j,t;for(j=0; j<n-1; j++)for(i=0; i<n-j-1; i++)if(ComMem[i].size>ComMem[i+1].size){t=ComMem[i].size;ComMem[i].size=ComMem[i+1].size;ComMem[i+1].size=t;}}void paixu2(){int i,j,t;for(j=0; j<4; j++)for(i=0; i<4-j; i++)if(pcbList[i].size>pcbList[i+1].size){t=pcbList[i].size;pcbList[i].size=pcbList[i+1].size; pcbList[i+1].size=t;}}void main(){DD:menu();char ch;int i,j,n,a=0;struct MemInf* ComMem;system("cls");printf("你要分多少个分区呢,请输入数值吧:");scanf("%d",&n);ComMem=(struct MemInf*)malloc(n*sizeof(struct MemInf));printf("请划分内存固定大小分区:\n");ize);if(i==0) ComMem[i].addr=40;ddr=ComMem[i-1].addr+ComMem[i-1].size;tate=0;ize+a;if(a>=INT){printf("超出规定内存范围");ch=getchar();ch=getchar();goto DD;}}paixu(ComMem,n);cbID =1;pcbList[0].RunState =0; ize=30;pcbList[0].RunTime =0;pcbList[0].TolTime =5;pcbList[1].pcbID =2;pcbList[1].RunState =0;pcbList[1].size=15;pcbList[1].RunTime =0;pcbList[1].TolTime =6;pcbList[2].pcbID =3;pcbList[2].RunState =0;pcbList[2].size=50;pcbList[2].RunTime =0;pcbList[2].TolTime =3;pcbList[3].pcbID =4;pcbList[3].RunState =0;pcbList[3].size=120;pcbList[3].RunTime =0;pcbList[3].TolTime =4;pcbList[4].pcbID =5;pcbList[4].RunState =0;pcbList[4].size=125;pcbList[4].RunTime =0;pcbList[4].TolTime =9;ch=getchar();ch=getchar();while(pcbList[PCB_NUM-1].RunTime < pcbList[PCB_NUM-1].TolTime){{for(j=0; j<PCB_NUM; j++){tate ==0&& pcbList[j].RunState==0) ize >= pcbList[j].size) tate =pcbList[j].pcbID ;pcbList[j].RunState=1;}}unTime >=pcbList[j].TolTime) tate == pcbList[j].pcbID){ComMem[i].state =0; unState=2; unState==1&& pcbList[i].RunTime < pcbList[i].TolTime) unTime++;cbID,pcbList[i].size, pcbList[i].RunState,pcbList[i].TolTime ,pcbList[i].RunTime);printf("分区ID\t 分区大小\t 状态\n");for(i=0; i<n; i++)printf("%d\t %d\t\t %d\n",i,ComMem[i].size ,ComMem[i].state );printf("按回车键继续...\n");getchar(); tart=-1;frees[i].length=0;strcpy(frees[i].tag,"free");occupys[i].start=-1;occupys[i].length=0;strcpy(occupys[i].tag,"");}free_quantity=0;occupy_quantity=0;}void writedata() tart);printf("输入第%d个分区的长度:\n",j);scanf("%d",&frees[i].length);}if((fp=fopen(fname,"wb"))==NULL)printf("错误,文件打不开,请检查文件名\n");for(i=0;i<SIZE;i++)if(fwrite(&frees[i],sizeof(struct node),1,fp)!=1)printf("文件写入错误!\n");fclose(fp);}void readdata() tart<=frees[t].start)t=j;}frees[free_quantity].start=frees[i].start;frees[free_quantity].length=frees[i].length;frees[i].start=frees[t].start;frees[i].length=frees[t].length;frees[t].start=frees[free_quantity].start;frees[t].length=frees[free_quantity].length;}}void view() tart,frees[i].length,frees[i].tag);printf("\n\n已分配分区表显示如下:\n");printf("起始地址\t长度\t占用作业名\n");for(j=0;j<occupy_quantity;j++)printf("%6dk\t%10dk\t%s\t\n",occupys[j].start,occupys[j].length,occupys[j].t ag);getchar();getchar();}void earliest() ength>=joblength)f=1;}if(f==0){printf("\n当前没有能满足你申请长度的空闲内存,请稍候再试\n");getchar();}else{ ength>=joblength){t=1;}j++;}j--;occupys[occupy_quantity].start=frees[j].start; ag,jobname); occupys[occupy_quantity].length=joblength;occupy_quantity++;if(frees[j].length>joblength){frees[j].start+=joblength;frees[j].length-=joblength;}else{for(i=j;i<free_quantity-1;i++){frees[i].start=frees[i+1].start;frees[i].length=frees[i+1].length;}free_quantity--;}printf("作业申请内存空间成功!\n");getchar();getchar();}}void excellent() ength>=joblength)f=1;}if(f==0){printf("\n当前没有能满足你申请长度的空闲内存,请稍候再试\n");getchar();}else ength>=joblength){t=1;}j++;}j--;for(i=0;i<free_quantity;i++){if(frees[i].length>=joblength&&frees[i].length<frees[j].length) j=i;}occupys[occupy_quantity].start=frees[j].start; ag,jobname);occupys[occupy_quantity].length=joblength;occupy_quantity++;if(frees[j].length>joblength){frees[j].start+=joblength;frees[j].length-=joblength;}else{for(i=j;i<free_quantity-1;i++){frees[i].start=frees[i+1].start;frees[i].length=frees[i+1].length;}free_quantity--;}printf("作业申请内存空间成功!\n");getchar();getchar();}}void worst(){char jobname[20];int joblength,f=0;int i,j;printf("请输入作业名:\n");scanf("%s",&jobname);printf("输入作业的长度:\n");scanf("%d",&joblength);for(i=0;i<free_quantity;i++){if(frees[i].length>=joblength)f=1;}if(f==0){printf("\n当前没有能满足你申请长度的空闲内存,请稍候再试\n");getchar();getchar();}else ength>=joblength){t=1;}j++;}j--;for(i=0;i<free_quantity;i++){if(frees[i].length>=joblength&&frees[i].length>frees[j].length) j=i;}occupys[occupy_quantity].start=frees[j].start; ag,jobname);occupys[occupy_quantity].length=joblength;occupy_quantity++;if(frees[j].length>joblength){frees[j].start+=joblength;frees[j].length-=joblength;}else{for(i=j;i<free_quantity-1;i++){frees[i].start=frees[i+1].start;frees[i].length=frees[i+1].length;}free_quantity--;}printf("作业申请内存空间成功!\n");getchar();getchar();}}void main(){initial();int n;writedata();system("cls");readdata();for(;;){sort();printf("************************************\n"); printf("************************************\n"); printf("** 欢迎使用可变分区存储管理系统 **\n");printf("************************************\n"); printf("** 1.显示空闲表和分配表 **\n");printf("** 2.首次适应算法 **\n");printf("** 3.最佳适应算法 **\n");printf("** 4.最坏适应算法 **\n");printf("** 0.退出系统 **\n"); printf("************************************\n"); printf("************************************\n"); printf("请输入您要选择的项目:\n");scanf("%d",&n);for(;;){if(n<0||n>4){printf("没有这个选项,请重新输入!");scanf("%d",&n);}elsebreak;}switch(n){case0:printf("感谢您的使用!再见!\n");exit(0);case1:view();break;case2:earliest();break;case3:excellent();break;case4:worst();break;}system("cls");}}测试结果:使用首次适应算法的结果:使用最佳适应算法:使用最坏适应算法:内存过满:3、编写并调试一个段页式存储管理的地址转换的模拟程序。

实验三 动态分区存储管理

实验三 动态分区存储管理

实验三存储管理动态分区存储管理
实验目的
•熟悉并掌握动态分区分配的各种算法。

•熟悉并掌握动态分区中分区回收的各种情
况,并能够实现分区合并。

实验内容及要求
•用高级语言模拟实现动态分区存储管理,要求:
–分区分配算法至少实现首次适应算法、最佳适应算法和最坏适应算法中的至少一种。

熟悉并掌握各种算法的空闲区组织方式。

–分区的初始化——可以由用户输入初始分区的大小。

(初始化后只有一个空闲分区,起始地址为0,大小是用户输入的大小)–分区的动态分配过程:由用户输入作业号和作业的大小,实现分区过程。

–分区的回收:用户输入作业号,实现分区回收,同时,分区的合并要体现出来。

(注意:不存在的作业号要给出错误提示!)–分区的显示:任何时刻,可以查看当前内存的情况(起始地址是什么,大小多大的分区时空闲的,或者占用的,能够显示出来)
实验报告要求
•实验报告应包含但不限于以下内容:–设计图(结构图/流程图)和源代码;
–使用的编程语言和系统环境;
–结果截图;
–对结果截图的解释性说明。

注意事项
•三个动态分区分配算法可以使用一套程序,差别只在空闲分区链(表)的排序策略。

•至少完成一个分配算法。

•需完成回收算法。

计算机操作系统实验三 存储管理

计算机操作系统实验三 存储管理

南京信息工程大学实验(实习)报告实验(实习)名称存储管理实验(实习)日期 20131130 得分指导教师系计算机系专业计科年级 2011 班次 1 姓名汤建洋学号 201123080181. 实验目的本实验的目的是通过请求页式存储管理中页面置换算法模拟设计,了解虚拟存储技术的特点,掌握请求页式存储管理的页面置换算法,此外通过实验了解HASH表数据结构的使用。

2. 实验准备⑴数据结构HASH表查找方式。

⑵操作系统相关内存交换知识。

⑶阅读Linux系统的msg.c、sem.c和shm.c等源码文件,掌握几个LINUX函数getpid ( )、srand (int a)和int rand ( )的使用方法。

3. 实验内容设计一个虚拟存储区和内存工作区,并分别编程实现使用先进先出置换算法(FIFO)和最近最少使用页面置换算法(LRU)计算访问命中率。

4. 实验指导拥有页面交换机制的操作系统总是把当前进程中急需处理的部分页面换入到内存当中,而把更多暂时不需处理的页面放置在外存当中,由于进程需要处理页面的顺序不同,而需要在内存与外存之间进行页面交换,交换算法也就应运而生。

本实验并没有进入系统空间对实际进程页面进行控制,而是在用户空间用线性表的连续存储方式对进程页面交换进行的模拟。

⑴ FIFO算法实现<原理描述>在分配内存页面数(AP)小于进程页面数(PP)时,当然是最先的AP个页面放入内存;这时有需要处理新的页面,则将原理在内存中的AP个页面中最先进入的调出,然后放入新页面;以后如果有新页面需要调入,按(2)之规则进行。

算法特点:所使用的内存页面构成一个队列。

<算法实现提示>要得到“命中率”,必然应该有一个常量total_instruction记录页面总共使用次数;此外需要一个变量记录总共换入页面的次数(需要换出页面,总是因为没有命中而产生的)diseffect。

利用公式(1-diseffect/total_instructiong)×100%可以得到命中率。

实验三 存储管理实验

实验三 存储管理实验

实验三存储管理实验一. 目的要求:1、通过编写和调试存储管理的模拟程序以加深对存储管理方案的理解。

熟悉虚存管理的各种页面淘汰算法。

2、通过编写和调试地址转换过程的模拟程序以加强对地址转换过程的了解。

二 . 例题设计一个请求页式存储管理方案。

并编写模拟程序实现之。

产生一个需要访问的指令地址流。

它是一系列需要访问的指令的地址。

为不失一般性,你可以适当地(用人工指定地方法或用随机数产生器)生成这个序列,使得 50%的指令是顺序执行的。

25%的指令均匀地散布在前地址部分,25%的地址是均匀地散布在后地址部分。

为简单起见。

页面淘汰算法采用 FIFO页面淘汰算法,并且在淘汰一页时,只将该页在页表中抹去。

而不再判断它是否被改写过,也不将它写回到辅存。

具体的做法可以是:产生一个需要访问的指令地址流;指令合适的页面尺寸(例如以 1K或2K为1页);指定内存页表的最大长度,并对页表进行初始化;每访问一个地址时,首先要计算该地址所在的页的页号,然后查页表,判断该页是否在主存——如果该页已在主存,则打印页表情况;如果该页不在主存且页表未满,则调入一页并打印页表情况;如果该页不足主存且页表已满,则按FIFO页面淘汰算法淘汰一页后调入所需的页,打印页表情况;逐个地址访问,直到所有地址访问完毕。

存储管理算法的流程图如下:三 . 实验题:1、设计一个固定式分区分配的存储管理方案,并模拟实现分区的分配和回收过程。

可以假定每个作业都是批处理作业,并且不允许动态申请内存。

为实现分区的分配和回收,可以设定一个分区说明表,按照表中的有关信息进行分配,并根据分区的分配和回收情况修改该表。

测试结果:注:(代码见工程task1)2、设计一个可变式分区分配的存储管理方案。

并模拟实现分区的分配和回收过程。

对分区的管理法可以是下面三种算法之一:首次适应算法循环首次适应算法最佳适应算法测试结果:注:(代码见工程task2)3、编写并调试一个段页式存储管理的地址转换的模拟程序。

计算机操作系统实验三存储器管理

计算机操作系统实验三存储器管理

计算机操作系统实验三存储器管理引言存储器管理是计算机操作系统中非常重要的一部分。

它负责管理计算机中的存储器资源,以便有效地分配和管理内存。

在操作系统的设计和实现中,存储器管理的性能和效率对整个系统的稳定性和性能有着重要的影响。

本文档将介绍计算机操作系统实验三中的存储器管理的实验内容及相关的知识点。

我们将从内存分区管理、页式存储管理和段式存储管理三个方面进行讨论。

内存分区管理内存分区管理是一种常见的存储器管理方法,旨在将物理内存分成若干个不同大小的区域,以便为不同的进程分配内存。

在实验三中,我们将学习和实现两种内存分区管理算法:首次适应算法和最佳适应算法。

首次适应算法是一种简单直观的算法,它从内存的起始位置开始查找第一个满足要求的空闲分区。

而最佳适应算法则是通过遍历整个内存空间,选择最合适的空闲分区来满足进程的内存需求。

通过实验,我们将学习如何实现这两种算法,并通过比较它们的性能和效果来深入理解内存分区管理的原理和实现。

页式存储管理页式存储管理是一种将物理内存分成固定大小的页框(page frame)和逻辑地址分成固定大小的页面(page)的管理方法。

在操作系统中,虚拟内存通过将进程的地址空间划分成大小相等的页面,并与物理内存中的页框相对应,实现了大容量的存储管理和地址空间共享。

在实验三中,我们将学习和实现页式存储管理的基本原理和算法。

我们将了解页表的结构和作用,以及如何通过页表将逻辑地址转换为物理地址。

此外,我们还将学习页面置换算法,用于处理内存不足时的页面置换问题。

段式存储管理段式存储管理是一种将逻辑地址分成不同大小的段并与物理内存中的段相对应的管理方法。

在操作系统的设计中,段式存储管理可以提供更灵活的地址空间管理和内存分配。

实验三将介绍段式存储管理的基本原理和实现方法。

我们将学习段表的结构和作用,以及如何通过段表将逻辑地址转换为物理地址。

同时,我们还将探讨段的分配和释放过程,并学习如何处理外部碎片的问题。

操作系统实验-存储管理

操作系统实验-存储管理

操作系统实验-存储管理操作系统实验-存储管理1、引言1.1 概述在操作系统中,存储管理是一个关键的任务。

它负责将程序和数据加载到内存中,管理内存的分配和回收,并确保不同进程之间的内存互不干扰。

本实验旨在深入了解并实践存储管理的相关概念和算法。

1.2 目的本实验的目的是让学生通过实际操作,了解存储管理的基本原理和常用算法,包括分页、分段和虚拟内存等。

通过实验,学生将学会如何实现内存分配和回收,以及处理内存碎片等问题。

1.3 实验环境- 操作系统:Windows、Linux、MacOS等- 编程语言:C、C++等2、实验步骤2.1 实验准备- 安装相应的开发环境和工具- 创建一个空白的项目文件夹,用于存放实验代码和相关文件2.2 实验一、分页存储管理- 理解分页存储管理的概念和原理- 实现一个简单的分页存储管理系统- 设计测试用例,验证分页存储管理的正确性和有效性2.3 实验二、分段存储管理- 理解分段存储管理的概念和原理- 实现一个简单的分段存储管理系统- 设计测试用例,验证分段存储管理的正确性和有效性2.4 实验三、虚拟存储管理- 理解虚拟存储管理的概念和原理- 实现一个简单的虚拟存储管理系统- 设计测试用例,验证虚拟存储管理的正确性和有效性3、实验结果分析3.1 分页存储管理结果分析- 分析分页存储管理系统的性能优缺点- 比较不同页面大小对系统性能的影响3.2 分段存储管理结果分析- 分析分段存储管理系统的性能优缺点- 比较不同段大小对系统性能的影响3.3 虚拟存储管理结果分析- 分析虚拟存储管理系统的性能优缺点- 比较不同页面置换算法对系统性能的影响4、总结与展望4.1 实验总结- 总结本次实验的收获和体会- 分析实验中遇到的问题和解决方法4.2 实验展望- 探讨存储管理领域的未来发展方向- 提出对本实验的改进意见和建议附件:无法律名词及注释:- 存储管理:操作系统中负责管理内存的任务,包括内存分配、回收和管理等功能。

实验三 存储器管理实验

实验三 存储器管理实验

实验三存储器管理实验◆实验名称:存储器管理实验◆仪器、设备:计算机◆参考资料:操作系统实验指导书◆实验目的:设计一个请求页式存储管理方案,并编写模拟程序实现。

◆实验内容:编写程序用来模拟虚拟页式存储管理中的页面置换要求:1.快表页面固定为4块2.从键盘输入N个页面号3.输出每次物理块中的页面号和缺页次数,缺页率◆实验原理、数据(程序)记录:#define PAGES 4 /* 物理块数*/#define N 16 /*最多输入的页面号*/int pages[PAGES][2]; /*page[i][0]保存页面号,page[i][1]保存页面存留时间*/int queue[N]; /*页面号数组*/void initialise(void) /*------------初始化:快表和页面号数组++++++++++++++*/ {int i;for(i=0;i<N;i++)queue[i]=-1;for(i=0;i<PAGES;i++){pages[i][0]=-1;pages[i][1]=0;}}int is_page_exist(int page) /*若还有空页,返回空页序号的相反数-1若存在,返回该页的序号若不存在,返回需要替换页面序号的相反数-1*/{int max;int replace;int i=0;max=pages[0][1];replace=0;for(;i<PAGES;i++)pages[i][1]++;i=0;while(i<PAGES&&pages[i][0]!=-1&&pages[i][0]!=page){if(max<pages[i][1]){max=pages[i][1];replace=i;}i++;}if(i==PAGES)return (0-replace-1);else if(pages[i][0]==page)return i;elsereturn (0-i-1);}int input_pages(void) /**************输入页面号*****************/ {int i=0;int num;printf("请输入1~16个页面:【输入0 结束】\n");scanf("%d",&num);while(num&&i<N){if(num>0&&num<=N){queue[i]=num;i++;scanf("%d",&num);}elseprintf("输入错误数据~!\n");}return i;}void display_pages(void) /* 输出物理块中的页面号*/{int i=0;for(;i<PAGES;i++)if (pages[i][0]!= -1) printf("%5d ",pages[i][0]);printf("\n");}void LRU(int * lack_page) /* 核心算法,LRU算法*/{int i=0;int temp;* lack_page=0;while(queue[i]!=-1){temp=is_page_exist(queue[i]);if(temp>-1) /*若已经存在,修改相应序号的属性值*/pages[temp][1]=1;else /*若不存在,修改返回序号的内容,并修改属性值*/ {(* lack_page)++;pages[0-temp-1][0]=queue[i];pages[0-temp-1][1]=1;}printf("第%2d个页面访问时物理块中的页面号:",i+1);display_pages();i++;}}int main(void){int lack=0;float totle_page=0;initialise();totle_page=(float)input_pages();LRU(&lack);printf("缺页数为:%d\n",lack);printf("缺页率为:%0.3f\n",lack/totle_page);}◆实验结果及分析输入数据:1 2 4 3 1 4 5 6输出结果:第1个页面访问时物理块中的页面号:1第2个页面访问时物理块中的页面号:1 2第3个页面访问时物理块中的页面号:1 2 4第4个页面访问时物理块中的页面号:1 2 4 3第5个页面访问时物理块中的页面号:1 2 4 3第6个页面访问时物理块中的页面号:1 2 4 3第7个页面访问时物理块中的页面号:1 5 4 3第8个页面访问时物理块中的页面号:1 5 4 6缺页次数:6缺页率:0.750通过实验,实现了利用LRU算法进行虚拟存储管理的模拟。

可变分区存储管理实验报告

可变分区存储管理实验报告

实验三可变分区存储管理
一、实验目的
通过编写可变分区存储模拟系统,掌握可变分区存储管理的基本原理,分区的分配与回收过程。

二、实验内容与步骤
1.打开程序,所得程序界面窗口如图3-1:
图3-1
2.首先选择算法:是否使用搬家算法,可以通过界面上的按钮或算法菜单栏进行
选择;如果不先选择算法,其他功能将被隐藏;注意:在程序执行过程中,不可以重新选择算法。

3.进行初始化:设置内存大小,可以选择默认值400KB;确定内存大小前,其他
操作将被屏蔽。

4.初始化内存大小以后,就可以进行添加进程操作。

5.添加一个进程后,撤消进程功能被激活,可以撤消一个选定的进程或所有的进
程(图3-2)
图3-2
6.查询功能:可以通过按钮或菜单栏显示内存状态图形、空闲区图表,还可以在内存状态条里闪烁显示某一在空闲区图表选中的空闲区。

7.内存不足但经过搬家算法可以分配内存空间给进程,将有如下(图3-3)提示:
图3-3
8.内存空间不足也有相应提示。

9.重置或退出。

三、实验结果
第一至四组数据测试采用搬家算法,第二至八组数据测试不采用搬家算法。

第一组测试数据:(测试内存错误输入) 选择搬家算法,内存大小:0KB/-50KB/空
第二组测试数据:(测试内存空间不够)选择搬家算法,内存大小:400KB
第三组测试数据:(测试是否采用最佳适应法)选择搬家算法,内存大小:200KB 第四组数据:(测试搬家算法)选择搬家算法,内存大小:400KB
第五组数据至第八组数据:不采用搬家算法,内存大小:分别与第一至第四组数据相同,操作过程:分别与第一至第四组数据相同。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验三存储管理实验一. 目的要求:1、通过编写和调试存储管理的模拟程序以加深对存储管理方案的理解。

熟悉虚存管理的各种页面淘汰算法。

2、通过编写和调试地址转换过程的模拟程序以加强对地址转换过程的了解。

二.实验内容:1、设计一个固定式分区分配的存储管理方案,并模拟实现分区的分配和回收过程。

可以假定每个作业都是批处理作业,并且不允许动态申请内存。

为实现分区的分配和回收,可以设定一个分区说明表,按照表中的有关信息进行分配,并根据分区的分配和回收情况修改该表。

算法描述:本算法将内存的用户区分成大小相等的四个的分区,设一张分区说明表用来记录分区,其中分区的表项有分区的大小、起始地址和分区的状态,当系统为某个作业分配主存空间时,根据所需要的内存容量,在分区表中找到一个足够大的空闲分区分配给它,然后将此作业装入内存。

如果找不到足够大的空闲分区,则这个作业暂时无法分配内存空间,系统将调度另一个作业。

当一个作业运行结束时,系统将回收改作业所占据的分区并将该分区改为空闲。

算法原程序#include "stdio.h"#include "windows.h"#include <stdlib.h>#include <conio.h>#define PCB_NUM 5 //模拟进程数量#define INT 800//内存分区数量struct MemInf{int addr;//分区起始地址int size;//分区大小int state;//0表示空闲,>0时表示已分配,存储的是进程ID};struct PCB{int pcbID;//进程IDint size;//进程大小int RunState;//运行状态,0表示就绪,1表示已分配内存正运行,2表示运行结束且退出内存int TolTime;//总需要运行时间int RunTime;//已运行时间} pcbList[PCB_NUM];void menu()//菜单{int m;system("cls");printf("\n\n\t\t*********************************************\t\t\n"); printf("\t\t\t\t固定分区存储程序演示\n");printf("\t\t*********************************************\t\t\n"); printf("\n\t\t\t1.执行程序.");printf("\n\t\t\t0.退出程序.");scanf("%d",&m);switch(m){case1:break;case0:system("cls");menu();break;default:system("cls");break;}}void paixu(struct MemInf* ComMem,int n){int i,j,t;for(j=0; j<n-1; j++)for(i=0; i<n-j-1; i++)if(ComMem[i].size>ComMem[i+1].size){t=ComMem[i].size;ComMem[i].size=ComMem[i+1].size;ComMem[i+1].size=t;}}void paixu2(){int i,j,t;for(j=0; j<4; j++)for(i=0; i<4-j; i++)if(pcbList[i].size>pcbList[i+1].size){t=pcbList[i].size;pcbList[i].size=pcbList[i+1].size;pcbList[i+1].size=t;}}void main(){DD:menu();char ch;int i,j,n,a=0;struct MemInf* ComMem;system("cls");printf("你要分多少个分区呢,请输入数值吧:");scanf("%d",&n);ComMem=(struct MemInf*)malloc(n*sizeof(struct MemInf));printf("请划分内存固定大小分区:\n");//划分内存固定大小分区for(i=0; i<n; i++){printf("输入固定分区%d分区的长度:",i);//输入固定分区每个的长度scanf("%d",&ComMem[i].size);if(i==0) ComMem[i].addr=40;//定义第一个分区的起始地址为40else ComMem[i].addr=ComMem[i-1].addr+ComMem[i-1].size;//表示下一个起始地址的起始状态表示的是分区长度加上起始地址长度ComMem[i].state=0;//表示状态为未分配a=ComMem[i].size+a;if(a>=INT){printf("超出规定内存范围");ch=getchar();ch=getchar();goto DD;}}paixu(ComMem,n);//初始化就绪进程队列pcbList[0].pcbID =1;pcbList[0].RunState =0;//运行状态,0表示就绪,1表示已分配内存正运行,2表示运行结束且退出内存pcbList[0].size=30;pcbList[0].RunTime =0;pcbList[0].TolTime =5;pcbList[1].pcbID =2;pcbList[1].RunState =0;pcbList[1].size=15;pcbList[1].RunTime =0;pcbList[1].TolTime =6;pcbList[2].pcbID =3;pcbList[2].RunState =0;pcbList[2].size=50;pcbList[2].RunTime =0;pcbList[2].TolTime =3;pcbList[3].pcbID =4;pcbList[3].RunState =0;pcbList[3].size=120;pcbList[3].RunTime =0;pcbList[3].TolTime =4;pcbList[4].pcbID =5;pcbList[4].RunState =0;pcbList[4].size=125;pcbList[4].RunTime =0;pcbList[4].TolTime =9;ch=getchar();ch=getchar();while(pcbList[PCB_NUM-1].RunTime < pcbList[PCB_NUM-1].TolTime){{for(j=0; j<PCB_NUM; j++){//内存分配for(i=0; i<n; i++){if(ComMem[i].state ==0&& pcbList[j].RunState==0) //内存分区为0空闲,且进程状态为就绪,即可以考虑分配该内存分区if(ComMem[i].size >= pcbList[j].size)//如果该内存分区空间大于或等于进程空间,即可以把该空闲内存分区分配给该进程{ComMem[i].state =pcbList[j].pcbID ;pcbList[j].RunState=1;}}//内存回收if(pcbList[j].RunTime >=pcbList[j].TolTime)//如果该进程运行时间大于或等于总需时间,即可回收该进程占用内存for(i=0; i<n; i++)if(ComMem[i].state == pcbList[j].pcbID){ComMem[i].state =0;//内存状态变为 "未分配"pcbList[j].RunState=2;//进程状态变为 "运行完毕"}//运行时间加1for(i=0; i<PCB_NUM; i++)if(pcbList[i].RunState==1&& pcbList[i].RunTime < pcbList[i].TolTime)//处于运行状态且运行时间小于总需时间的进程,运行时间加1pcbList[i].RunTime++;//显示模块printf("进程ID\t 进程大小\t 状态\t 需要时间\t 运行时间\n");for(i=0; i<PCB_NUM; i++)printf("%d\t %d\t\t %d\t %d\t\t %d\n",pcbList[i].pcbID,pcbList[i].siz e, pcbList[i].RunState, pcbList[i].TolTime ,pcbList[i].RunTime);printf("分区ID\t 分区大小\t 状态\n");for(i=0; i<n; i++)printf("%d\t %d\t\t %d\n",i,ComMem[i].size ,ComMem[i].state );printf("按回车键继续...\n");getchar();//按任意键继续(分步执行,以便观察内存分配回收}}}}运行结果截图:2、设计一个可变式分区分配的存储管理方案。

并模拟实现分区的分配和回收过程。

对分区的管理法可以是下面三种算法之一:首次适应算法循环首次适应算法最佳适应算法代码实现部分:#include<stdio.h>#include<stdlib.h>#include<string.h>#define max 100typedef struct node{int start;int length;char tag[20];}job;job frees[max];job occupys[max];int free_quantity,occupy_quantity;int SIZE;void initial()//初始化函数{int i;for(i=0;i<max;i++){frees[i].start=-1;frees[i].length=0;strcpy(frees[i].tag,"free");occupys[i].start=-1;occupys[i].length=0;strcpy(occupys[i].tag,"");}free_quantity=0;occupy_quantity=0;}void writedata()//把分区函数写入磁盘文件{FILE *fp;char fname[20];int i,j;printf("请输入初始空闲表文件名:\n");scanf("%s",&fname);printf("现在进行初始化空闲分区!\n");printf("请输入您要建立的空闲分区数:\n");scanf("%d",&SIZE);for(i=0;i<SIZE;i++){j=i+1;printf("输入第%d个分区的起始地址:\n",j);scanf("%d",&frees[i].start);printf("输入第%d个分区的长度:\n",j);scanf("%d",&frees[i].length);}if((fp=fopen(fname,"wb"))==NULL)printf("错误,文件打不开,请检查文件名\n");for(i=0;i<SIZE;i++)if(fwrite(&frees[i],sizeof(struct node),1,fp)!=1)printf("文件写入错误!\n");fclose(fp);}void readdata()//从文件读入分区表函数{FILE *fp;char fname[20];printf("请输入读入空闲表文件名:");//输入空闲表文件的文件名 scanf("%s",&fname);if((fp=fopen(fname,"rb"))==NULL){printf("错误,文件打不开,请检查文件名\n");exit(0);}else{int i;for(i=0;i<SIZE;i++){fread(&frees[i],sizeof(struct node),1,fp);free_quantity++;}}fclose(fp);}void sort()//排序空闲表{int i;for(i=0;i<free_quantity-1;i++){int t=i;int j;for(j=i+1;j<free_quantity;j++){if(frees[j].start<=frees[t].start)t=j;}frees[free_quantity].start=frees[i].start;frees[free_quantity].length=frees[i].length;frees[i].start=frees[t].start;frees[i].length=frees[t].length;frees[t].start=frees[free_quantity].start;frees[t].length=frees[free_quantity].length;}}void view()//显示分区信息{int i,j;printf("空闲分区表显示如下:\n");printf("起始地址\t长度\t状态标志\n");for(i=0;i<free_quantity;i++)printf("%6dk\t%10dk\t%s\t\n",frees[i].start,frees[i].length,frees[i]. tag);printf("\n\n已分配分区表显示如下:\n");printf("起始地址\t长度\t占用作业名\n");for(j=0;j<occupy_quantity;j++)printf("%6dk\t%10dk\t%s\t\n",occupys[j].start,occupys[j].length,occup ys[j].tag);getchar();getchar();}void earliest()//首次适应算法{char jobname[20];int joblength,f=0;int i,j;printf("请输入作业名:\n");scanf("%s",&jobname);printf("输入作业的长度:\n");scanf("%d",&joblength);for(i=0;i<free_quantity;i++){if(frees[i].length>=joblength)f=1;}if(f==0){printf("\n当前没有能满足你申请长度的空闲内存,请稍候再试\n");getchar();}else{//找到了满足的空间int t=0;j=0;while(t==0){if(frees[j].length>=joblength){t=1;}j++;}j--;occupys[occupy_quantity].start=frees[j].start;//分配满足条件的空间strcpy(occupys[occupy_quantity].tag,jobname);occupys[occupy_quantity].length=joblength;occupy_quantity++;if(frees[j].length>joblength){frees[j].start+=joblength;frees[j].length-=joblength;}else{for(i=j;i<free_quantity-1;i++){frees[i].start=frees[i+1].start;frees[i].length=frees[i+1].length;}free_quantity--;}printf("作业申请内存空间成功!\n");getchar();getchar();}}void excellent()//最佳适应法{char jobname[20];int joblength,f=0;int i,j;printf("请输入作业名:\n");scanf("%s",&jobname);printf("输入作业的长度:\n");scanf("%d",&joblength);for(i=0;i<free_quantity;i++){if(frees[i].length>=joblength)f=1;}if(f==0){printf("\n当前没有能满足你申请长度的空闲内存,请稍候再试\n");getchar();}else//找到了满足的空间{int t=0;j=0;while(t==0){if(frees[j].length>=joblength){t=1;}j++;}j--;for(i=0;i<free_quantity;i++){if(frees[i].length>=joblength&&frees[i].length<frees[j].length)j=i;}occupys[occupy_quantity].start=frees[j].start;//分配空闲空间 strcpy(occupys[occupy_quantity].tag,jobname);occupys[occupy_quantity].length=joblength;occupy_quantity++;if(frees[j].length>joblength){frees[j].start+=joblength;frees[j].length-=joblength;}else{for(i=j;i<free_quantity-1;i++){frees[i].start=frees[i+1].start;frees[i].length=frees[i+1].length;}free_quantity--;}printf("作业申请内存空间成功!\n");getchar();getchar();}}void worst(){char jobname[20];int joblength,f=0;int i,j;printf("请输入作业名:\n");scanf("%s",&jobname);printf("输入作业的长度:\n");scanf("%d",&joblength);for(i=0;i<free_quantity;i++){if(frees[i].length>=joblength)f=1;}if(f==0){printf("\n当前没有能满足你申请长度的空闲内存,请稍候再试\n"); getchar();getchar();}else//找到了满足的空间{int t=0;j=0;while(t==0){if(frees[j].length>=joblength){t=1;}j++;}j--;for(i=0;i<free_quantity;i++){if(frees[i].length>=joblength&&frees[i].length>frees[j].length)j=i;}occupys[occupy_quantity].start=frees[j].start;//分配空闲空间 strcpy(occupys[occupy_quantity].tag,jobname);occupys[occupy_quantity].length=joblength;occupy_quantity++;if(frees[j].length>joblength){frees[j].start+=joblength;frees[j].length-=joblength;}else{for(i=j;i<free_quantity-1;i++){frees[i].start=frees[i+1].start;frees[i].length=frees[i+1].length;}free_quantity--;}printf("作业申请内存空间成功!\n");getchar();getchar();}}void main(){initial();int n;writedata();system("cls");readdata();for(;;){sort();printf("************************************\n"); printf("************************************\n"); printf("** 欢迎使用可变分区存储管理系统 **\n");printf("************************************\n"); printf("** 1.显示空闲表和分配表 **\n");printf("** 2.首次适应算法 **\n");printf("** 3.最佳适应算法 **\n");printf("** 4.最坏适应算法 **\n");printf("** 0.退出系统 **\n"); printf("************************************\n"); printf("************************************\n"); printf("请输入您要选择的项目:\n");scanf("%d",&n);for(;;){if(n<0||n>4){printf("没有这个选项,请重新输入!");scanf("%d",&n);}elsebreak;}switch(n){case0:printf("感谢您的使用!再见!\n");exit(0);case1:view();break;case2:earliest();break;case3:excellent();break;case4:worst();break;}system("cls");}}测试结果:使用首次适应算法的结果:内存过满:3、编写并调试一个段页式存储管理的地址转换的模拟程序。

相关文档
最新文档