内存分配与回收
linux的内存管理器任务和职责

linux的内存管理器任务和职责
Linux的内存管理器的任务和职责如下:
1. 分配和回收内存:Linux的内存管理器负责分配和回收系统的物理内存。
它根据需要将内存分配给进程和系统服务,当它们不再需要时,将它们释放回内存池。
2. 内存映射和交换:内存管理器对于内存映射和交换也负有主要职责。
内存映射是将文件映射到虚拟内存空间或将虚拟内存空间映射到设备文件的过程。
交换则是将不再活跃的进程的内存数据移到磁盘中,以释放物理内存。
3. 内存页缓存:内存页缓存可以提高文件系统的性能,内存管理器可以管理这些缓存,确保缓存的内容始终与磁盘上的文件同步。
4. 虚拟内存管理:内存管理器负责将虚拟内存空间映射到物理内存,同时还需要处理由于内存不足而产生的页面置换和页面调度。
5. 保护和安全性:内存管理器通过设置页面权限位和进行用户空间和内核空间之间的分离来提供保护和安全性。
虚拟机内存管理:分配与回收策略

虚拟机内存管理:分配与回收策略虚拟机内存管理是操作系统中的一个重要领域。
在计算机系统中,内存是一项有限的资源,而操作系统需要合理地分配和回收内存,以满足不同应用程序的需求。
本文将探讨虚拟机内存管理中的分配与回收策略。
一、内存分配策略在虚拟机中,内存的分配通常是在进程创建时进行的。
操作系统需要将一块连续的内存空间分配给该进程,并且记录该进程的内存边界。
常见的内存分配策略有以下几种。
首次适应算法(First Fit):该算法将内存空间划分为若干块,从头开始查找第一个足够大的空闲块来进行分配。
这种算法的优点是简单高效,但容易造成内存碎片。
最佳适应算法(Best Fit):该算法从所有空闲块中找到最小的适配块进行分配。
相比首次适应算法,最佳适应算法能更好地利用内存空间,减少碎片的产生,但分配效率较低。
循环首次适应算法(Next Fit):该算法与首次适应算法类似,但是从上一次分配位置开始循环查找。
这样可以减少搜索的时间,提高分配效率。
内存分配时还需要考虑其他因素,如内存的对齐方式和分页机制。
对齐方式可以提高访问速度,而分页机制可以更好地管理内存空间。
二、内存回收策略内存回收是指在程序执行过程中,当某些进程不再使用内存时,将其释放给操作系统重新分配。
常见的内存回收策略有以下几种。
引用计数法:该方法记录每个对象被引用的次数,当引用次数为0时,即可将该对象回收。
但是引用计数法无法解决循环引用的问题,容易造成内存泄漏。
标记-清除算法:该算法通过标记未被引用的内存块,然后清除这些块来回收内存。
这个算法可以解决循环引用的问题,但会产生内存碎片。
分代回收算法:该算法将内存分为多个代,根据对象的存活时间将其分配到不同的代中。
年轻代的回收频率较高,老年代的回收频率较低。
这样可以更有效地进行内存回收。
写时复制(Copy-on-write):该技术将内存分为读写两个副本,在写操作时才会进行复制。
这样可以减少内存拷贝的开销,提高性能。
虚拟机内存管理:分配与回收策略(五)

