模拟实现一个简单的固定(可变)分区存储管理系统_第1页
模拟实现一个简单的固定(可变)分区存储管理系统_第2页
模拟实现一个简单的固定(可变)分区存储管理系统_第3页
模拟实现一个简单的固定(可变)分区存储管理系统_第4页
模拟实现一个简单的固定(可变)分区存储管理系统_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

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

文档简介

1、合祀曇浣针算机科曇鸟啟求系实验报告20092010学年第一学期课程操作系统原理实验名称模拟实现一个简单的固定(可变)分区存储管理系统学生姓名朱海燕、汪小口、秦月、程美玲专业班级07计本(1)班指导教师屠菁2009年12月1.实验目的通过木次课程设计,掌握了如何进行内存的分区管理,强化了对首次适应分配算法和分区冋收算法的理解。2. 实验内容(1)建立相关的数据结构,作业控制块、已分配分区及未分配分区(2)实现一个分区分配算法,如最先适应算法、最优或最坏适应分配算法(3)实现一个分区回收算法(4)给定一个作业/进程,选择一个分配或回收算法,实现分区存储的模拟管理初始化并创建空闲分区表;n返冋3.

2、实验步骤首先,初始化函数initial ()将分区表初始化并创建空闲分区列表,空闲区 第一块的长度是30,以后的每个块长度比前一个的长度长20ofrees0.length=30第二块的长度比第一块长20,第三块比第二块长30,以此类推。freesi.length=freesi-l.length+20;下一块空闲区的首地址是上一块空闲区的首地址与上一块空闲区长度的和。 freesi.front=freesi l.fron t+freesi-l e ngth;分配区的首地址和长度都初始化为零occupysi.front=0;occupysi.length=0;显示函数showo是显示当前的空闲分区

3、表和当前的已分配表的具体类容, 分区的有起始地址、长度以及状态,利用for语句循环输出。有一定的格式,使 得输出比较美观好看。assign ()函数是运用首次适应分配算法进行分区,从链首开始顺序查找, 直至找到一个大小能满足要求的空闲分区为止;然后再按照作业的大小,从该分 区中划出一块内存空间分配给请求者,余下的空闲分区仍留在空闲链中。若从链 首直至链尾都不能找到一个能满足耍求的分区,则此次内存分配失败,返回。这 个算法倾向于优先利用内存中低址部分被的空闲分区,从而保留了高址部分的的 大空闲区。着给为以后到达的大作业分配大的内存空间创造了条件。它的缺点是 低地址部分不断被划分,会留下很多难以利

4、用的、很小的空闲分区,而每次查找 又都是从低址部分开始,这样无疑会增加查找可用空闲分区的开销。分配内存,从空闲的分区表中找到所需大小的分区。设请求的分区的大小为 jobjength ,表中每个空闲分区的大小可表示为freei.length。如果 freesi.length>=jobjength,即空闲空间i的长度大于等于作业的长度将空闲标志 位设置为1,如果不满足这个条件则输出:“对不起,当前没有满足你巾请长度 的空闲内存,请稍后再试!”。如果freesi.length>=job_length空闲区空间i的长 度不大于作业氏度,i的值加1判断下一个空闲区空间是否大于作业的长度。把

5、未用的空闲空间的首地址付给已用空间的首地址,已用空间的长度为作业的长度, 已用空间数量加lo $llx(freesi.length>job_length),空间的长度大于作业的长度, freesi.front+=job_length;空闲空间的起始首地址二原空闲区间的起始长度加作 业长度freesi.length-=job_length;$闲区间的长度二原空闲区间的长度作业的长 度。如果空间的长度与作业的长度相等,空闲区向前移一位,空闲区的数量也减 一。这样判断所有情况并相应分配z后,内存空间分配成功。第二个操作为:撤消相应作业。在这个操作小,进行了以下步骤:(1) 按照系统提示输入将要

6、撤消的作业名;(2) 判断该作业是否存在若不存在:输出“没有这个作业名,请重新输入作业名”;若存在:贝恍分别用flag,start,len保存该作业在分配区表的位置i,内存空间的首地址 以及长度。接着根据冋收区的首地址,即该作业的首地址,从空闲区表屮找到相应的插入点, 将其加入空闲表,此时可能出现以下三种情况之一:1回收区只与插入点前一个空闲分区f1相邻接即(freesi.front+freesi.length)=start), 此时判断其是否与后一个空闲分区f2相邻接,又分两种情况:若相邻接,则将三个分区合并,修改新的空闲分区的首地址和长度。新的首地址为f1 的首地址,长度为三个分区长度z和

