操作系统存储管理分区分配算法
分区存储管理

1、单用户连续分区存储管理
单一连续分区:把内存储器分为两个区,一个分区固定分配给操 作系统使用,另一个分配给用户使用,称作“用户区” 系统特点:1、系统总是把整个用户区分配给一个用户使用 2、内存用户区又被分为“使用区”和“空闲区”两部分 3、当作业被调度时就获得全部空间 4、作业运行完后,全部主存空间又恢复成空闲(以上所指 的全部主存空间是全部用户区空间) 对于连续区分配而言,虽然这种管理方案不需要专门的硬件,但是应 有硬件保护机构,以确保用户程序不至于偶然或无意地干扰系统区中 的信息 使用界限寄存器的方法。界限寄存器中存放用户程序的起始地址 和终止地址,作业运行时,检查访问指令或数据的地址,若不在界限 寄存器所框住的范围内,则发生越界中断。
分
区 1 2 3 4
号
起 始 地 址 20KB 28KB 60KB 124KB
长 8KB 32KB 64KB
度
使 用 标 志 作业1 作业6 0 作业2
132KB
地址重定位与存储保护
在采用固定分区存储管理这种存储管理方式时,应该对程序实行静态 重定位。不仅要防止用户程序对操作系统形成的侵扰,也要防止用户程序 与用户程序之间形成的侵扰。因此必须在CPU中设置一对专用的寄存器,用 于存储保护。
3、可变分区存储管理
内存的分配:内存不是预先划分好的,而是当作业装入时,根据作业的需求和内 存空间的使用情况来决定是否分配。若有足够的空间,则按需要分割与作业相对 地址空间同样大小分区给该进程;否则令其等待主存空间
最先适应算法
最佳适应算法
最坏ቤተ መጻሕፍቲ ባይዱ应算法
2、固定分区存储管理
“固定分区”存储管理的基本思想:预先把内存储器中可供分配的 用户区事先划分成若干个连续的分区,每个分区的尺寸可以相同, 也可以不同。划分后,内存储器中分区的个数以及每个分区的位置、 尺寸保持不变。每个分区中只允许装入一个作业运行。
动态分区管理方式及动态分区算法

动态分区管理方式及动态分区算法一、动态分区概述在操作系统中,内存管理是一个非常重要的部分。
在实际的应用中,程序的内存需求是会发生变化的,因此需要一种灵活的内存管理方式来满足不同程序的内存需求。
动态分区管理方式应运而生,它可以根据程序的需求,灵活地分配和回收内存空间,是一种高效的内存管理方式。
二、动态分区管理方式动态分区管理方式是指将内存划分为多个大小不等的分区,每个分区都可以被分配给进程使用,当进程终止时,分区将被回收。
动态分区管理方式通常通过动态分区算法来实现,下面将介绍几种常见的动态分区算法。
三、首次适应算法首次适应算法是最简单和最直观的动态分区分配算法。
它的基本思想是在空闲分区链表中按照位置区域顺序查找第一个能够满足进程大小需求的空闲分区,并将其分配给进程。
首次适应算法的优点是实现简单,分区利用率较高,但缺点是会产生大量的不连续碎片。
四、最佳适应算法最佳适应算法是在空闲分区链表中查找满足进程大小需求的最小空闲分区,并将其分配给进程。
最佳适应算法的优点是可以减少外部碎片,缺点是查找适合的空闲分区会花费较长的时间。
五、最坏适应算法最坏适应算法是在空闲分区链表中查找满足进程大小需求的最大空闲分区,并将其分配给进程。
最坏适应算法的优点是能够产生较小的碎片,但缺点是会导致剩余分区较多,影响分区利用率。
六、动态分区管理方式的优缺点动态分区管理方式相比于静态分区管理方式有很多优点,比如可以灵活地满足不同程序的内存需求,可以动态地合并和分割分区,提高了内存的利用率等。
但是动态分区管理方式也有一些缺点,比如会产生碎片,分配和回收内存的开销较大等。
七、结语动态分区管理方式及其算法在实际应用中有着广泛的应用,通过合理选择动态分区算法,可以提高内存的利用率,改善系统性能。
也需要注意动态分区管理方式可能产生的碎片问题,可以通过内存紧缩等手段来解决。
希望本文对读者有所帮助。
动态分区管理方式及动态分区算法八、碎片问题与解决方法在动态分区管理方式中,经常会出现碎片问题,包括内部碎片和外部碎片。
动态分区分配操作系统操作方法实验步骤