虚拟机内存管理:分配与回收策略虚拟机内存管理在计算机系统中扮演着至关重要的角色。
它负责为虚拟机提供足够的内存空间,以支持应用程序的运行,并有效地分配和回收内存资源。
本文将探讨虚拟机内存管理的分配与回收策略,以及它们的挑战和优化方案。
一、内存分配策略内存分配是虚拟机内存管理的首要任务。
它决定了如何将有限的物理内存资源分配给虚拟机中的应用程序。
常见的内存分配策略包括固定分配、可变分配和动态分配。
固定分配是将一定大小的内存块预先分配给虚拟机,并在虚拟机启动时使用。
这种策略简单可靠,但可能造成内存浪费。
可变分配是按需动态分配内存,当应用程序需要时,虚拟机会为其分配额外的内存。
这种策略可以更有效地利用内存资源,但也可能导致内存碎片问题。
动态分配则是将内存分为大小不等的页框,并根据应用程序的需求灵活地分配内存页。
动态分配具有较高的内存利用率和较低的内存碎片,但其实现复杂度较高。
二、内存回收策略内存回收策略是虚拟机内存管理的另一个重要方面。
它负责在应用程序释放内存时,将已使用的内存回收并重新分配给其他应用程序。
常见的内存回收策略包括垃圾回收和页面置换。
垃圾回收是一种自动内存回收策略,通过识别和回收不再使用的内存对象来释放内存空间。
它基于"标记-清除"或"复制-压缩"等算法,可以有效地回收内存。
然而,垃圾回收可能引起应用程序的停顿,并降低系统的性能。
页面置换主要用于虚拟内存系统中,当物理内存不足时,将内存中的某些页面置换到磁盘上。
常见的页面置换算法有最先进先出(FIFO)、最近最少使用(LRU)和最佳(OPT)等。
这些算法根据页面访问的频率和时间等因素选择被置换的页面,以最大程度地降低页面访问的成本。
三、挑战与优化方案虚拟机内存管理面临着许多挑战,包括内存碎片问题、空闲内存管理、应用程序资源竞争等。
为了优化内存管理性能,一些优化方案被提出。
首先,在内存分配方面,可以采用动态分配和内存池的技术。
简述存储管理的五大功能

简述存储管理的五大功能存储管理是计算机系统中的重要组成部分,它负责管理和优化计算机系统中的存储资源。
存储管理的五大功能包括:内存分配与回收、内存保护、地址映射、内存扩充和虚拟内存管理。
一、内存分配与回收内存分配与回收是存储管理的基本功能之一。
它负责分配和回收系统中的内存资源,以满足进程的需求。
在操作系统中,常用的内存分配算法有首次适应算法、最佳适应算法和最差适应算法等。
这些算法根据不同的策略选择合适的内存块进行分配,并及时回收不再使用的内存。
二、内存保护内存保护是存储管理的另一个重要功能。
它通过设置访问权限和使用各种技术手段,保护进程间的内存不被非法访问和破坏。
内存保护可以分为硬件保护和软件保护两种方式。
硬件保护主要依靠处理器的特权级和访问权限等机制,而软件保护则通过操作系统的权限管理和地址空间隔离等手段来实现。
三、地址映射地址映射是存储管理的核心功能之一。
它负责将逻辑地址转换为物理地址,实现进程对内存的访问。
地址映射通过页表、段表等数据结构来完成,其中页表是最常用的一种。
地址映射的过程包括将逻辑地址分解为页号和页内偏移量,然后根据页号在页表中查找对应的物理页框号,并将页内偏移量与物理页框号相加得到物理地址。
四、内存扩充内存扩充是存储管理的一项重要功能。
它通过将部分进程的页表存放在外存中,从而实现对内存容量的扩充。
当进程需要访问外存中的页表时,操作系统会将页表加载到内存中,并进行适当的地址映射。
内存扩充可以有效提高系统的内存利用率和运行效率,但也会增加访问时间和开销。
五、虚拟内存管理虚拟内存管理是存储管理的高级功能之一。
它通过将进程的逻辑地址空间映射到物理内存和外存的组合空间中,实现对大容量、稀缺的物理内存的有效管理。
虚拟内存管理包括页面置换算法、页面替换策略和页面调度等技术。
通过合理地管理虚拟内存,可以提高系统的吞吐量和响应速度,同时还能提供更大的地址空间给应用程序使用。
存储管理的五大功能包括内存分配与回收、内存保护、地址映射、内存扩充和虚拟内存管理。
虚拟机内存管理:分配与回收策略(一)

