可变分区存储管理+实验报告+程序+设计思路和感悟概要.docx

上传人:小飞机 文档编号:5080474 上传时间:2023-06-02 格式:DOCX 页数:12 大小:173.13KB
返回 下载 相关 举报
可变分区存储管理+实验报告+程序+设计思路和感悟概要.docx_第1页
第1页 / 共12页
可变分区存储管理+实验报告+程序+设计思路和感悟概要.docx_第2页
第2页 / 共12页
可变分区存储管理+实验报告+程序+设计思路和感悟概要.docx_第3页
第3页 / 共12页
可变分区存储管理+实验报告+程序+设计思路和感悟概要.docx_第4页
第4页 / 共12页
可变分区存储管理+实验报告+程序+设计思路和感悟概要.docx_第5页
第5页 / 共12页
亲,该文档总共12页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《可变分区存储管理+实验报告+程序+设计思路和感悟概要.docx》由会员分享,可在线阅读,更多相关《可变分区存储管理+实验报告+程序+设计思路和感悟概要.docx(12页珍藏版)》请在三一办公上搜索。

1、实验题目:可变分区存储管理一、实验目的可变分区存储管理方式是操作系统中存储管理的重要方式,其主要思想是 用户作业进行连续存储,每次按照用户的请求,如果内存中有能满足用户作业 大小的空闲区,就采用不同的算法分配给用户,否则,不分配,可变分区容易 产生外零头。分区分配算法包括最佳适应算法、最坏适应算法、首次适应算法 等。通过本实验可加深学生对存储器管理方式的把握以及分配算法的理解,并提 高程序设计的能力。二、实验环境个人 PC 机 WindowsXP 操作系统 I5.2400CPU 3.10G11Z 2GB 内存C-Free C语言程序设计软件三、实验的重点和难点可变分区的的收回实验内容利用C语言

2、或C+语言或Java语言实现可变分区存储管理,具体要求如下:1. 以一个一维数组模拟内存,数组类型为整型,共计1000个元素;2. 用一个单链表表示可变分区空闲表,链表每个结点表示一个空闲区,每 个结点信息包括起始地址、大小。3. 分区分配算法采用最佳适应算法、首次适应算法,并将算法用函数实现。4. 自己假设几个作业,包括作业的名称、大小,进入系统的顺序。5. 初始内存中没有任何作业,随着用户输入的每一个作业的到来,动态为 其分配内存。6. 使用的算法用户要能够随时更换。五、实验结果或实验代码(1) 可变式分区管理是指在处理作业过程中建立分区,使分区大小正好适合作业的需 要,并且分区个数可以调

3、整。当要装入一个作业时,根据作业需要的内存量,查看是否有 足够的空闲空间,若有,则按需求量分割一部分给作业;若没有,则作业等待。随着作业 的装入、完成,内存空间被分割成许多大大小小的分区。有的分区被作业占用,有的分区 空闲。例如,某时刻内存空间占用情况如图1所示。操作系统(10KB)1246110作业 1 (10KB)作业 4 (25KB)空闲区1 (20KB)作业 2 (45KB)空闲区2 (146KB)内存空间占用情况2图1为了说明那些分区是空闲的,可以用来装入新作业,必须要有一张空闲区说明表,如表1所示。表1空闲区说明表起始地址长度状态45K20K未分配110K146K未分配空表目空表目

4、空表目其中,起始地址指出个空闲区的内存起始地址,长度指出空闲区的大小。状态(未分配:该栏目记录的是有效空闲区)状态(空表目:没有登记信息)由于分区个数不定,所以空闲区说明表中应该有足够的空表目项。否则造成溢出,无 法登记。同样,再设一个己分配表,记录作业或进程的内存占用情况。(2)当有一个新作业要求装入内存时,必须查空闲区说明表,从中找出一个足够大的 空闲区。有时找到的空闲区可能大于作业需求量,这时应将空闲区一分为二。一个分给作 业,另外一个作为空闲区留在空闲区表中。为了尽量减少由于分割造成的碎片,尽可能分 配低地址部分的空闲区,将较大空闲区留在高地址端,以利于大作业的装入。为此在空闲 区表中

5、,按空闲区首地址从低到高进行登记。为了便于快速查找,要不断地对表格进行紧 缩,即让“空表目”项留在表的后部。其分配框图如图2所示。开始(3)当一个作业执行完成时,作业所占用的分区应归还给系统。在归还时要考虑相邻 空闲区合并的问题。作业的释放区与空闲区的邻接分以下4种情况考虑: 释放区下邻(低地址邻接)空闲区; 释放区上邻(高地址邻接)空闲区; 释放区上下都与空闲区邻接; 释放区与空闲区不邻接。首次适应算法回收框图如图3所示。返回图3首次适应算法回收框图#include niostream.hn#include stdio.h#include stdlib.hn#include conio.hu

6、#define n 10#define m 10#define minisize 1000stmctfloat address;float length;int flag;一个字符的作业名)used_tablen;structfloat address;float length;int flag;配fiee_tablem;(4)请按首次适应算法设计内存分配和回收程序。以表2当前使用的基础,初始化空 闲区和己分配区说明表值。设计一个作业申请队列以及作业完成后的释放顺序,实现内存 的分配与回收。把空闲区说明表的变化情况以及各作业的申请、释放情况显示或打印出来。表2空闲区说明表起始地址长度状态20K

