- 1、本文档共8页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
动态存储管理的虚拟实现
一.设计目的
在早期的计算机上,这个存储管理的工作是由程序员自己来完成的。在程序执行之前,首先需将用机器语言或汇编语言编写的程序输送到内存的某个固定区域上,并预先给变量和数据分配好对应的内存地址(绝对地址或相对地址)。在有了高级语言之后,程序员不需要直接和内存打交道,程序中使用的存储单元都由逻辑变量(表识符)来表示,它们对应的内存地址都是由编译程序在编译或执行时进行分配。对于操作系统和编译程序来说,存储管理都是一个复杂而又重要的问题。通过理论知识的学习和掌握,为了加深对存储管理的认识和掌握,进而拿动态存储管理这一经典例子在计算机上实现。
二.设计内容
动态分区分配是根据进程的实际需求,动态地为之分配内存空间。在实现可变分区分配时,将涉及到分区分配中所用的数据结构、分区分配算法和分区与回收操作这样三个问题。
1.分区分配中的数据结构
为实现分区分配,系统中必须配置相应的数据结构,用来描述空闲分区分区和已分配分区的情况,为分配提供依据。常用的数据结构有以下两种:
(1)空闲分区表。 (2)空闲分区链。
2.分区分配算法
为把一个新作业装入内存,须按照一定的分配算法,从空闲分区表或空闲分区链中选出一分区分配给作业。目前常用以下所述的三种分配算法。
(1)首次适应算法FF。该算法倾向于优先利用内存中低地址部分的空闲分区,从而保留了高地址部分的大空闲区。
(2)循环适应算法。该算法是由首次适应算法演变而成的。该算法能使内存中的空闲分区分布得更均匀,从而减少了查找空闲分区时的开销,但这样会缺乏大量的空闲分区。
(3)最佳适应算法。所谓“最佳”是指每次为作业分配内存时,总是把能满足要求、又是最小的空闲分区分配给作业,避免“大材小用”。
3分区分配操作
在动态分区存储管理方式中,主要的操作是分配内存和回收内存。
1)分配内存
系统应利用某种分配算法,从空闲分区链(表)中找到所需大小的分区。
2)回收内存
当进程运行完毕释放内存时,系统根据回收区的首址,从空闲区链(表)中找到相应的插入点,此时可能出现以下四种情况之一:
(1)回收区与插入点的前一个空闲分区F1相邻接。此时应将回收区与插入点的前一分区合并,不必为回收分区分配新表项,而只需修改其前一分区F1的大小。
(2)回收区与插入点的后一个空闲分区F2相邻接。此时也可将两分区合并,形成新的空闲分区,但用回收区的首址作为新空闲区的首址,大小为两者之和。
(3)回收区同时与插入点的前、后两个分区邻接。此时将三个分区合并,使用F1的表项和F1的首址,取消F2的表项,大小为三者之和。
(4)回收区既不与F1邻接,又不与F2邻接。这时应为回收区单独建立一新表项,填 写回收区的首址和大小,并根据其首址插入到空闲链中的适当位置。
三.设计要求
以人性化的设计要求,使进入该程序的用户得到一的简单明了的界面.可以出现一些提示,让用户作出选择.先输入五个进程和三类资源的数值,然后输入要请求资源的进程号,对其作出判断,进行安全性检测,然后按步骤进行,可选择继续新的进程请求或退出,其中要打印输出多次输入和输出结果.
四.算法及流程图
借助C语言,在此将可利用空间表的结点结构定义为如下说明的数据类型:
typedef struct word{ //WORD:内存字类型
union { //head和foot分别是结点的第一字和最后的字
word *llink; //头部域,指向前驱结点
word *uplink; //底部域,指向本结点头部
};
int tag; //块标志,0:空闲,1:占用,头部和尾部均有。
int size; //头部域,块大小
word *rlink; //头部域,指向后续结点
othertype other; //字的其它部分
}word,head,foot,*space; //*space:可利用空间指针类型
#define footloc(p) p+p-size-1 //指向p所指结点的底部
分配策略的算法描述:
space allocboundtag(space pav,int n) {
//若有不小于n的空闲块,则分配相应的存储块,并返回其首地址;否则返回
//NULL。若分配后可利用空闲表不空,则pav指向表中刚分配过的结点的后续
//结点
for(p=pav;pp-sizenp-rlink!=pav;p=p-rlink); //查找不小于n的空闲块
if(!p||p-sizen) retu
文档评论(0)