虚拟机内存管理:分配与回收策略作为计算机科学中的重要概念之一,虚拟机内存管理在现代计算中发挥着关键作用。
它不仅关乎到计算机系统的性能与效率,还影响着用户体验和软件开发的质量。
本文将介绍虚拟机内存管理的分配与回收策略,并探讨它们对系统性能的影响。
一、内存分配策略在虚拟机内存管理中,内存分配策略决定了如何将有限的内存资源分配给不同的程序和应用。
下面将介绍几种常见的内存分配策略。
1. 固定分区分配固定分区分配是一种较为简单直接的内存分配策略。
它将内存划分为固定大小的分区,每个分区都被分配给一个程序或应用。
这种策略的优点是实现简单、分配效率较高。
然而,由于每个程序都需要有固定大小的分区,导致了内存碎片问题。
当分区大小与程序需求不匹配时,将造成内存浪费或无法满足需要。
2. 动态分区分配为解决固定分区分配中的内存碎片问题,动态分区分配策略应运而生。
它允许程序在运行时根据需要动态分配内存空间。
常见的动态分区分配算法有“首次适应算法”、“循环首次适应算法”等。
这些算法通过优化内存分配过程,减少内存碎片,提高内存利用率。
3. 页表分配为实现虚拟内存的概念,页表分配策略被广泛应用于现代计算机系统中。
它将物理内存划分为固定大小的物理页框,并将虚拟内存划分为固定大小的虚拟页。
通过页表,将虚拟页映射到物理页框上。
这种策略实现了虚拟内存与物理内存的分离,使得程序能够运行在比实际物理内存更大的地址空间上。
二、内存回收策略除了分配内存,虚拟机内存管理还需要处理内存的回收。
及时回收不再使用的内存,释放给其他应用或程序使用,对于系统的正常运行至关重要。
下面将介绍几种常见的内存回收策略。
1. 垃圾回收垃圾回收是一种主动管理内存的策略。
它通过自动识别和回收不再使用的内存对象,释放它们所占用的内存空间。
垃圾回收策略通过算法实现,如引用计数、标记-清除、复制算法等。
这些算法帮助虚拟机定期检测并回收无用的内存对象,减少内存泄漏和资源浪费问题。
linux主存空间分配与回收

在Linux操作系统中,主存空间(内存)的分配和回收是由内核管理的。
当应用程序或系统需要更多的内存时,它们会向内核请求,内核会根据可用内存的情况来分配内存。
同样,当应用程序或系统不再需要某块内存时,它们会将其释放给内核,内核会将其回收以供将来使用。
1. 内存分配:
在Linux中,当一个进程需要更多的内存时,它会调用`malloc()`或`alloc()`等函数。
这些函数会向内核发送请求,要求分配一块指定的内存大小。
内核会查看当前可用内存的情况,并根据需要分配一块内存。
内核分配内存的过程包括以下几个步骤:
* 找到可用的物理内存页框。
* 将页框标记为已分配状态。
* 更新内存管理数据结构。
* 将页框地址返回给进程。
2. 内存回收:
当一个进程不再需要某块内存时,它会调用`free()`或`release()`等函数来释放该内存。
这些函数会将该内存标记为未分配状态,并通知内核回收该内存。
内核回收内存的过程包括以下几个步骤:
* 标记该页框为未分配状态。
* 更新内存管理数据结构。
* 如果该页框中有数据,则将其写回到磁盘或其他存储设备中。
* 将该页框标记为可用状态,以供将来使用。
需要注意的是,Linux采用了先进的内存管理技术,如分页和段页式管理,以及虚拟内存技术等,使得内存的分配和回收更加高效和灵活。
同时,Linux还具有强大的内存监控和管理工具,如`top`、`htop`、`free`等,可以帮助管理员监控和管理系统的内存使用情况。
存储管理动态分区分配及回收算法

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

