ImageVerifierCode 换一换
格式:DOCX , 页数:14 ,大小:127.77KB ,
资源ID:7748720      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/7748720.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(动态分区存储管理方式的主存分配回收.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

动态分区存储管理方式的主存分配回收.docx

1、动态分区存储管理方式的主存分配回收动态分区存储管理方式的主存分配回收动态分区存储管理方式的主存分配回收一、实验目的深入了解动态分区存储管理方式主存分配回收的实现。二、实验要求编写程序完成动态分区存储管理方式的主存分配回收的实现。实验具体包括:首先确定主存空间分配表;然后采用最优适应算法完成主存空间的分配和回收;最后编写主函数对所做工作进行测试。三、实验步骤实现动态分区的分配和回收,主要考虑的问题有三个:第一,设计记录主存使用情况的数据表格,用来记录空闲区和作业占用的区域;第二,在设计的数据表格基础上设计主存分配算法:第三,在设计的数据表格基础上设计主存回收算法。首先,考虑第个问题:设计记录主存

2、使用情况的数据表格,用来记录空闲区和作业占用的区域。由于动态分区的大小是由作业需求量决定的,故分区的长度是预先不固定的,且分区的个数也随主存分配和回收变动。总之,所有分区情况随时可能发生变化,数据表格的设计必须和这个特点相适应。由于分区长度不同,因此设计的表格应该包括分区在主存中的起始地址和长度。由于分配时空闲区有时会变成两个分区:空闲区和已分分区,回收主存分区时,可能会合并空闲分区,这样如果整个主存采用一张表格记录已分分区和空闲区,就会使表格操作繁琐。主存分配时查找空闲区进行分配,然后填写已分配区表,主要操作在空闲区;某个作业执行完后,将该分区变成空闲区,并将其与相邻的空闲区合并,主要操作也

3、在空闲区。由此可见,主存的分配和回收主要是对空闲区的操作。这样为了便于对主存空间的分配和回收,就建立两张分区表记录主存使用情况一张表格记录作业占用分区的“已分配区表”一张是记录空闲区的“空闲区表”。这两张表的实现方法一般有两种,一种是链表形式,一种是顺序表形式。在试验中,采用顺序表形式,用数组模拟。由于顺序表的长度必须是提前固定,所以无论是“已分配区表”还是“空闲区表”都必须事先确定长度。他们的长度必须是系统可能的最大项数,系统运行过程中才不会出错,因而在多数情况下,无论是“已分配区表”还是“空闲区表”都有空闲栏目。已分配区表中除了分区起始地址、长度外,也至少还有一项“标志”,如果是空闲栏目,

4、内容为“空”,如果为某#define m 10 #define n 10 structfloat address; float length; int flag; used_tablen; structfloat address; float length; int flag; free_tablem; void initialize(void);int distribute(int, float);int recycle(int);void show();void initialize(void) int a; for(a=0; a=n-1; a+) used_tablea.flag=0;

5、free_table0.address=1000; free_table0.length=1024; free_table0.flag=1;int distribute(int process_name, float need_length) int i, k=-1; float ads, len; int count=0; i=0; while(i=m-1) if(free_tablei.flag=1 & need_length =free_tablei.length) count+; if(count=1|free_tablei.length free_tablek.length) k=i

6、; i=i+1; if(k!=-1) if(free_tablek.length-need_length)=minsize) free_tablek.flag=0; ads=free_tablek.address; len=free_tablek.length; else ads=free_tablek.address; len=need_length; free_tablek.address+=need_length; free_tablek.length-=need_length; i=0; while(used_tablei.flag!=0) i=i+1; if(i=n-1) used_

7、tablei.address=ads; used_tablei.length=len; used_tablei.flag=process_name; count1+; else if(free_tablek.flag = 0) free_tablek.flag=1; free_tablek.address=ads; free_tablek.length=len; else free_tablek.address=ads; free_tablek.length+=len; cout内存分配区已满,分配失败!n; return 0; else cout 无法为该作业找到合适分区!n; return