7、,相应的代码为: freesi.length=freesi.length+freesi+l.length+len;,并相应的空闲区表。若不相邻接,即合并后的首应将回收区与插入点的前-分区合并,则不须为回收分区分 配新的表项,只须修改其询一分区的大小。该大小为f1与当前作业大小之和。 freesi eng th+=le n;2 冋收分区与插入点前一个空闲分区不邻接但与后一空闲分区f2邻接。此吋应合并当 前作业分区与f2分区,合并后的分区首地址为当前作业首地址start,长度为两个分区长度 之和。代码为:freesi.front=start; freesi.length+=len;3.回收分区既不

8、与插入点前一空闲分区相邻接,也不与后一空闲分区相邻接。此时只须 将该回收分区插入空闲区表即可。此时空闲区的数量加lo将i叫收区加入空闲区表后还须修改分配区表内容。具体为:修改分配区表屮回收区(第 一区)之后的各区指针,使其依次前移一位,即occupysi二occupysi+l;同时已分配分区数 量减 1,即 occupy_quantity-;最示输出内存空间回收完毕!即完成了撤消作业并回收相应空间的操作。图2初始化空闲分区列表可变分区存储管理模拟系统菓单:退出“由请空间©撤消作业« 3显不空闲耒和分配表请选怪:±请输入新申请内存空间的作业名和空间大小心40 内存空

9、间分配成功?人人人人人人人人人人人人人人人人人人人人人人人人人人人人人人人人人人人人人人人人人人人请选择=1请输夭新由请内存空间的作业名和空间大小诂50 内存空间分配成功?人人人人人人人人人人人人人人人人人人人人人人人人人人人人人人人人人人人人人人人人人人人请选择:1请墻只新申请内存空间的作业名和空间大小:c 10 内存空间分配成功?人a入入八入人人人人八入人人人八入八入入人人人入人八入人人人人人zkz.人人人人八八入人人请选择:1请输入新申请内存空间的作业名和空间大小:d 30 内存空间分配成功?人人八八八人人人人人八八人人人人八人八人人人人人人八a人人人人人人八人人人人八人八人人请选择:3

10、当前空闲分区裘如下:起始地址长度状态1020free7010free13020free18060free240110free当前已另卜配裘如下:起始地如l长唐占用作业名3040a8050b010c15030d图3.内存空间分配qb e:学习濮内处三上展作浆统'experiment'最后实迩2debug分区存储管理浆统e.请选择:b请输入要撤消的作业名:内存空间回收完毕?入人人入人人人人入入人人人入人人人入人人人人八人人人人八人八人人人入人人人人 请选择:3魏關开区犁旷状态1020free7080free18060free240110freetflsl配耒需占用作业名3040a0

11、10c15030d请选择:2 请输入要: 内存空间人人人人入人八人八八人懒消的作业名 回收完毕?:d请选择:3勰錮分区晳状态1020free70170free240110free配表需占用作业名3040a010c人人八八人人人人 a a 八人人 a 八人人 a 人人 a 八人人 a 人人人八人人人人 a a 八人a a 请选择:>图4.内存回收4. 实验总结动态分区分配是根据进程的实际需要,动态地为之分配内存空间。程序中采 用空闲分区表,用于纪录每个空闲分区的情况。每个空闲分区占一个表口,表口 屮包括起始地址、长度和状态。采用已分配表,用于存放请求的作业,每个作业 占一个表目,包扌舌起始

12、地址、长度和作业名。程序调用initial()函数实现对空闲分区的初始化。将作业装入内存时,运用首次适应分配算法。程序中调用assign()实现,分 配内存时,从表首开始查找,直至找到一个大小能满足耍求的空闲分区为止;然 后再按照作业的大小,从该分区屮划出一块内存空间分配给请求者,余下的空闲 分区仍留在空闲表中。若不能找到满足要求的空闲区,则此次内存分配失败,返 回。冋收内存,即撤销某些作业,调用撤销函数cancel(),根据所撤销作业的首 址,从空闲区表屮找到相应的插入点,回收内存包括四种情况:(1)冋收区与前 一空闲分区相邻接,此时将回收区与前一分区合并,并修改前一分区的大小;(2) 回收

13、区与后一空闲分区相邻接,此时将回收区与后一分区合并,并修改后一分区 的首址和大小;(3)回收区同时与前、后分区相邻接,则将三个分区合并,使用 前一分区的首址,大小为三分区大小之和;(4)冋收区不与空闲分区相邻,则重 新建立一新表项,填写首址和大小,插入表中相应位置。函数show()用于显示空闲区表和已分配表吋,运用for循环,依次显示每个空闲 区表和已分配表的信息。5.附录#in clude<stdlib.h>#incl ude<stdio.h>#include<iostream.h>#in clude<stri ng.h>#incl udevi