动态分区分配操作系统操作方法实验步骤1.引言1.1 概述概述部分:在计算机系统中,动态分区分配是一种重要的操作系统操作方法。
它是指在运行时根据进程的内存需求动态地将系统内存分配给进程,以实现内存资源的高效利用。
动态分区分配操作方法在现代操作系统中被广泛应用,例如Windows、Linux等。
通过合理的动态分区分配策略,可以提升系统的性能和资源利用率。
本文将对动态分区分配操作系统操作方法进行详细介绍和实验步骤的说明。
首先,我们将介绍动态分区分配的背景和意义,包括其在操作系统中的作用和应用场景。
其次,我们将详细讨论实验的具体步骤,包括如何进行动态分区分配操作、如何测试相关的性能指标等。
本文的目标是帮助读者了解动态分区分配操作系统操作方法的基本原理和实践技巧。
同时,通过实际操作和实验验证,读者将能够更好地理解动态分区分配的概念和操作过程,提升对操作系统的理解和应用能力。
在接下来的章节中,我们将分别介绍动态分区分配操作系统操作方法的背景和实验步骤,并给出相应的实例和案例分析。
最后,我们将对实验结果进行总结和展望,探讨动态分区分配操作方法的发展前景和可能的研究方向。
通过本文的阅读和实验操作,读者将能够对动态分区分配操作系统操作方法有一个全面的了解,为进一步研究和应用提供基础和指导。
同时,我们也欢迎读者对本文内容进行补充和扩展,以促进相关领域的进一步发展和应用。
1.2 文章结构文章结构部分的内容可以从以下角度进行描述:文章结构是指整篇文章的组织框架和内容安排。
合理的文章结构可以使读者更好地理解文章的主题和内容,帮助读者快速找到所需信息并形成完整的认识。
本文将按照以下结构进行论述:1. 引言:在引言部分,我们将对动态分区分配操作系统操作方法的背景和意义进行介绍,明确文章的目的和重要性。
2. 正文:正文是文章的核心部分,将分为两个要点进行叙述。
2.1 第一个要点:动态分区分配操作系统操作方法。
首先,我们将对动态分区分配的背景进行介绍,解释其在操作系统中的应用和意义。
存储器管理——动态分区的分配与回收

计算机与信息工程系实验报告
班级计算机
1001
姓名李双贺时间2011.11.09 地点A504
实验名称存储器管理——动态分区的分配与回收
实验目的
目的是在学习操作系统理论知识的基础上,对操作系统整体的一个模拟。
研究计算机操作系统的基本原理和算法,掌握操作系统的存储器管理的首次适应算法、循环首次适应算法、最佳适应算法的基本原理和算法。
提高运用操作系统知识和解决实际问题的能力;并且锻炼自己的编程能力、创新能力以及开发软件的能力。
使学生掌握基本的原理和方法,最后达到对完整系统的理解。
实验内容
内存调度策略可采用首次适应算法、循环首次适应算法和最佳适应法等,并对各种算法进行性能比较。
为了实现分区分配,系统中必须配置相应的数据结构,用来描述空闲区和已分配区的情况,为分配提供依据。
常用的数据结构有两种形式:空闲分区表和空闲分区链。
为把一个新作业装入内存,须按照一定的算法,从空闲分区表或空闲分区链中选出一个分区分配给该作业。
实验结果。
存储管理动态分区分配及回收算法