8、 0; return process_name;int recycle(int process_name) int y=0; float recycle_address, recycle_length; int i, j, k; int x; while(y=n-1&used_tabley.flag!=process_name) y=y+1; if(y=n-1) recycle_address=used_tabley.address; recycle_length=used_tabley.length; used_tabley.flag=0; count2+; else cout=m|(k!=

9、-1&j!=-1) if(free_tablei.flag=1) if(free_tablei.address+free_tablei.length)=recycle_address) k=i; if(recycle_address+recycle_length)=free_tablei.address) j=i; i=i+1; if(k!=-1) if(j!=-1) free_tablek.length+=free_tablej.length+recycle_length; free_tablej.flag=0; else free_tablek.length+=recycle_length

10、; else if(j!=-1) free_tablej.length+=recycle_length; free_tablej.address=recycle_address; else x=0; while(free_tablex.flag!=0) x=x+1; if(x=m-1) free_tablex.length=recycle_length; free_tablex.flag=1; else used_tabley.flag=process_name; cout空闲区已满,回收失败!n; return 0; return process_name;void show() cout

11、空 闲 区n; for(int i=0;i=count2;i+) cout地址:free_tablei.address 作业长度:free_tablei.length 状 态:free_tablei.flagendl; cout已 分 配 区n; for(int j=0;jcount1;j+) cout地址:used_tablej.address 作业长度:used_tablej.length 作业名:used_tablej.flagendl;void main() int choice; int job_name; float need_memory; bool exitFlag=false

12、; cout 动态分区分配方式的模拟 n; initialize(); while(!exitFlag) cout1: 分配内存 2: 回收内存n; coutchoice; switch(choice) case 0: exitFlag=true; break; case 1: coutjob_nameneed_memory; distribute(job_name, need_memory); break; case 2: int ID; coutID; recycle(ID); break; case 3: show(); break; 内存分配回收实现截图(1)、假定系统内存分配表允许的

13、最大作业项为10,当分配超过10时,提示“内存分配区已满,分配失败”。(2)、回收作业所占内存时,当输入的作业名不存在,回收失败,提示“该作业不存在”。(3)、当要释放某个作业时,将已分配表中此作业的标志置为0,并在空闲区做相应登记。五、总结核心算法:/最优分配算法实现的动态分区int distribute(int process_name, float need_length) int i, k=-1; /k用于定位在空闲表中选择的未分配栏 float ads, len; int count=0; i=0; /核心的查找条件,找到最优空闲区 while(i=m-1) /循环找到最佳的空闲分区

14、 if(free_tablei.flag=1 & need_length =free_tablei.length) count+; if(count=1|free_tablei.length free_tablek.length) k=i; i=i+1; if(k!=-1) if(free_tablek.length-need_length)=minsize) /整个分配 free_tablek.flag=0; ads=free_tablek.address; len=free_tablek.length; else /切割空闲区 ads=free_tablek.address; len=ne

15、ed_length; free_tablek.address+=need_length; free_tablek.length-=need_length; i=0; /循环寻找内存分配表中标志为空栏目的项while(used_tablei.flag!=0) i=i+1; if(i=n-1) /找到,在已分配区表中登记一个表项 used_tablei.address=ads; used_tablei.length=len; used_tablei.flag=process_name; count1+; else /已分配区表长度不足 if(free_tablek.flag = 0) /将已做的整

16、个分配撤销 free_tablek.flag=1; free_tablek.address=ads; free_tablek.length=len; else /将已做的切割分配撤销 free_tablek.address=ads; free_tablek.length+=len; cout内存分配区已满,分配失败!n; return 0; else cout 无法为该作业找到合适分区!n; return 0; return process_name;每一次的实践,都会有很大的收获。决定做这个题目的时候,就针对此题要解决的几个问题反复思考,重新翻开教科书把相关内容特别是算法原理认真细致的看了一遍,设想会遇到的问题。在内存动态分配程序设计中,最优适应算法比首次要难一些,要加上对分配后该分区是否能最好地利用的判断。再一个问题是回收时候的合并,对地址的修改不是很有把握。着手写程序后,半天才理清回收的内存和上下邻合并的条件与关系,写此处的代码时,逻辑上比较混乱,反复错误反复修改了很多次才调试正确,这也是花了最多时间才得以正确实现的部分。

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1