14、omanip.h>const int maxjob=5;/定义表最大记录数 typedef struct nodeint front;int length;char data20;job;定义job类型的数据类型job freesmaxjob;/ 定义空闲区表int free_quantity;job occupysmaxjob;/定义已分配区表 int occupy_quantity;初始化并创建空闲分区表函数int initial()int i;frees0.front=0;frees0.length=30;occupys0.fr on t=0; occupys 0ength=0;

15、strcpy(freeso.data,freeh);for(i=l;i<maxjob;i+)freesi.fr on t=freesi-l.fr on t+freesi-l en gth; freesi.length=freesi-l.length+20; strcpy(freesi.data,"free");occupysi.fr on t=0;occupysi en gth=o; strcpy(occupysi.data/'h);free_q u a ntity=maxj 0 b;occupy_qua ntity=o;return 1;显示函数void s

16、how()int i;printff"n");printf(”当前空闲分区表如下:n“);printf(“起始地址长度状态n”);for(i=0;i<free_quantity;i+)printf("%5d %8d%sn",freesi.front,freesi.length,freesi.data);printfc*n");printf(h当前已分配表如下:n(,);printf(“起始地址长度占用作业名n“);for(i=0;i<occupy_qua ntity;i+)prin tf("%5d%6d%sn ”,occu

17、pysi.front,occupysi en gth,occupysi.data);printff"nh);首次适应分配算法void assign()char job_name20;int jobength;int i,j,flagzt;printfc'w输入新申请内存空间的作业名和空间大小sea nf("%s”,job_name);scanf("%d",&job_length);flag=o;for(i=0;i<free_quantity;i+)if(freesi.length>=job_length) /如果空闲空间i的长

18、度>=作业长度flag=l;空闲标志位就査1if(flag=o)printfc対不起,当前没有能满足你申请长度的空闲内存,请稍候再试! n(i);elset=0;i=0;while(t=o) 为空闲区间的时候讦(f reesi eng th>=job_l en gth)t=l;i+;如果空闲空间i的长度不大于作业长度,i加1,判断下一个空间i-;occupysoccupy_quantity.front=freesi.front;/把未用的空闲空间的首地址付给已用 空间的首地址strcpy(occupysoccupy_quantity.data,job_name); 已用空间的内容为

19、作业名 occupysoccupy_quantity.length=job _length; 已用空间的长度为作业的长度 occupy_quantity+;已用空间数量加1if(freesi.length>job_length) /如果空间的长度大于作业的长度,freesi.front+=job_length; 空闲空间的起始首地址二原空闲区间的起始长度加作业长度freesi.length-=job_length;/空闲区间的长度二原空闲区间的长度作业的长度else如果空间的长度二作业的长度for(j=i;j<free_quantity-l;j+)freesj=freesj+l;/

20、 空闲区间前移一位free_quantity-;空闲区间的数虽减printf("内存空间分配成功!冲);撤消作业void cancel()char job_ name20;int i,j,flag,p=o;int start;int len;printfc'w输入要撤消的作业名:“);sea nf( '%s"job_name);flag=o;for(i=0;i<occupy_qua ntity;i+)if(!strcmp(occupysi.datazjob_name)/ 当输入作业名匹配时flag=i;/把i的值赋给flag;start=occupys

21、i.front;/把已用空间的首地址赋给startlen=occupysi,length;/把已用空间的长度赋给lenif(flag=o)printf(”没有这个作业名,请重新输入作业名! n");else加入空闲表for(i=0;i<free_quantity;i+)if(freesi.front+freesi .len gth)=start)/ 上空if(i+l)<free_quantity)&&(freesi+l.front=start+len)/ f空笫i个空闲区间的长度二笫i个空闲区间的长度+笫i+1个空闲区间的长度(下空闲 区)+lengthfreesi ength=freesi en gth+freesi+l en gth+le n;for(j=i+l;j<free_quantity;j+)freesj=freesj+l;/空闲区间前移一位free_quantity-;/空闲区的数量渐少了 一个p=l;elsefreesi.length+=len;/ (上空下不空)第i个空闲区间的长度二第i个空闲区间的长度length,空闲区个数不变p=l;if(freesi.front=(start+len)/ 下空上不空freesi.front二start;/起始地址等于待回收

温馨提示

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

评论

0/150

提交评论