存储管理动态分区分配及回收算法存储管理是操作系统中非常重要的一部分,它负责对计算机系统的内存进行有效的分配和回收。
动态分区分配及回收算法是其中的一种方法,本文将详细介绍该算法的原理和实现。
动态分区分配及回收算法是一种将内存空间划分为若干个动态分区的算法。
当新的作业请求空间时,系统会根据作业的大小来分配一个合适大小的分区,使得作业可以存储在其中。
当作业执行完毕后,该分区又可以被回收,用于存储新的作业。
动态分区分配及回收算法包括以下几个步骤:1.初始分配:当系统启动时,将整个内存空间划分为一个初始分区,该分区可以容纳整个作业。
这个分区是一个连续的内存块,其大小与初始内存大小相同。
2.漏洞表管理:系统会维护一个漏洞表,用于记录所有的可用分区的大小和位置。
当一个分区被占用时,会从漏洞表中删除该分区,并将剩余的空间标记为可用。
3.分区分配:当一个作业请求空间时,系统会根据作业的大小,在漏洞表中查找一个合适大小的分区。
通常有以下几种分配策略:- 首次适应(First Fit): 从漏洞表中找到第一个满足作业大小的分区。
这种策略简单快速,但可能会导致内存碎片的产生。
- 最佳适应(Best Fit): 从漏洞表中找到最小的满足作业大小的分区。
这种策略可以尽量减少内存碎片,但是分配速度相对较慢。
- 最差适应(Worst Fit): 从漏洞表中找到最大的满足作业大小的分区。
这种策略可以尽量减少内存碎片,但是分配速度相对较慢。
4.分区回收:当一个作业执行完毕后,系统会将该分区标记为可用,并更新漏洞表。
如果相邻的可用分区也是可合并的,系统会将它们合并成一个更大的分区。
总结来说,动态分区分配及回收算法是一种对计算机系统内存进行有效分配和回收的方法。
通过合理的分配策略和回收机制,可以充分利用内存资源,提高系统性能。
然而,如何处理内存碎片问题以及选择合适的分配策略是需要仔细考虑的问题。
动态分区分配算法

动态分区分配算法动态分区分配算法是在计算机内存管理中使用的一种内存分配策略。
在动态分区分配算法下,内存被划分为多个大小不一的分区,每个分区可以用来存储不同大小的进程。
当一个进程需要内存时,系统会选择一个合适的分区来满足其需求。
动态分区分配算法有多种实现方式,常用的包括最先适应算法、最佳适应算法和最坏适应算法。
最先适应算法(First Fit)是最简单和最常用的动态分区分配算法之一、该算法从内存起始位置开始查找合适的分区,一旦找到一个大小大于等于所需内存大小的空闲分区,就将该进程分配给这个分区并将分区大小减去所需内存大小。
这种算法的优点是实现简单、分区利用率高,但它可能会导致较小的分区被浪费掉,从而导致外部碎片的产生。
最佳适应算法(Best Fit)是另一种常用的动态分区分配算法。
该算法从所有空闲分区中选择一个大小最适合所需内存大小的分区来分配。
相比于最先适应算法,最佳适应算法能够更好地利用内存分区,减少外部碎片的产生。
然而,该算法的实现相对复杂,并且容易产生许多较小的空闲分区,导致分区利用率降低。
最坏适应算法(Worst Fit)是另一种动态分区分配算法。
该算法选择一个大小最大的空闲分区来分配给进程,这样可以留下更多较小的空闲分区,以备将来的进程使用。
然而,最坏适应算法可能会导致较大的分区被浪费掉,从而导致外部碎片的产生。
同样,该算法的实现也相对复杂,并且分区利用率相对较低。
动态分区分配算法的选择取决于特定的应用和场景。
最先适应算法在分配速度和分区利用率方面可能更优,但可能会产生较多的外部碎片。
最佳适应算法能够更好地利用内存分区,但实现复杂,容易产生较小的空闲分区。
最坏适应算法留下较小的空闲分区,但分区利用率较低。
因此,在选择动态分区分配算法时,需要权衡这些因素,并根据特定需求进行选择。
动态分区分配算法在现代操作系统中起着重要的作用,可以有效管理内存资源,提高系统的性能和效率。
同时,动态分区分配算法也是操作系统中的一个重要研究领域,不断有新的技术和算法被提出来优化内存管理,满足日益复杂的应用需求。
存储管理分区分配算法