7、20KB180K50KB1150K100KB1300K30KB0(空表目)600K100KB1空表目程序代码假定系统允许的最大作业数量为n假定系统允许的空闲区表最大为m己分分区起始地址己分分区长度,单位为字节己分分区表登记栏标志,用”0”表示空栏目,实验中只支持己分分区表空闲区起始地址空闲区长度,单位为字节空闲区表登记栏标志,用”0”表示空栏目,用”1”表示未分空闲区表int allocate(chai J,float xk)采用最有分配法分配xk大小的空间/char J; /float xk; int i,k; float ad; k=-l; for(i=0;i=xk&fiee_table

8、i. flag= 1) if(k=-1| fiee_table i.lengthfiee_table k. length) k=i; if(k=-l)未找到可用空闲区,返回 cout无可用空闲区endl; return 0; 找到可用空闲区,开始分配:若空闲区大小与分配的空间差小于minisize,则空 闲区全部分配:若空闲区大小与要求分配的空间差大于minisize,则从空闲区划出一部分分配 if(free_table k .length-xk=minisize) fiee_table k. flag=0; ad=fiee_tablek.address; xk=fiee_tablek. le

9、ngth; else free_tablek .length=fiee_tablek .length-xk; ad=fiee_tablek.adciress+fiee_tablek.length; 修改分配区表 1=0;while(used_table i. flag! =0&i=n)cout无表目填写己分分区,错误endl;修正空闲区表if(free_tablek. flag=O)前面找到的是整个空闲区free_table k. flag= 1;else前面找到的是某个空闲区的一部分free_tablek .length=fiee_tabiek .length+xk;letuin 0;els

10、eused_tablei.address=ad;used_tablei.length=xk;u sed_tablei. flag=J;return 1; 内存分配函数结束)int ieclaim(char J)回收作业名为J的作业所占内存空间/char J;int i,k,j,s,t;float S,L;寻找己分分区表中对应登记项s=0;while(used_tables.flag!=J|used_tables.flag=O)&s=n)在己分分区表中找不到名字为J的作业cout*找不到该作业,endl;return 0;修改己分分区表used_tables.flag=O;取得归还分区的起始地址

11、S和长度LS=used_tables.address; L=used_tables. length; J=-l; k=-l; i=0; 寻找回收分区的上下邻空闲区,上邻表目k,下邻表目j while(i=m)空闲区表满,回收空间失败,将己分分区表复原coutH内存空闲表没有空间,回收空间失败nendl;u sed_table s. flag=J;return 0;fiee_tablet.addiess=S;fiee_table t.length=L;fiee_table t. flag= 1;)return 1;)内存归还函数结束void main()int i,a;float xk;char

12、 J;空闲区表初始化free_table 0. address= 10240;fLee_tableO.length= 102400;free_table 0. flag= 1;fof(i=l;im;i+)free_tab le i. flag=0;己分分区表初始化for(i=0;in;i+)used_tablei.flag=O;while(l)cout选择功能项(0-推出,1-分配内存,2-回收内存,3-显示内存)”vvendl;coutvv”选择功项(03):”;cina;switch(a)case 0: exit(0);/a=0程序结束case 1:/a=l分配内存空间coutn输入作业名

13、J和作业所需长度xk: ”; cinJxk; allocate(J,xk); 分配内存空间 break; case 2:/a=2回收内存空间coutn输入要回收分区的作业名”; cinJ; leclaim(J);回收内存空间case 3:a=3显示内存情况,输出空闲区表和己分分区表cout输出空闲区表:endl;cout起始地址 分区长度 标志,endl; for(i=0;im;i+)coutfLee_tablei.addressfLee_tablei.lengthfLee_tablei.flagencll;cout按任意键,输出己分分区表nendl; getcli();cout输出己分分区表

14、:”vendl;cout起始地址 分区长度 标志,endl; for(i=0;in;i+)if(used_table i. flag! =0)coutused_tablei.addiessused_tablei.lengthused_tablei.flagendl; elsecoutused_tablei.addiessused_tablei.lengthused_tablei.flagendl; break; default: coutH没有该选项y Vendl; ) )为可变分区管理方式的工作过程画出流程图;六、实验过程遇到的问题及其解决当系统实现分配系统资源时,应该首先判断与本作业相匹配

15、的空间资源大 小,这样才能使得系统的资源利用率提高。然后再进行系统资源分配。初始使 用的资源没有按照这种分配思路,而是直接在系统中查找到首先与之相匹配的 空块,导致系统的资源利用率大大减小。七、实验总结通过这次关于可变分区存储管理的操作系统实验,我了解了操作系统关于 内存共享、分页的过程、未分页合并内存与分页合并内存的管理以及如何提高 分页的效率。关于概念性的内容有了更深层次的理解例如:分页就是将信息从 主内存移动到磁盘进行临时存储的过程。应用程序经常需要彼此通信和共享信 息。为了提供这种能力,Windows必须允许访问某些内存空间而不危及它和其 他应用程序的安全性和完整性。使我对操作系统的作业功能有了更加深化一步 的认识。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号