存储管理动态分区分配算法的模拟
- 格式:doc
- 大小:60.00 KB
- 文档页数:11
动态分区分配方式的模拟动态分区分配方式是计算机中内存管理的一种重要方式。
在动态分区分配方式中,内存空间被分割为多个不同大小的分区,每个分区可以被进程占用。
当一个进程需要内存时,系统会为其分配一个适当大小的分区,进程结束后,该分区将会被释放出来供其他进程使用。
为了更好地理解动态分区分配方式的原理和实际运作,可以通过模拟的方法来观察和分析。
下面是一个简单的动态分区分配方式的模拟过程:假设我们有一块容量为6400KB的内存,要模拟分配4个进程的情况。
这4个进程的内存需求分别是1000KB,2000KB,500KB和300KB。
首先,我们可以将内存划分为几个分区,每个分区的大小根据需要进行调整。
可以设置整块内存为一块分区(大小为6400KB),或者划分成多个较小的分区。
由于这里有4个进程需要分配内存,我们可以为它们设置4个分区,分别为P1,P2,P3和P41.初始状态:内存:[6400KB](未分配)进程:P1,P2,P3,P4(空)2.分配P1:内存:[1000KB](P1)、[5400KB](未分配)进程:P1,P2,P3,P4P1占用了1000KB的内存,剩余空间为5400KB。
3.分配P2:内存:[1000KB](P1)、[2000KB](P2)、[3400KB](未分配)进程:P1,P2,P3,P4P2占用了2000KB的内存,剩余空间为3400KB。
4.分配P3:内存:[1000KB](P1)、[2000KB](P2)、[500KB](P3)、[2900KB](未分配)进程:P1,P2,P3,P4P3占用了500KB的内存,剩余空间为2900KB。
5.分配P4:内存:[1000KB](P1)、[2000KB](P2)、[500KB](P3)、[300KB](P4)、[2600KB](未分配)进程:P1,P2,P3,P4P4占用了300KB的内存,剩余空间为2600KB。
在模拟的过程中,我们可以看到进程在内存中的分配情况和未分配内存的变化。
操作系统c语言设计程序模拟内存的动态分区内存管理方法。
内存分区使用分区(说明)摘要:1.引言2.内存动态分区原理a.内存分区类型b.内存分区算法3.C语言实现内存动态分区管理a.内存分配函数b.内存释放函数c.内存管理函数4.内存动态分区管理的应用a.进程管理b.文件系统5.内存分区管理的优化a.算法改进b.硬件支持6.结论正文:【引言】内存管理是操作系统中的核心功能之一,它负责对系统内存进行有效分配、管理和回收。
在众多内存管理方法中,动态分区管理因其灵活性和高效性而得到了广泛应用。
本文将介绍操作系统中动态分区管理的原理,以及如何使用C语言实现这一管理方法。
【内存动态分区原理】内存动态分区管理主要包括两个方面:内存分区类型和内存分区算法。
a.内存分区类型内存分区通常分为两类:固定大小分区和不固定大小分区。
固定大小分区是指内存中被分配成固定大小的分区,适用于内存需求稳定的场景。
不固定大小分区则根据实际需求进行分配,更加灵活。
b.内存分区算法内存分区算法主要包括首次适应算法(FF)、最佳适应算法(BF)、最坏适应算法(WF)等。
首次适应算法简单、快速分配,但可能导致内存碎片;最佳适应算法尽量使用最小空间满足需求;最坏适应算法则优先使用大内存块,分割后空闲块仍较大。
【C语言实现内存动态分区管理】在C语言中,我们可以通过编写内存分配函数、内存释放函数和内存管理函数来实现内存动态分区管理。
a.内存分配函数内存分配函数负责根据用户请求分配内存。
可以根据内存分区类型和内存分区算法实现。
例如,首次适应算法可以遍历空闲内存块表,找到第一个满足需求的空闲块并进行分配。
b.内存释放函数内存释放函数负责回收不再使用的内存块,将其归还给空闲内存池。
释放内存时,需要确保该内存块之后的内存块不会被误用。
c.内存管理函数内存管理函数负责监控内存使用情况,如内存总量、空闲内存块数量等,以便在必要时进行内存扩容或压缩。
【内存动态分区管理的应用】内存动态分区管理在操作系统中有着广泛应用,如进程管理和文件系统等。
循环首次适应的动态分区分配算法模拟1.初始化内存空间为一个整体的空闲块。
2.当进程请求内存空间时,多次内存空闲块的循环链表,直到找到一个合适大小的空闲块为止。
3.如果找到了合适的空闲块,则将其划分为两个部分,一个部分给予进程使用,另一个部分保留为新的空闲块。
4.如果未找到合适的空闲块,则表示内存空间不足,需要进行深度缺页异常处理。
以下是一个循环首次适应算法的模拟过程:1.假设一个内存空间大小为1000KB,初始时为一个整体的空闲块。
2.进程A请求100KB的内存空间,开始内存空闲块链表。
3.如果找到合适的空闲块(大小≥100KB),则将其划分为两个部分,一个部分分配给进程A,另一个部分保留为新的空闲块。
4.进程B请求200KB的内存空间,继续内存空闲块链表。
5.如果找到合适的空闲块(大小≥200KB),则将其划分为两个部分,一个部分分配给进程B,另一个部分保留为新的空闲块。
6.进程C请求150KB的内存空间,继续内存空闲块链表。
7.找到合适的空闲块(大小≥150KB),将其划分为两个部分,一个部分分配给进程C,另一个部分保留为新的空闲块。
8.进程D请求300KB的内存空间,继续内存空闲块链表。
但此时已经循环了一次,仍未找到合适的空闲块。
9.进行深度缺页异常处理,即向操作系统申请更多的内存空间。
10.操作系统分配一块500KB的空闲块给进程D。
11.继续内存空闲块链表,找到合适的空闲块(大小≥300KB)。
12.将其划分为两个部分,一个部分分配给进程D,另一个部分保留为新的空闲块。
13.进程E请求250KB的内存空间,继续内存空闲块链表。
14.找到合适的空闲块(大小≥250KB),将其划分为两个部分,一个部分分配给进程E,另一个部分保留为新的空闲块。
15.当所有进程运行完毕后,剩余的空闲块可以继续加入链表,供下一次的分配请求使用。
总结起来,循环首次适应算法通过循环链表合适大小的空闲块来满足进程的内存需求,能够最大限度地利用内存空间,避免了内存碎片的产生。
最好适应动态分区分配算法模拟动态分区分配算法是操作系统中的一种管理内存分配的方法,它可以根据实际需求动态地分配和回收内存。
在动态分区分配算法中,内存被划分为多个较小的区域,每个区域可以被分配给一个进程使用。
当一个进程结束后,它所占用的内存可以被回收,并重新分配给其他进程使用。
以下是一个模拟动态分区分配算法的例子。
假设系统中有4个进程需要申请内存空间,它们的大小分别是:P1(100KB)、P2(200KB)、P3(400KB)、P4(300KB)。
本例中我们采用首次适应算法(First Fit)来模拟动态分区分配。
首次适应算法是指内存分区按大小顺序排列,当有一个进程需要内存分配时,系统从低地址到高地址进行,找到一个能满足所需大小的内存分区即可。
以下是该算法的详细步骤:1.初始化内存分区列表。
假设系统中的内存总大小为1000KB,起始地址为0KB,结束地址为1000KB。
此时内存分区列表为空。
2.进程P1申请100KB的内存空间。
内存分区列表,找到第一个大小大于等于100KB的空闲分区,假设为Q1(大小为200KB)。
将分区Q1划分为两个部分:一个部分给进程P1使用,大小为100KB;另一个部分留作未分配区,大小为100KB。
更新内存分区列表,添加两个分区:分区Q1(已分配给P1)和分区Q2(未分配区,大小为100KB)。
此时内存分区列表为:Q1(100KB,已分配给P1)、Q2(100KB,未分配区)。
3.进程P2申请200KB的内存空间。
内存分区列表,找到第一个大小大于等于200KB的空闲分区,假设为Q3(大小为400KB)。
将分区Q3划分为两个部分:一个部分给进程P2使用,大小为200KB;另一个部分留作未分配区,大小为200KB。
更新内存分区列表,添加两个分区:分区Q3(已分配给P2)和分区Q4(未分配区,大小为200KB)。
此时内存分区列表为:Q1(100KB,已分配给P1)、Q2(100KB,未分配区)、Q3(200KB,已分配给P2)、Q4(200KB,未分配区)。
“计算机操作系统”课程设计实验报告动态内存分区分配方式模拟学生姓名专业名称学号目录1 题目要求 (1)2 设计思想 (1)3 数据定义 (2)4 处理流程 (3)5 源程序 (6)6 运行结果 (15)7 设计体会 (22)动态内存分区分配方式模拟1题目要求假设初始态下,可用内存空间为640K,并有下列请求序列,请分别用首次适应算法和最佳适应算法为作业分配和回收内存块,并显示出每次分配和回收后的空闲分区链的情况来以及内存占用情况图。
作业1申请130K作业2申请60K作业3申请100k作业2释放60K作业4申请200K作业3释放100K作业1释放130K作业5申请140K作业6申请60K作业7申请50K作业6释放60K2设计思想根据题目要求,要用首次适应算法和最佳适应算法分别实现内存的动态分区,因此先介绍一下这两种算法的基本思想:首次适应算法中,空闲分区链是按地址递增的次序链接的,当要分配内存空间时,就查表,在各空闲分区中查找满足大小要求的可用块,只要找到第一个足以满足要求的空间就停止查找,并把它分配出去,如果该空闲空间与所需空间大小一样,则将该分区的状态改为1,即已被分配,若还有剩余,则将剩余空间重新划为一个空闲分区,有新的起始地址,状态为0。
最佳适应算法的空闲链是按照空闲块的大小为序、按增量方式排列的,即小块在前,大块在后,它在满足需要的前提下,尽量分配最小的空闲块,这样每次查找分配时第一次找到的能满足要求的必然的最佳的,若空闲空间大小与要分配的大小相差不多时,可直接将其状态改为1即可,若有剩余,则将剩余空闲空间重新划分为一个空闲区,并根据空闲区的大小对链表进行重新排序。
首次适应算法的回收过程相对简单,因为分区链是按照地址顺序链接的,因此释放内存时只需要判断要释放的分区前后是否也为空闲区,然后根据情况看是要跟前边或后边或前后都合并为一个大的空闲区,如果前后分区都已分配,则直接将该分区状态改为0即可。
课程设计报告课程设计题目:循环首次适应的动态分区分配算法模拟专业:计算机科学与技术班级:10204102姓名:谱学号: 10204102指导教师:高小辉2013年1月11 日目录一.循环首次适应算法 (3)1. 概述 (3)2.需求分析 (3)二.实验指导 (4)1.基本思想 (4)2.数据结构 (4)三.运行环境 (6)四.流程图 (6)五.循环首次适应算法代码 (5)六.调试结果 (11)七、总结 (14)八.参考文献 (14)一.循环首次适应算法1.概述:该算法是由首次适应算法演变而成的。
在为进程分配内存空间时,不再是每次都从链首开始查找,而是从上次找到的空闲分区的下一个空闲分区开始查找,直至找到一个能满足要求的空闲分区,从中划出一块的请求大小相等的内存空间分配给作业。
为实现该算法,应设置一起始查找指针,用于指示下一次起始查询的空闲分区,并采用循环查找方式,即如果最后一个(链尾)空闲分区的大小仍不能满足要求,则返回到第一个空闲分区,比较大小是否满足,找到后,应调整起始查询指针。
2. 需求分析了解动态分区分配中使用的数据结构和分配算法,并进一步加深对动态分区存储管理方式及其实现过程的理解。
采用首次适应算法的动态分区分配过程alloc()和回收过程free()。
空闲分区通过空闲分区链表来管理,在进行内存分配时,系统优先使用空闲区低端的空间,即每次分配内存空间是总是从低址部分开始进行循环,找到第一个合适的空间,便按作业所需分配的大小分配给作业。
作业完成时,需要释放作业所占空间,此时要考虑到四种情况:(1)回收区与插入点的前一个空闲分区相邻接。
此时将二者合并,修改前一分区的大小。
(2)回收区与插入点的后一空闲分区相邻接,将二者合并,用回收区的首址作为新空闲区的首址。
(3)回收区同时与插入点的前后两个空闲分区相邻接,三者合并,使用前一空闲分区的表项和首址。
(4)回收区单独存在。
二、实验指导1.基本思想动态分区是指系统不预先划分固定分区,而是在装入程序的时候划分内存区域,使得为程序分配的分区大小恰好等于该程序的需求量,且分区的个数是动态的。
课程设计题目动态分区管理的主存分配模拟设计--最优适应法、最差适应法学院计算机科学与技术学院专业计算机科学与技术专业班级计算机1002班姓名刘浪浪指导教师杨克俭2013 年 1 月20 日课程设计任务书学生姓名:刘浪浪专业班级:计科1002班指导教师:杨克俭工作单位:计算机科学与技术学院题目: 动态分区管理的主存分配模拟设计--最优适应法、最差适应法初始条件:1.预备内容:阅读操作系统的内存管理章节内容,理解动态分区的思想,并体会各分配算法的具体实施方法。
2.实践准备:掌握一种计算机高级语言的使用。
要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)1.采用指定算法模拟动态分区管理方式的主存分配。
能够处理以下的情形:⑴随机出现的进程i申请jKB内存,程序能判断是否能分配,如果能分配,要求输出分配的首地址Faddress,并要求输出内存使用情况和空闲情况。
内存情况输出的格式为:Faddress该分区的首地址;Eaddress该分区的尾地址Len 分区长度;Process 如果使用,使用的进程号,否则为0⑵主存分配函数实现寻找空闲区、空闲区表的修改、已分配区表的修改功能;2.设计报告内容应说明:⑴课程设计目的与功能;⑵需求分析,数据结构或模块说明(功能与框图);⑶源程序的主要部分;⑷运行结果与运行情况分析;⑸自我评价与总结:i)你认为你完成的设计哪些地方做得比较好或比较出色;ii)什么地方做得不太好,以后如何改正;iii)从本设计得到的收获(在编写,调试,执行过程中的经验和教训);iv)完成本题是否有其他的其他方法(如果有,简要说明该方法);v)对实验题的评价和改进意见,请你推荐设计题目。
时间安排:设计安排一周:周1、周2:完成程序分析及设计。
周2、周3:完成程序调试及测试。
周4、周5:验收、撰写课程设计报告。
(注意事项:严禁抄袭,一旦发现,抄与被抄的一律按0分记)指导教师签名:年月日系主任(或责任教师)签名:年月日一、题目动态分区管理的主存分配模拟设计--最优适应法、最差适应法二、主要任务1.采用指定算法模拟动态分区管理方式的主存分配。
操作系统c语言设计程序模拟内存的动态分区内存管理方法.内存分区使用分区(说明)表1. 引言1.1 概述在计算机科学领域,内存管理是操作系统中至关重要的一个组成部分。
操作系统需要负责对内存资源进行合理的分配和释放,确保程序能够顺利执行,并且不会发生内存泄漏等问题。
本篇文章将介绍一种基于C语言设计程序模拟内存的动态分区内存管理方法。
该方法通过使用分区表来对内存空间进行动态管理。
我们将详细探讨这种方法的实现步骤、技巧以及性能评估和案例分析结果。
1.2 文章结构本文主要分为五个部分:引言、动态分区内存管理方法、C语言设计程序模拟内存的实现步骤与技巧、程序模拟内存动态分区内存管理方法性能评估和案例分析,以及结论与展望。
在引言部分,我们将首先介绍本文的概述,即主题和目标。
然后简要说明文章的结构,以便读者更好地理解全文内容。
1.3 目的本文旨在介绍一种使用C语言设计程序模拟内存的动态分区内存管理方法,并探讨该方法在实际应用中可能遇到的问题和优化建议。
我们希望通过本文的阐述,读者可以对动态分区内存管理方法有更深入的理解,并能够在实际项目中应用相关技术和知识。
通过对程序模拟动态分区内存管理方法进行性能评估和案例分析,我们也旨在为读者提供一个参考,帮助他们更好地理解该方法的优缺点,并从中获得一些有价值的启示。
总之,本文将为读者提供一种全面而深入的了解动态分区内存管理方法的途径,并希望能够激发读者们对内存管理领域研究的兴趣。
2. 动态分区内存管理方法2.1 内存管理概述在操作系统中,内存管理是一个关键的部分。
动态分区内存管理方法是一种常用的内存分配技术,它将可用的内存空间划分为多个不同大小的动态分区,以便满足不同程序对内存空间的需求。
2.2 动态分区内存管理算法原理动态分区内存管理算法主要包括三种:首次适应算法、最佳适应算法和最坏适应算法。
首次适应算法是指从空闲列表中选择第一个能满足所需内存大小的空闲块进行分配。
这种算法简单直观,但可能会产生较大的碎片化问题。
一.题目:存储管理---动态分区分配算法的模拟二.任务:设计主界面以灵活选择某算法,且以下算法都要实现:首次适应算法、循环首次适应算法、最佳适应算法;。
三.思想:对任务进行构思和设想。
(1)首次适应算法:FF算法要求空闲分区链以地址递增的次序链接。
在分配内存时,从链首开始顺巡查找,直到找到一个大小能够满足要求的空闲分区为止;然后再按照作业的大小,从该分区中划出一块内存空间分配给请求者,余下的空闲区间仍留在空闲链中。
若从链首直至链尾都不能找到一个能满足要求的分区,则此次内存分配失败,返回。
该算法倾向于优先利用内存中低址部分的空闲分区,从而保留了高址部分的大空闲区。
这给为以后到达的大作业分配大的内存空间创造了条件。
(2)循环首次适应算法该算法是由首次适应算法演变而成的。
在为进程分配内存空间时,不再是每次都从链首开始查找,而是从上次找到的空闲分区的下一个空闲分区开始查找,直至找到一个能满足要求的空闲分区,从中划出一块的请求大小相等的内存空间分配给作业。
为实现该算法,应设置一起始查找指针,用于指示下一次起始查询的空闲分区,并采用循环查找方式,即如果最后一个(链尾)空闲分区的大小仍不能满足要求,则返回到第一个空闲分区,比较大小是否满足,找到后,应调整起始查询指针。
(3)最佳适应算法是将最小的空闲分区分配给作业,避免"大材小用"。
为了加速寻找,该算法要求将所有的空闲分区按照某容量以从小到大的顺序形成一空闲分区链。
这样,第一次找到的能满足要求的空闲区,必然是最佳的。
(4)内存回收:将释放作业所在内存块的状态改为空闲状态,删除其作业名,设置为空。
并判断该空闲块是否与其他空闲块相连,若释放的内存空间与空闲块相连时,则合并为同一个空闲块,同时修改分区大小及起始地址。
四.目的:在构思中提出要达到的目的。
(1)按照首次适应算法对内存进行分配,得到(2)按照循环首次适应算法对内存(3)按照最佳适应算法对内存进行分配(4)在作业完成时,释放作业所在内存块,使其能够再次被利用五.方案:对构思的细化,提出粗略的方案。
(1)首次适应算法:设立头指针,每次从头指针开始查找,进行内存分配(2)最佳适应算法:设立一个指针纪录最佳位置,然后根据内存大小,对最佳位置进行分配(3)循环首次适应算法:设立查找指针,查找指针初始为链首指针,最后位置为查找指针,返回查找指针,第二次运行时从查找指针开始查找。
(4)内存回收:将释放的空间与前后空闲状态区间合并,改写空闲区间地址和大小六.框图:根据方案画出框图并审核框图。
七.程序:是实施框图的主体并运行和修改。
1.有大小恰好合适的空闲块if(p->data.state==Free && p->data.size==request){p->data.state=Busy;p->data.ID=ID;return OK;break;}2.有空闲块能满足需求且有剩余"if(p->data.state==Free && p->data.size>request){temp->prior=p->prior;temp->next=p;temp->data.address=p->data.address;p->prior->next=temp;p->prior=temp;p->data.address=temp->data.address+temp->data.size; p->data.size-=request;return OK;}3.回收内存if(p->data.ID==ID)p->data.state=Free;p->data.ID=Free;if(p->prior->data.state==Free)//与前面的空闲块相连 {p->prior->data.size+=p->data.size;p->prior->next=p->next;p->next->prior=p->prior;}if(p->next->data.state==Free)//与后面的空闲块相连{p->data.size+=p->next->data.size;p->next->next->prior=p;p->next=p->next->next;}八.文档:运行环境,输入条件,输出结果,整理成文。
1. 运行环境:操作系统 WINDOWS XP编译软件 Microsoft Visual C++电脑配置:主频3.0GHz 内存512MB2.输入条件作业1 申请 130KB作业1 申请 60KB作业1 申请 100KB作业1 释放 130KB作业1 申请 100KB作业1 释放 60KB九.总结:谈心得体会,特别是开发一个软件的体会。
开发一个软件需要有软件需求分析,软件流程图,根据流程进行软件的编写。
在编写软件时需要很好的结构感,编写的程序需要有框架,编写的程序需要补充语句说明,让观看着更好的了解程序,使用程序。
十.附件:完整程序#include<iostream.h>#include<stdlib.h>#define Free 0 //空闲状态#define Busy 1 //已用状态#define OK 1 //完成#define ERROR 0 //出错#define MAX_length 640 //最大内存空间为640KBtypedef int Status;typedef struct freearea//定义一个空闲区说明表结构{int ID; //分区号long size; //分区大小long address; //分区地址int state; //状态}ElemType;//---------- 线性表的双向链表存储结构 ------------typedef struct DuLNode //双向链表{ElemType data;struct DuLNode *prior; //前趋指针struct DuLNode *next; //后继指针}DuLNode,*DuLinkList;DuLinkList block_first; //头结点DuLinkList block_last; //尾结点Status alloc(int);//内存分配Status free(int); //内存回收Status First_fit(int,int);//首次适应算法Status Best_fit(int,int); //最佳适应算法Status Next_fit(int,int); //循环首次适应算法void show();//查看分配Status Initblock();//开创空间表Status Initblock()//开创带头结点的内存空间链表{block_first=(DuLinkList)malloc(sizeof(DuLNode));block_last=(DuLinkList)malloc(sizeof(DuLNode));block_first->prior=NULL;block_first->next=block_last;block_last->prior=block_first;block_last->next=NULL;block_last->data.address=0;block_last->data.size=MAX_length;block_last->data.ID=0;block_last->data.state=Free;return OK;}//----------------------- 分配主存 ------------------------- Status alloc(int ch){int ID,request;cout<<"请输入作业(分区号):";cin>>ID;cout<<"请输入需要分配的主存大小(单位:KB):";cin>>request;if(request<0 ||request==0){cout<<"分配大小不合适,请重试!"<<endl;return ERROR;}if(ch==3) //选择循环首次适应算法{if(Next_fit(ID,request)==OK) cout<<"分配成功!"<<endl;else cout<<"内存不足,分配失败!"<<endl;return OK;}else if(ch==2) //选择最佳适应算法{if(Best_fit(ID,request)==OK) cout<<"分配成功!"<<endl; else cout<<"内存不足,分配失败!"<<endl;return OK;}else //默认首次适应算法{if(First_fit(ID,request)==OK) cout<<"分配成功!"<<endl; else cout<<"内存不足,分配失败!"<<endl;return OK;}}//------------------ 首次适应算法 ----------------------- Status First_fit(int ID,int request)//传入作业名及申请量{//为申请作业开辟新空间且初始化DuLinkList temp=(DuLinkList)malloc(sizeof(DuLNode));temp->data.ID=ID;temp->data.size=request;temp->data.state=Busy;DuLNode *p=block_first->next;while(p){if(p->data.state==Free && p->data.size==request){//有大小恰好合适的空闲块p->data.state=Busy;p->data.ID=ID;return OK;break;}if(p->data.state==Free && p->data.size>request){//有空闲块能满足需求且有剩余"temp->prior=p->prior;temp->next=p;temp->data.address=p->data.address;p->prior->next=temp;p->prior=temp;p->data.address=temp->data.address+temp->data.size; p->data.size-=request;return OK;break;}p=p->next;}return ERROR;}//-------------------- 最佳适应算法 ------------------------ Status Best_fit(int ID,int request)//传入作业名及申请量{int ch; //记录最小剩余空间DuLinkList temp=(DuLinkList)malloc(sizeof(DuLNode));temp->data.ID=ID;temp->data.size=request;temp->data.state=Busy;DuLNode *p=block_first->next;DuLNode *q=NULL; //记录最佳插入位置while(p) //初始化最小空间和最佳位置{if(p->data.state==Free &&(p->data.size>request || p->data.size==request) ) {q=p;ch=p->data.size-request;break;}p=p->next;}while(p){if(p->data.state==Free && p->data.size==request){//空闲块大小恰好合适p->data.ID=ID;p->data.state=Busy;return OK;break;}if(p->data.state==Free && p->data.size>request){//空闲块大于分配需求if(p->data.size-request<ch)//剩余空间比初值还小{ch=p->data.size-request;//更新剩余最小值q=p;//更新最佳位置指向}}p=p->next;}if(q==NULL) return ERROR;//没有找到空闲块else{//找到了最佳位置并实现分配temp->prior=q->prior;temp->next=q;temp->data.address=q->data.address;q->prior->next=temp;q->prior=temp;q->data.address+=request;q->data.size=ch;return OK;}}//-------------------- 循环首次适应算法 ------------------------ Status Next_fit(int ID,int request)//传入作业名及申请量{//为申请作业开辟新空间且初始化DuLinkList temp=(DuLinkList)malloc(sizeof(DuLNode));temp->data.ID=ID;temp->data.size=request;temp->data.state=Busy;static DuLNode *p=block_first->next;//定义静态指针变量if(p->data.size<request)p=block_first->next;while(p){if(p->data.state==Free && p->data.size==request){//有大小恰好合适的空闲块p->data.state=Busy;p->data.ID=ID;return OK;break;}if(p->data.state==Free && p->data.size>request){//有空闲块能满足需求且有剩余"temp->prior=p->prior;temp->next=p;temp->data.address=p->data.address;p->prior->next=temp;p->prior=temp;p->data.address=temp->data.address+temp->data.size; p->data.size-=request;return OK;break;}p=p->next;}return ERROR;}//----------------------- 主存回收 -------------------- Status free(int ID){DuLNode *p=block_first;while(p){if(p->data.ID==ID){p->data.state=Free;p->data.ID=Free;if(p->prior->data.state==Free)//与前面的空闲块相连 {p->prior->data.size+=p->data.size;p->prior->next=p->next;p->next->prior=p->prior;}if(p->next->data.state==Free)//与后面的空闲块相连{p->data.size+=p->next->data.size;p->next->next->prior=p->prior;p->prior->next=p->next;}break;}p=p->next;}return OK;}//--------------- 显示主存分配情况 ------------------void show(){cout<<"+++++++++++++++++++++++++++++++++++++++\n";cout<<"+++ 主存分配情况 +++\n";cout<<"+++++++++++++++++++++++++++++++++++++++\n";DuLNode *p=block_first->next;while(p){cout<<"分区号:";if(p->data.ID==Free) cout<<"Free"<<endl;else cout<<p->data.ID<<endl;cout<<"起始地址:"<<p->data.address<<endl;cout<<"分区大小:"<<p->data.size<<" KB"<<endl;cout<<"状态:";if(p->data.state==Free) cout<<"空闲"<<endl;else cout<<"已分配"<<endl;cout<<"--------------"<<endl;p=p->next;}}//----------------------- 主函数---------------------------void main(){loop: int ch;//算法选择标记cout<<" 动态分区分配方式的模拟 \n";cout<<"*********************************************************\n";cout<<"*********************************************************\n";cout<<"** 1)首次适应算法 2)最佳适应算法 3)循环首次适应算法 **\n"; cout<<"*********************************************************\n";cout<<"*********************************************************\n"; cout<<"请选择分配算法:";cin>>ch;Initblock(); //开创空间表int choice; //操作选择标记while(1){cout<<"********************************************\n";cout<<"** 1: 分配内存 2: 回收内存 **\n";cout<<"** 3: 查看分配 0: 退出 **\n";cout<<"********************************************\n";cout<<"请输入您的操作:";cin>>choice;if(choice==1) alloc(ch); // 分配内存else if(choice==2) // 内存回收{int ID;cout<<"请输入您要释放的分区号:";cin>>ID;free(ID);}else if(choice==3) show();//显示主存else if(choice==0) goto loop; //退出else //输入操作有误{cout<<"输入有误,请重试!"<<endl;continue;}}}。