存储管理分区分配算法存储管理是操作系统中的重要组成部分,其任务是有效地管理计算机系统的存储空间。
在内存中,存储空间分为若干个分区,每个分区可以用来存放一个或多个进程。
存储管理分区分配算法是指操作系统如何将进程分配到可用的存储分区中。
本文将介绍常见的存储管理分区分配算法,包括固定分区分配、动态分区分配和可变分区分配。
固定分区分配算法是最简单的一种分区分配算法,它将内存划分为若干个固定大小的分区。
每个分区可以容纳一个进程,当一个进程需要被加载到内存中时,操作系统会找到一个合适大小的空闲分区,并将进程加载到该分区中。
固定分区分配算法不需要考虑内存碎片问题,但是由于分区大小固定,会导致一些内存空间不能被充分利用。
动态分区分配算法是一种比较灵活的分区分配算法,它将内存划分为若干个变化大小的分区。
当一个进程需要被加载到内存中时,操作系统会找到一个大小合适的空闲分区,并将进程加载到该分区中。
如果内存中没有合适大小的空闲分区,操作系统可以选择进行分区的合并或者分割,以满足进程的需求。
动态分区分配算法可以更好地利用内存空间,但是它需要考虑内存碎片问题。
可变分区分配算法是一种综合了固定分区分配算法和动态分区分配算法的算法。
它可以根据不同的情况选择最合适的分区分配方式。
当内存中有大块空闲分区时,可变分区分配算法可以使用固定分区分配算法,将该分区划分为多个固定大小的小分区,以利用内存空间;当内存中只有少量小块空闲分区时,可变分区分配算法可以使用动态分区分配算法,充分利用内存碎片。
可变分区分配算法可以在固定分区分配算法和动态分区分配算法之间取得一个平衡。
综上所述,存储管理分区分配算法有固定分区分配、动态分区分配和可变分区分配三种。
不同的算法适用于不同的场景,需要根据具体情况选择最合适的算法。
固定分区分配算法适用于空间布局比较确定的情况;动态分区分配算法适用于分区大小变化比较大的情况;可变分区分配算法适用于两种情况之间的平衡。
存储管理动态分区分配及回收算法