虚拟机内存管理:分配与回收策略概述随着计算机技术的飞速发展,虚拟化技术在数据中心中的应用日益广泛。
虚拟机是一种将物理服务器划分为多个独立虚拟环境的技术,它通过虚拟机监控程序(VMM)来管理物理资源。
其中,内存管理是虚拟化技术中的重要组成部分。
本文将着重讨论虚拟机内存管理中的分配与回收策略。
虚拟机内存分配策略虚拟机内存分配策略目的在于高效地利用有限的物理内存资源,并满足虚拟机对内存的需求。
常见的内存分配策略包括固定分配、按需分配和动态分配。
固定分配是指将一定数量的物理内存资源预先分配给虚拟机。
这种分配策略适用于长时间运行的虚拟机,能够在一定程度上保障虚拟机的性能稳定性。
然而,固定分配策略存在一定浪费,因为虚拟机可能在某些时候没有充分利用分配的内存。
按需分配是动态分配内存的一种策略,只有虚拟机在运行过程中需要时才分配内存。
这种分配策略可以灵活应对虚拟机的内存需求,避免了过度分配的浪费。
然而,按需分配也存在一定的问题,当多个虚拟机同时需要内存时,可能会导致内存不足的情况。
动态分配是根据虚拟机的内存使用情况动态调整内存资源。
虚拟机可以根据负载情况自动请求更多内存或释放多余的内存。
这种分配策略可以更好地适应虚拟机工作负载的变化,提高内存资源的利用率。
但是,动态分配策略也需要较高的管理开销和额外的资源投入。
虚拟机内存回收策略虚拟机内存回收是指通过合理的回收方式释放被虚拟机占用但实际上闲置的内存资源。
常见的内存回收策略包括页面换出、压缩和抢占。
页面换出是将虚拟机内存中的某些页面写回到磁盘或其他非易失性存储介质上,以释放内存空间。
当虚拟机需要访问换出的页面时,再将其重新读入内存。
页面换出策略可以有效释放内存,但在换出和读入过程中会引入一定的延迟。
压缩是一种通过重新组织虚拟机内存内容来释放内存的策略。
压缩方法可以将闲置部分内存进行合并,提高内存的利用率。
这种策略通常适用于虚拟机内存中存在较多不活跃对象的情况下。
抢占是通过暂停或迁移某个虚拟机,将其占用的内存资源分配给其他需要的虚拟机。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
课程设计题目:主存空间的分配与回收学生姓名:学院:信息工程学院系别:计算机系专业:计算机科学与技术班级:计算机指导教师:副教授副教授2011年月日内蒙古工业大学课程设计任务书(三)学院(系):信息学院计算机系课程名称:操作系统课程设计指导教师(签名):专业班级:计算机09-2 学生姓名:学号:目录第一章背景研究 (1)1.1课题简介 (1)1.2 设计要求 (1)1.3概念原理 (1)1.4 环境说明和使用工具 (2)第二章详细设计 (2)2.1功能介绍 (2)2.1.1分配函数发fenpei()的执行过程(最佳适应算法) (2)2.1.2回收进程空间所占的函数free()的执行过程 (2)2.2函数的规格说明 (3)2.2.1打印分配表空闲表函数 print() (3)2.2.2为进程分配空间函数 fenpei(char *c, struct node *p,struct node*f) (3)2.2.3回收进程所占空间函数struct node * free(char *c, struct node*p,struct node *f) (3)2.3 主要数据结构 (3)2.4 流程图 (5)第三章核心算法的实现 (6)3.1 分配函数 (6)3.2回收函数 (11)第四章测试 (15)4.1 预测试 (15)4.2 实际运行结果(截图) (16)第五章总结 (18)参考文献 (25)第一章背景研究1.1课题简介操作系统是当代计算机软件系统的核心,是计算机系统的基础和支撑,它管理和控制着计算机系统中的所有软、硬件资源,可以说操作系统是计算机系统的灵魂。
操作系统课程是计算机专业学生必须学习和掌握的基础课程, 是计算机应用人员深入了解和使用计算机的必备知识, 是进行系统软件开发的理论基础,也是计算机科学与技术专业的一门理论性和实践性并重的核心主干课程。
本课程的目的是使学生掌握现代计算机操作系统的基本原理、基本设计方法及实现技术,具有分析现行操作系统和设计、开发实际操作系统的基本能力。
通过本次课程设计熟悉主存空间的分配与回收,所谓分配,就是解决多道作业或多进程如何共享主存空间的问题。
所谓回收,就是当作业运行完成时,将作业或进程所占用的主存空间归还给系统。
采用可变式分区管理,使用最佳适应算法实现主存的分配与回收。
深入研究此算法有助于我们全面的理解内存的分配原理,培养我们逻辑思维能力。
1.2 设计要求设计多个作业或进程动态请求内存资源的模拟系统,使用最佳适应算法实现内存的分配与回收,实现可变式分区管理;设计相应的内存分配算法,定义相关数据结构,以及输出显示每次请求分配内存的结果和内存的已分配和未分配的状况。
1.3概念原理可变式分区管理的原理:区域的大小及起始地址是可变的,根据程序装入时的大小动态地分配一个区域。
保证每个区域之中刚好放一个程序。
这样可以充分地利用存储空间,提高内存的使用效率。
如果一个程序运行完毕,就要释放出它所占有的分区,使之变成空闲区。
这样就会出现空闲区与占用区相互交错的情况。
这样就需要P 表,F表来分别表示内存的占用区状态与空闲区的状态。
最佳适应性算法,所谓“最佳”是指每次为作业分配内存时,总能把满足要求、有是最小的空闲分区分配给作业,避免“大材小用”。
该算法要求从小到大的次序组成空闲区可用表或自由链。
当用户作业或进程申请一个空闲区时,先检查空闲区可用表或自由链的第一个空闲区大小是否大于或等于所要求的内存长度,若可用表或自由链的第一个项长度小于所要求的,则分配失败,否则从空闲区可用表或自由链中分配相应的存储空间给用户,然后修改和调整可用表或自由链。
1.4 环境说明和使用工具工具:C++语言在windows Xp环境下使用vc++6.0 , visio进行开发。
第二章详细设计2.1功能介绍2.1.1分配函数发fenpei()的执行过程(最佳适应算法)A:查找空闲表F,在其中找到一个满足要求的空闲块。
如果没有找到则提示用户。
B:申请一个新的P结点,进行填写相关的数据,将其挂接在P表的尾部。
C:修改原空闲区结点,并将其从F表中提出来。
D:将修改后的结点插入到合适的位置,保证F表中的结点是按地址空间的大小由小到大的进行排序。
E:返回新生成的P结点的首地址。
2.1.2回收进程空间所占的函数free()的执行过程A:查找P表,找到需要回收的程序的占用区的结点。
将它提出P表。
B:生成一个空的结点,填写。
表示新生成了一个空闲区。
C:观察F表,看其中是否有旧的空闲区和新的空闲区相邻。
如果有,就将他与新的空闲区结点合并成一个大的空闲区。
D:将新生成的空闲区结点插入到F表中合适的位子。
2.2函数的规格说明2.2.1打印分配表空闲表函数 print()A 形参个数和类型:无形参B 函数的返回类型:int型C 函数的前提条件是什么:D 函数的功能:打印分配表空闲表函数2.2.2为进程分配空间函数 fenpei(char *c, struct node *p,struct node *f)A 形参个数和类型:字符串类型的C,结构体指针指向P,FB 函数的返回类型:int型C 函数的前提条件是什么:之前要建立结构体并声明需要的全局变量D 函数的功能:按最佳适应算法分配内存空间2.2.3回收进程所占空间函数struct node * free(char *c, struct node *p,struct node *f)A 形参个数和类型:结构体定义的结点指针B 函数的返回类型:struct node *型C 函数的前提条件是什么:按之前写的fenpei算法已经分配了内存空间D 函数的功能:回收内存2.3 主要数据结构A 用一个数组unsigned char memory[1024] 模拟1K内存B 用单链表建立结点模拟分配表与空闲表Struct node{Char name[10];Int start ,length;Struct node *next;};Struct node *p,*f;C 确定头结点P=(struct node *)malloc(sizeof(struct node));p->next=NULL;f=(struct node *)malloc(sizeof(struct node));f->next=(struct node *)malloc(sizeof(struct node));f->next->start=0;f->next->length=1024;f->next->next=NULL;2.4 流程图图2-1 使用Microsoft Visio制图main()流程图第三章核心算法的实现3.1 分配函数void apply(block *task,string job1[],int job2[][2],string wait1[],int wait2[]) /*作业申请*/{string name;int datasize,i,flag=0;block *p;cout << "请输入作业名称和大小:"<< endl;cin >> name >> datasize; /*作业名称和大小*/p=task;if(datasize>100){cout<<"作业大小超过分区最大空间100KB"<<endl; /**/}else{for(;p->next!=NULL;p=p->next){if(p->next->size>=datasize && p->next->state==0){flag=1;cout <<"作业"<<name<<"使用了地址"<<p->nextaddress<<"K中的"<<datasize<<"KB。
"<<endl;p->next->size=p->next->size-datasize; /*使用分区空间*/if(p->next->size==0){p->next->state=1; /*分区空间完全被占用*/}addjob(job1,job2,name,p->nextaddress,datasize);break;}}if(flag==0) /*分区无足够空闲资源,作业进入等待状态*/{cout <<"分区无足够空闲资源,作业进入等待状态"<<endl;for(i=0;i<10;i++){if(wait2[i]==0) /*等待作业列表登记*/{wait1[i]=name;wait2[i]=datasize;break;}}}}}void adjust(block *task,string job1[],int job2[][2],string wait1[],int wait2[]) /*等待作业执行函数*/{block *p;int i;for(i=0;i<10;i++){if(wait2[i]!=0){for(p=task;p->next!=NULL;p=p->next){if(p->next->size>=wait2[i]){p->next->size-=wait2[i]; /*等待作业使用空闲分区*/if(p->next->size==0){p->next->state=1;}addjob(job1,job2,wait1[i],p->nextaddress,wait2[i]); /*作业由等待作业列表转入执行作业列表*/cout <<"等待作业"<<wait1[i]<<"使用了地址"<<p->nextaddress<<"K中的"<<wait2[i]<<"KB。
"<<endl;wait1[i]='\0';wait2[i]=0;break;}}}}}图3-1 分配函数3.2回收函数struct node *free(char *c, struct node *p,struct node *f) {struct node *p1, *p2, *f1, *f2, *f3;p1 = p->next ;p2 = p; //p2是p1是跟随指针while(p1!= NULL)//按外界提供的程序名在P表中查找其结点,若没找到,则返回NULL {if (!(strcmp(p1->name,c))) break;p1 = p1->next;p2 = p2->next;}//end whileif (p1==NULL){printf("没找到该进程!!!\n");return (NULL);}//end ifp2->next = p1->next ; //将找到的结点取出f1 = (struct node *)malloc(sizeof(struct node));//据此生成一个新的空闲结点f1->start = p1->start ;f1->length = p1->length;//在F表中依次观察各个结点,看是否能与此新的空闲结点合并f2 = f->next;f3 = f;while (f2!= NULL){if (f1->start + f1 ->length == f2->start){f1->length += f2->length;f3->next = f2->next;f2 = f2->next;}//end ifelse if (f2->start + f2->length == f1->start ){f1->start = f2 ->start;f1 ->length += f2->length;f3 ->next = f2 ->next ;f2 = f2->next;}//end else ifelse{f2=f2->next ; f3 = f3->next;}//end else}//end whilef2 = f; //再寻找一个合适的地方插入此空闲结点while ((f2->next!=NULL)&&(f2->next->length<=f1->length)) f2 = f2->next;f1->next = f2->next;f2->next = f1;return (f1); //返回值}//end free图3-2 回收函数第四章测试4.1 预测试这是预先假设运行结果的。