存储管理动态分区分配及回收算法介绍存储管理是操作系统中一个重要的功能模块,负责管理计算机的内存资源。
本文将详细探讨存储管理中的动态分区分配及回收算法。
动态分区分配动态分区分配算法是指根据进程的内存需求,在内存中动态地创建分区,并将进程加载到相应的分区中。
下面是几种常见的动态分区分配算法。
1. 首次适应算法首次适应算法是最简单、最直观的动态分区分配算法。
它从内存的起始位置开始搜索,找到第一个能满足进程需求的分区即可。
具体步骤如下:1.初始化内存的空闲分区表,记录内存中每个空闲分区的起始地址和长度。
2.当一个进程需要分配内存时,遍历空闲分区表,找到第一个大小能满足进程需求的分区。
3.如果找到了合适的分区,将进程加载到该分区,并更新空闲分区表。
4.如果没有找到合适的分区,则提示内存不足。
首次适应算法的优点是简单、快速,但可能会导致碎片问题。
2. 最佳适应算法最佳适应算法是指选择与进程需求最接近的、且大小大于等于进程需求的分区。
具体步骤如下:1.初始化内存的空闲分区表。
2.当一个进程需要分配内存时,遍历空闲分区表,找到满足进程需求的最小分区。
3.如果找到了合适的分区,将进程加载到该分区,并更新空闲分区表。
4.如果没有找到合适的分区,则提示内存不足。
最佳适应算法能最大程度地减少碎片问题,但执行效率较低。
3. 最差适应算法最差适应算法是指选择与进程需求最接近的、且大小大于等于进程需求的最大分区。
具体步骤如下:1.初始化内存的空闲分区表。
2.当一个进程需要分配内存时,遍历空闲分区表,找到满足进程需求的最大分区。
3.如果找到了合适的分区,将进程加载到该分区,并更新空闲分区表。
4.如果没有找到合适的分区,则提示内存不足。
最差适应算法能最大程度地降低内存碎片,但执行效率相对较低。
4. 快速适应算法快速适应算法是一种基于空闲分区表大小的快速搜索算法。
具体步骤如下:1.初始化内存的空闲分区表。
2.当一个进程需要分配内存时,根据进程需求的大小,在空闲分区表中选择一个合适的分区。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
工业大学C语言程序设计课程设计(论文)题目:存储管理分区分配算法课程设计(报告)任务及评语目录第1章课程设计的目的与要求 (1)1.1 课程设计目的 (1)1.2 课程设计的实验环境 (1)1.3 课程设计的预备知识 (1)1.4 课程设计要求 (1)第2章课程设计内容 (2)2.1课程设计题目 (2)2.2课程设计整体设计说明 (2)2.2.1课程设计内容 (2)2.2.2系统功能模块结构图........................... 错误!未定义书签。
2.2.3数据结构设计及用法说明 (2)2.2.4程序结构(画流程图) (3)2.2.5各模块的功能 (5)2.3程序源代码及注释 (6)第3章课程设计总结 (14)参考资料 (15)第1章课程设计的目的与要求1.1 课程设计目的本课程设计是计算机科学与技术专业重要的实践性环节之一,是在学生学习完《程序设计语言(C)》课程后进行的一次全面的综合练习。
本课程设计的目的和任务:1. 巩固和加深学生对C语言课程的基本知识的理解和掌握2. 掌握C语言编程和程序调试的基本技能3. 利用C语言进行基本的软件设计4. 掌握书写程序设计说明文档的能力5. 提高运用C语言解决实际问题的能力1.2 课程设计的实验环境硬件要求能运行Windows 2000/XP操作系统的微机系统。
C语言程序设计及相应的开发环境。
1.3 课程设计的预备知识熟悉C语言及C语言开发工具。
1.4 课程设计要求1. 分析课程设计题目的要求2. 写出详细设计说明3. 编写程序代码,调试程序使其能正确运行4. 设计完成的软件要便于操作和使用5. 设计完成后提交课程设计报告第2章课程设计内容2.1程序功能介绍2.2程序整体设计说明本程序主要是对存储空间的分配和回收,当用户申请空间后进行合理的分配,空间不用后及时有效地进行回收或清除,以免发生空间的游离照成计算机堆积废物过多,空间得不到正常有利的使用,因而本程序是计算机空间得到了合理有效的最大利的帮助人们完成空间存储的分配和回收。
2.2.1设计思路通过用所学的C语言知识设计出一个存储管理分区分配算法采用首次适应算法和最佳适应算法实现。
步骤:①编写出系统功能模块结构图,目的为写流程图做好思路。
②1.定义check过程,用于检查指定的释放块(由用户键入)的合法性2.定义assignment1过程,实现First Fit Algorithm3.定义assignment2过程,实现Best Fit Algorithm4.定义acceptment1过程,实现First Fit Algorithm的回收算法5.定义acceptment2过程,实现Best Fit Algorithm的回收算法6.定义print过程,打印空闲区队列③程序首先申请一整块空闲区,其首址为0,大小为32767;然后,提示用户使用哪种分配算法,再提示是分配还是回收;分配时要求输入申请区的大小,回收时要求输入释放区的首址和大小。
2.2.2数据结构设计及用法说明1.定义分区描述器node,包括 3个元素:(1)addr——分区首地址(2)size——分区大小(3)next——指向下一个分区的指针2.定义 3个指向node结构的指针变量:(1)head1——空闲区队列首指针(2)back1——指向释放区node结构的指针(3)assign——指向申请的内存分区node结构的指针3.定义 1个整形变量:free——用户申请存储区的大小(由用户键入)2.2.3程序结构(流程图)主流程图:分流程图:2.2.4各模块的功能及程序说明RECT *assignment(RECT *head,int application) /*分配函数*/void acceptment1(RECT *head,RECT *back1)/*首先适应*/void acceptment2(RECT *head,RECT *back1) /*最佳适应,back1为回收结点的地址*/ void print(RECT *head) /*输出链表*/int backcheck(RECT *head,RECT *back1) /*检查回收块的合法性,back1为要回收的结点地址*/2.2.5程序结果*****index*******address********end*********size*****----------------------------------------------------1 0 32766 32767----------------------------------------------------Enter the way(best or first(b/f)bEnter the assign or accept(as/ac)asInput application:5631Success!!ADDRESS=27136*****index*******address********end*********size*****----------------------------------------------------1 0 27135 27136----------------------------------------------------Enter the assign or accept(as/ac)asInput application:5632Too large application!,assign fails!!*****index*******address********end*********size*****----------------------------------------------------1 0 3813 3814----------------------------------------------------Enter the assign or accept(as/ac)ac2.3程序源代码及注释/*9.3.2 源程序*//***pcb.c***/#include "stdio.h"#include "stdlib.h"#include "string.h"#define MAX 32767typedef struct node /*设置分区描述器*/{int address,size;struct node *next;}RECT;/*函数原型*/RECT *assignment(RECT *head,int application);void acceptment1(RECT *head,RECT *back1);void acceptment2(RECT *head,RECT *back1) ;int backcheck(RECT *head,RECT *back1);void print(RECT *head);/*变量声明*/RECT *head,*back,*assign1,*p;int application1,maxblocknum;char way;/*主函数*/main(){char choose[10];int check;head=malloc(sizeof(RECT)); /*建立可利用区表的初始状态*/p=malloc(sizeof(RECT));head->size=MAX;head->address=0;head->next=p;maxblocknum=1;p->size=MAX;p->address=0;p->next=NULL;print(head); /*输出可利用表初始状态*/printf("Enter the way(best or first(b/f)\n");/*选择适应策略*/ scanf("%c",&way);do{printf("Enter the assign or accept(as/ac)\n");scanf("%s",choose); /*选择分配或回收*/if(strcmp(choose,"as")==0) /*as为分配*/{printf("Input application:\n");scanf("%d",&application1);/*输入申请空间大小*/assign1=assignment(head,application1);/*调用分配函数*/if(assign1->address==-1)/*分配不成功*/printf("Too large application!,assign fails!!\n\n");elseprintf("Success!!ADDRESS=%5d\n",assign1->address); /*分配成功*/ print(head); /*输出*/}elseif(strcmp(choose,"ac")==0) /*回收*/back=malloc(sizeof(RECT));printf("Input Adress and Size!!\n");scanf("%d%d",&back->address,&back->size);/*输入回收地址和大小*/ check=backcheck(head,back); /*检查*/if(check==1){if(tolower(way)=='f')/*首先适应算法*/acceptment1(head,back); /*首先适应*/elseacceptment2(head,back);/*最佳适应*/print(head);}}while(!strcmp(choose,"as")||!strcmp(choose,"ac"));}/*分配函数*/RECT *assignment(RECT *head,int application){RECT *after,*before,*assign;assign=malloc(sizeof(RECT)); /*分配申请空间*/assign->size=application;assign->next=NULL;if(application>head->size||application<=0)assign->address=-1; /*申请无效*/else{before=head;after=head->next;while(after->size<application)/*查找适应的结点*/{before=before->next;after=after->next;}if(after->size==application) /*结点大小等于申请大小则完全分配*/{if(after->size==head->size)maxblocknum--;before->next=after->next;assign->address=after->address;free(after);}else{if(after->size==head->size) maxblocknum--;after->size=after->size-application; /*大于申请空间则截取相应大小分配*/ assign->address=after->address+after->size;if(tolower(way)=='b')/*如果是最佳适应,将截取后剩余结点重新回收到合适位置*/ before->next=after->next;back=after;acceptment2(head,back);}if(maxblocknum==0) /*修改最大数和头结点值*/{before=head;head->size=0;maxblocknum=1;while(before!=NULL)if(before->size>head->size){head->size=before->size;maxblocknum=1;}elseif(before->size==head->size)maxblocknum++;before=before->next;}}assign1=assign;return assign1; /*返回分配给用户的地址*/}void acceptment1(RECT *head,RECT *back1)/*首先适应*/{RECT *before,*after;int insert;before=head;after=head->next;insert=0;while(!insert) /*将回收区插入空闲区表*/{if((after==NULL)||((back1->address<=after->address)&&(back1->address>=before->address))){before->next=back1;back1->next=after;insert=1;}else{before=before->next;after=after->next;}}if(back1->address==before->address+before->size)/*与上一块合并*/ {before->size=before->size+back1->size;before->next=back1->next;free(back1);back1=before;}if(after!=NULL&&(after->address==back1->address+back1->size)) { /*与下一块合并*/back1->size=back1->size+after->size;back1->next=after->next;free(after);}if(head->size<back1->size) /*修改最大块值和最大块个数*/{head->size=back1->size;maxblocknum=1;}elseif(head->size==back1->size)maxblocknum++;}/*最佳适应,back1为回收结点的地址*/void acceptment2(RECT *head,RECT *back1){RECT *before,*after;int insert ;insert=0;before=head;after=head->next;if(head->next==NULL) /*如果可利用区表为空*/{head->size=back1->size;head->next=back1;maxblocknum++;back1->next=NULL;}else{while(after!=NULL) /*与上一块合并*/if(back1->address==after->size+after->address){before->next=after->next;back->size=after->size+back1->size;free(after);after=NULL;}else{after=after->next;before=before->next;}before=head;after=head->next;while(after!=NULL)if(after->address==back1->size+back1->address) /*与下一块合并*/ {back1->size=back1->size+after->size;before->next=after->next;free(after);after=NULL;}else{before=before->next;after=after->next;}before=head;/*将回收结点插入到合适的位置*/after=head->next;do{if(after==NULL||(after->size>back1->size)){before->next=back1;back1->next=after;insert=1;else{before=before->next;after=after->next;}}while(!insert);if(head->size<back1->size) /*修改最大块值和最大块数*/{head->size=back1->size;maxblocknum++;}elseif(head->size==back1->size)maxblocknum++;}}void print(RECT *head) /*输出链表*/{RECT *before,*after;int index,k;before=head->next;index=1;if(head->next==NULL)printf("NO part for assignment!!\n");else{printf("*****index*******address********end*********size*****\n");while(before!=NULL){printf("----------------------------------------------------\n");printf(" %-13d%-13d%-13d%-13d\n",index,before->address,before->address+b efore->size-1,before->size);printf("----------------------------------------------------\n");index++;before=before->next;}}}/*检查回收块的合法性,back1为要回收的结点地址*/int backcheck(RECT *head,RECT *back1){RECT *before,*after;int check=1;if(back1->address<0||back1->size<0)check=0;/*地址和大小不能为负*/before=head->next;while((before!=NULL)&&check)/*地址不能和空闲区表中结点出现重叠*/ if(((back1->address<before->address)&&(back1->address+back1->size>before->address))||((back1->address>=before->address)(back1->address<before->address+before->size)))check=0;elsebefore=before->next;if(check==0)printf("Error input!!\n");return check; /*返回检查结果*/}第3章课程设计总结做存储管理分区分配算法课程设计有感不知不觉期末的脚步已悄悄逼近,我们结束了一科又一科的紧张复习,迎接着一次又一次别开生面的考试,这段时间给我最大的体会就是好累,好枯燥!课程设计对于我们大一新生来说可谓是难上加难,首先它是一门新的学科,以前从来没有接触过,对其认识比较肤浅,没有一个明确的框架,想要将这个任务很好的完成,就必须要有一个持之以恒的决心,一个不甘劳苦的决心。