存储管理-动态不等长存储资源分配算法
动态分区存储管理方式的主存分配回收总结

动态分区存储管理方式的主存分配回收总结动态分区存储管理是一种常见的主存分配回收技术,它通过动态创建并分配大小不等的存储块来管理主存空间,以满足不同进程的需求。
这种管理方式在操作系统中起着至关重要的作用,因此本文将对动态分区存储管理的主存分配回收进行总结,从原理、特点、优缺点及其在实际应用中的情况进行阐述。
一、原理动态分区存储管理是基于分区的主存管理机制,它将主存空间划分为多个不等大小的分区,每个分区可以被分配给一个进程使用。
当系统收到一个新进程的请求时,它会根据需要的主存大小为进程分配一个合适大小的分区。
当进程执行完毕,系统会回收该进程所占用的分区,使得该空间可以再次被分配给其他进程使用。
在动态分区存储管理中,主要有两种分配方式:首次适应算法和最佳适应算法。
首次适应算法是从第一个满足大小要求的分区开始进行分配;而最佳适应算法是从所有满足大小要求的分区中选择最小的分区进行分配。
这两种分配方式都有自己的优点和局限性,但它们都是基于动态分区存储管理的基本原理。
二、特点1.灵活性动态分区存储管理可以根据进程的需求动态地分配和回收主存空间,提高了主存的利用率和效率。
进程可以根据需要申请和释放主存空间,而无需预先分配固定大小的空间。
2.节省空间动态分区存储管理可以尽可能地利用主存中的碎片空间,减少了外部碎片的浪费。
这种管理方式能够充分利用主存空间,提高了主存的利用率。
3.多样性动态分区存储管理可以适应不同大小的进程需求,能够根据进程的大小灵活地进行分区分配,满足了不同进程的需求。
三、优缺点1.优点(1)提高了主存的利用率和效率。
(2)灵活地分配和回收主存空间,满足不同进程的需求。
(3)节省了主存空间,减少了碎片的浪费。
2.缺点(1)会产生外部碎片,影响了分区空间的利用率。
(2)分配和回收过程中可能产生较大的开销,影响了系统的性能。
四、在实际应用中的情况动态分区存储管理在操作系统中得到了广泛的应用,特别是在多道程序设计和实时系统中。
动态异长分区的存储分配与回收算法之欧阳术创编

实验5 动态异长分区的存储分配与回收算法5.1 实验目的理解存储管理的功能,掌握动态异长分区的存储分配与回收算法。
存储器是计算机系统中的关键资源,存储管理一直是操作系统的最主要功能之一。
存储管理既包括内存资源管理,也包括用于实现分级存储体系的外存资源的管理。
通常,内存与外存可采用相同或相似的管理技术,如内存采用段式存储管理,则外存也采用段式存储管理。
存储管理需要完成如下功能:存储分配、存储共享、存储保护、存储扩充、地址映射。
当一个作业进入内存时,由操作系统将其变为进程,并为进程分配存储空间。
进程运行结束时, 由操作系统将其所占用的存储空间收回。
不同的操作系统对内存空间的划分与分配方法是不同的,通常分为两类:静态等长分区的分配和动态异长分区的分配。
静态等长分区常用于页式存储管理方式与段页式存储管理方式,存储空间被静态地划分为若干个长度相等的区域,每个区域被称作一个页面。
动态异长分区常用于界地址存储管理方式与段式存储管理方式,存储空间被动态地划分为若干个长度不等的区域。
5.2 实验要求本实验要求模拟动态异长分区的分配算法、回收算法和碎片整理算法。
5.3 实验步骤5.3.1 数据结构分析为了实现存储资源的分配和回收,操作系统需要记录内存资源使用情况,即哪些区域尚未分配,哪些区域已经分配以及分配给哪些进程等。
为此一般需要两个表,一个为分配表, 另外一个为空闲区域表。
前者记录已经分配的区域, 后者记录着所有当前未被进程占用的空闲区域, 如图5-1所示。
显然, 没有记录于表中的区域即为已被进程所占用的非空闲区域,在实际的操作系统中,这些区域登记在进程的PCB 中。
而PCB 中除了关于内存资源的信息外,还有其它大量信息。
由于本实验是对存储管理算法的模拟,所以用一个线程来代表一个进程,用线程驻留区域表来描述线程占用的内存空间,如图5-2所示。
图5-1 空闲区域表同时,需要一张表来记录各个线程对内存的请求信息,如图5-3所示。
操作系统-存储管理动态分区分配及回收算法(附源码)

存储管理动态分区分配及回收算法课程名称:计算机操作系统班级:信1501-2实验者姓名:李琛实验日期:2018年5月20日评分:教师签名:一、实验目的分区管理是应用较广泛的一种存储管理技术。
本实验要求用一种结构化高级语言构造分区描述器,编制动态分区分配算法和回收算法模拟程序,并讨论不同分配算法的特点.二、实验要求1、编写:First Fit Algorithm2、编写:Best Fit Algorithm3、编写:空闲区回收算法三、实验过程(一)主程序1、定义分区描述器node,包括3 个元素:(1)adr-—分区首地址(2)size——分区大小(3)next——指向下一个分区的指针2、定义3 个指向node 结构的指针变量:(1)head1——空闲区队列首指针(2)back1-—指向释放区node 结构的指针(3)assign——指向申请的内存分区node 结构的指针3、定义1 个整形变量:free——用户申请存储区的大小(由用户键入)(二)过程1、定义check 过程,用于检查指定的释放块(由用户键入)的合法性2、定义assignment1 过程,实现First Fit Algorithm3、定义assignment2 过程,实现Best Fit Algorithm4、定义acceptment1 过程,实现First Fit Algorithm 的回收算法5、定义acceptment2 过程,实现Best Fit Algorithm 的回收算法6、定义print 过程,打印空闲区队列(三)执行程序首先申请一整块空闲区,其首址为0,大小为32767;然后,提示用户使用哪种分配算法,再提示是分配还是回收;分配时要求输入申请区的大小,回收时要求输入释放区的首址和大小。
实验代码Main。
cpp#include〈stdio。
h〉#include<stdlib.h>#include〈string。
存储管理

存储管理主要是指对内存空间的管理(外存管理见文件 系统)。内存空间一般分为两部分:系统区和用户区。 系统区存放系统程序和系统数据等;用户区存放用户 的程序和数据等。存储管理主要是对内存中用户区进 行管理。
存储管理功能 内存资源管理 存储管理方式
1 存储管理功能
存储空间的分配和回收
静态地址映射:程序装入内存时进行地址转换; 动态地址映射:程序执行过程中进行地址转换, 需要硬件的支持。
2 内存资源管理
2.1 内存分区
分区时刻
静态分区:系统初始化时分; 动态分区:申请时分。 等长分区:2i 异长分区:依程序、程序单位、对象大小。 静态+等长(页式、段页式) 动态+异长(段式、可变分区方式)
X(段号1) e: 调用y段f
80k-1 D(段号3)
0 a: … 20k-1 段内地址 (二维地址)
逻辑地址=
段号
3. 对应关系
main
... 100k: 40k
...
200k:
x
60k
... 300k: 320k:
y
20k 80k ... 内存空间
d
进程空间
4. 所需表目
(1) 段表:每进程一个
b: l b 段号 ... 段首址 段长 … b’ … … l’ …
物理地址
b’+d
s
... ... b l ... PCB s d 逻辑地址 若查不到
+
段号 .. . s .. .
段长 段首址 … ... l’ b’ … ...
cp
b: l cp b + 段号 ... 段首址 段长 … b’ … ... l’ ...
动态资源分配算法

动态资源分配算法一、概述动态资源分配算法是指在计算机系统中,根据当前的资源情况和任务需求,动态地分配资源,以达到最优的资源利用效果。
该算法主要应用于操作系统、数据库管理系统、网络服务器等领域。
二、静态资源分配算法与动态资源分配算法的区别静态资源分配算法是指在任务启动之前就已经确定了每个任务所需要的资源,并且将这些资源分配给相应的任务。
而动态资源分配算法则是在任务运行时根据实际需要来进行资源分配。
三、常见的动态资源分配算法1. 抢占式调度抢占式调度是指当一个进程正在执行时,另一个优先级更高的进程需要运行时,操作系统可以暂停当前进程并让更高优先级的进程运行。
这种方式可以保证高优先级进程及时得到执行,但也可能会导致低优先级进程长时间得不到执行。
2. 时间片轮转调度时间片轮转调度是指将所有就绪队列中的进程按照一定顺序排列,并为每个进程规定一个时间片。
当一个进程用完了它的时间片后,它就会被放到队列末尾等待下一次调度。
这种方式可以避免进程长时间得不到执行,但也可能会导致进程频繁地切换,影响系统性能。
3. 优先级调度优先级调度是指根据进程的优先级来进行调度。
高优先级的进程会先被执行,而低优先级的进程则需要等待高优先级进程执行完毕后才能得到执行。
这种方式可以保证高优先级进程及时得到执行,但也可能会导致低优先级进程长时间得不到执行。
4. 最短作业优先调度最短作业优先调度是指在所有就绪队列中选择需要运行的任务中,选择所需时间最短的任务进行执行。
这种方式可以保证任务能够尽快地完成,但也可能会导致长时间运行的任务得不到充分利用。
四、动态资源分配算法的应用场景1. 操作系统操作系统需要根据当前系统资源情况和用户需求来动态分配CPU、内存等资源,以达到最好的性能和用户体验。
2. 数据库管理系统数据库管理系统需要根据当前数据库负载情况和用户请求来动态分配CPU、内存、磁盘等资源,以提高数据库访问效率和可靠性。
3. 网络服务器网络服务器需要根据当前网络流量和用户请求来动态分配带宽、CPU、内存等资源,以提高服务器响应速度和稳定性。
操作系统(谌卫军 王浩娟)课后习题课后选择填空

第一章选择题1.操作系统是(资源的分配者、硬件与应用程序之间的接口、系统服务的提供者)2.操作系统提供给应用程序的接口是(系统调用)3.在设计批处理多道系统时,首先要考虑的是(系统销量和吞吐量)4.操作系统中采用多道程序设计技术来提高CPU和外部设备的(利用率)5.CPU状态分为目态和管态两种,从目态转换到管态的唯一途径是(中断)6.在单处理机系统中,可并行的是(处理机与设备,处理机与DMA,设备与设备)7.分时操作系统允许在一台主机上连接多台终端,多个用户可以通过各自的终端同时交互地使用计算机8.下列选项中,能引起外部中断的事件是(键盘输入)9.处理器执行的指令被分为两类,其中一类称为特权指令,它只允许(操作系统)使用10.计算机系统中判别是否有中断事件发生应是在(执行完一条指令后)填空题1.列举两个你所知道的操作系统名称:(实时操作系统和嵌入式操作系统)2.CPU的工作状态可以分为两种:(管态和目态)3.CPU通过哪一个寄存器来设定它的工作状态?(程序状态字)4.用户进程从目态转换为管态的唯一途径是(中断)5.中断可以分为两类,即同步中断和异步中断。
如果一个用户程序中,出现了算术溢出或除零的错误,那么此时产生的中断属于(同步中断)6.用户程序通过(访问或陷阱指令)来请求操作系统为其提供某种功能的服务,如I/O操作。
7.从资源管理的角度来看,操作系统的主要功能可以分为4个模块: 进程管理、存储管理、(I/O管理、文件管理)8.实时操作系统的两个基本特征是: (实时性和可靠性)第二章选择题1.下列对进程的描述中,错误的是(进程是指令的集合)2.当一个进程被唤醒时,这意味着(该进程变为就绪状态)3.在进程管理中,当(时间片用完时),进程从阻塞状态变为就绪状态4.下列的进程状态变化中,(就绪->阻塞)变化是不可能发送的5.通常,用户进程被建立后,(随着时间片轮转而撤销与建立)6.进程控制块中包含多种信息,以下信息中不属于进程控制块中内容是(页面大小)7.下列内容不是存放在线程控制块TCB当中的是(页表指针)8.在多进程的系统中,为了保证公共变量的完整性,各进程应互斥进入临界区,所谓临界区是指(一段程序)9.用P、V来管理临界区时,信号量的初值应定义为(1)10.若P、V操作的信号量S初值为1,当前值为-2,则表示等待信号量S的进程个数为(2个)11.设与某资源相关联的信号量初值为3,当前值为1,若M表示该资源的可用个数,N表示等待该资源的进程个数,则M、N分别为(1、0)12.用V操作唤醒一个等待进程时,被唤醒进程的状态变为(就绪)13.对于两个并发进程,设互斥信号量为mutex,若mutex=0,则(表示有一个进程进入临界区)14.下列叙述中正确的是(进程同步是指某些进程之间在逻辑上的相互制约关系)15.在进程调度算法中,(先来先服务算法)属于不可抢占的调度方式16.在下列调度算法中,不会出现"饥饿"(sttarvation)情况的是(时间片轮转算法)17.支持多道程序设计的操作系统在运行过程中,为了实现CPU的共享,会不断地选择新进程来运行。
动态分区管理方式及动态分区算法
动态分区管理方式及动态分区算法一、动态分区概述在操作系统中,内存管理是一个非常重要的部分。
在实际的应用中,程序的内存需求是会发生变化的,因此需要一种灵活的内存管理方式来满足不同程序的内存需求。
动态分区管理方式应运而生,它可以根据程序的需求,灵活地分配和回收内存空间,是一种高效的内存管理方式。
二、动态分区管理方式动态分区管理方式是指将内存划分为多个大小不等的分区,每个分区都可以被分配给进程使用,当进程终止时,分区将被回收。
动态分区管理方式通常通过动态分区算法来实现,下面将介绍几种常见的动态分区算法。
三、首次适应算法首次适应算法是最简单和最直观的动态分区分配算法。
它的基本思想是在空闲分区链表中按照位置区域顺序查找第一个能够满足进程大小需求的空闲分区,并将其分配给进程。
首次适应算法的优点是实现简单,分区利用率较高,但缺点是会产生大量的不连续碎片。
四、最佳适应算法最佳适应算法是在空闲分区链表中查找满足进程大小需求的最小空闲分区,并将其分配给进程。
最佳适应算法的优点是可以减少外部碎片,缺点是查找适合的空闲分区会花费较长的时间。
五、最坏适应算法最坏适应算法是在空闲分区链表中查找满足进程大小需求的最大空闲分区,并将其分配给进程。
最坏适应算法的优点是能够产生较小的碎片,但缺点是会导致剩余分区较多,影响分区利用率。
六、动态分区管理方式的优缺点动态分区管理方式相比于静态分区管理方式有很多优点,比如可以灵活地满足不同程序的内存需求,可以动态地合并和分割分区,提高了内存的利用率等。
但是动态分区管理方式也有一些缺点,比如会产生碎片,分配和回收内存的开销较大等。
七、结语动态分区管理方式及其算法在实际应用中有着广泛的应用,通过合理选择动态分区算法,可以提高内存的利用率,改善系统性能。
也需要注意动态分区管理方式可能产生的碎片问题,可以通过内存紧缩等手段来解决。
希望本文对读者有所帮助。
动态分区管理方式及动态分区算法八、碎片问题与解决方法在动态分区管理方式中,经常会出现碎片问题,包括内部碎片和外部碎片。
动态分区分配方式使用的数据结构和分配算法
动态分区分配方式使用的数据结构和分配算法一、引言动态分区分配是操作系统中常用的内存管理方式之一,它的主要目的是为了有效地利用计算机内存资源。
在动态分区分配中,操作系统会将可用内存空间划分为多个大小不同的连续空间,然后按照进程请求的大小来进行动态地分配和释放。
这种方式可以避免内存浪费,提高内存利用率,同时也能够保证进程访问内存时的安全性和稳定性。
二、数据结构在动态分区分配中,需要使用两个重要的数据结构:空闲块链表和已占用块链表。
1. 空闲块链表空闲块链表是指所有未被占用的内存块组成的链表。
每个节点表示一个可用块,并包含以下信息:- 块大小:表示该节点对应空闲块的大小。
- 起始地址:表示该节点对应空闲块在内存中的起始地址。
- 链接指针:指向下一个可用块节点。
2. 已占用块链表已占用块链表是指所有被进程占用的内存块组成的链表。
每个节点表示一个已占用块,并包含以下信息:- 块大小:表示该节点对应已占用块的大小。
- 进程ID:表示该节点对应已占用块所属的进程ID。
- 起始地址:表示该节点对应已占用块在内存中的起始地址。
- 链接指针:指向下一个已占用块节点。
三、分配算法动态分区分配中常用的算法有“首次适应算法”、“最佳适应算法”、“最差适应算法”等。
1. 首次适应算法首次适应算法是指从空闲块链表头开始,依次查找第一个能够满足请求大小的空闲块,并将其分配给进程。
这种方式可以快速地找到满足条件的空闲块,但可能会留下一些无法利用的小碎片。
2. 最佳适应算法最佳适应算法是指从所有可用空闲块中选择大小最合适的空闲块进行分配。
这种方式可以尽可能地利用内存资源,但需要遍历所有可用空闲块,效率较低。
3. 最差适应算法最差适应算法是指从所有可用空闲块中选择大小最大的空闲块进行分配。
这种方式可以尽可能地避免留下碎片,但也可能导致大量内存浪费。
四、动态分区分配的优缺点动态分区分配方式具有以下优点:- 可以动态地分配和释放内存,避免了内存浪费。
分区调度算法
分区调度算法一、概述分区调度算法是操作系统中负责管理内存分区的一种算法。
它有助于合理利用内存资源,提高系统的性能和效率。
在计算机中,内存被划分为不同大小的分区,这些分区用于存储进程和数据。
分区调度算法的主要目标是将进程和数据合理地分配到适当的分区中。
二、固定分区调度算法固定分区调度算法是最简单、最基础的一种分区调度算法。
它将内存分为若干个固定大小的分区,每个分区只能存储一个进程或数据。
当一个进程或数据需要被加载到内存时,系统会根据其大小选择合适的分区进行存储。
常见的固定分区调度算法有等长分区算法和不等长分区算法。
2.1 等长分区算法等长分区算法是指将可用内存按照固定块大小进行划分,每个分区的大小都是相同的。
当一个进程或数据需要被加载到内存时,系统会根据其大小选择一个空闲的分区来存储。
这种算法简单易懂,但可能导致内存碎片的产生,影响内存的利用率。
2.2 不等长分区算法不等长分区算法是指将可用内存按照不同大小的块进行划分,每个分区的大小都是不同的。
当一个进程或数据需要被加载到内存时,系统会根据其大小选择一个合适的分区来存储。
不等长分区算法可以更好地利用内存空间,减少内存碎片的产生。
常见的不等长分区调度算法有最佳适应算法和首次适应算法。
三、动态分区调度算法动态分区调度算法是在固定分区调度算法的基础上发展起来的一种更灵活的算法。
它允许内存的分区大小可以动态地改变,以适应不同大小的进程和数据的存储需求。
动态分区调度算法可以更好地管理内存资源,提高内存的利用率和系统的性能。
3.1 最佳适应算法最佳适应算法是一种不等长分区调度算法,它会根据进程或数据的大小选择一个能够最完整地存储该进程或数据的空闲分区。
这种算法可以最大程度地减少内存碎片的产生,但在搜索可用分区时需要遍历整个内存空间,可能会导致较高的时间复杂度。
3.2 最坏适应算法最坏适应算法是一种不等长分区调度算法,它会根据进程或数据的大小选择一个能够最大程度地存储该进程或数据的空闲分区。
动态分区分配算法
动态分区分配算法动态分区分配算法是在计算机内存管理中使用的一种内存分配策略。
在动态分区分配算法下,内存被划分为多个大小不一的分区,每个分区可以用来存储不同大小的进程。
当一个进程需要内存时,系统会选择一个合适的分区来满足其需求。
动态分区分配算法有多种实现方式,常用的包括最先适应算法、最佳适应算法和最坏适应算法。
最先适应算法(First Fit)是最简单和最常用的动态分区分配算法之一、该算法从内存起始位置开始查找合适的分区,一旦找到一个大小大于等于所需内存大小的空闲分区,就将该进程分配给这个分区并将分区大小减去所需内存大小。
这种算法的优点是实现简单、分区利用率高,但它可能会导致较小的分区被浪费掉,从而导致外部碎片的产生。
最佳适应算法(Best Fit)是另一种常用的动态分区分配算法。
该算法从所有空闲分区中选择一个大小最适合所需内存大小的分区来分配。
相比于最先适应算法,最佳适应算法能够更好地利用内存分区,减少外部碎片的产生。
然而,该算法的实现相对复杂,并且容易产生许多较小的空闲分区,导致分区利用率降低。
最坏适应算法(Worst Fit)是另一种动态分区分配算法。
该算法选择一个大小最大的空闲分区来分配给进程,这样可以留下更多较小的空闲分区,以备将来的进程使用。
然而,最坏适应算法可能会导致较大的分区被浪费掉,从而导致外部碎片的产生。
同样,该算法的实现也相对复杂,并且分区利用率相对较低。
动态分区分配算法的选择取决于特定的应用和场景。
最先适应算法在分配速度和分区利用率方面可能更优,但可能会产生较多的外部碎片。
最佳适应算法能够更好地利用内存分区,但实现复杂,容易产生较小的空闲分区。
最坏适应算法留下较小的空闲分区,但分区利用率较低。
因此,在选择动态分区分配算法时,需要权衡这些因素,并根据特定需求进行选择。
动态分区分配算法在现代操作系统中起着重要的作用,可以有效管理内存资源,提高系统的性能和效率。
同时,动态分区分配算法也是操作系统中的一个重要研究领域,不断有新的技术和算法被提出来优化内存管理,满足日益复杂的应用需求。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
集美大学计算机工程学院实验报告
课程名称:操作系统班级:计算1013
指导教师:李传目姓名:罗忠霖
实验项目编号:实验四学号:2010810072
实验项目名称:存储管理-动态不等长存储资
实验成绩:
源分配算法
一、目的
理解动态异长存储分区资源管理,掌握所需数据结构和管理程序,了解各种存储分配算法的优点和缺点。
二、实验内容与设计思想
•分析UNIX最先适应(FF)存储分配算法,即map数据结构、存储分配函数malloc()和存储释放函数mfree(),找出与算法有关的成分。
•修改上述与算法有关的成分,使其分别体现BF分配原则和WF分配原则。
•设计:
实现ff存储分配算法.
固定初始地址为0,大小为100+xx,
(xx为学号的后两位)。
三、实验使用环境
Red Hat Enterprise linux5
四、实验结果
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
#include <stdio.h>
#include <stdlib.h>
#define MAPSIZE 100
struct map //存储资源表结构
{
/* char *m_size;
char *m_addr;
*/
int m_addr;
int m_size;
};
struct map map[MAPSIZE]; //存储资源表
int FF_malloc(struct map *mp,int size) //存储分配函数
{
register int a,s;
register struct map *bp,*bpp;
for(bp = mp; bp->m_size; bp++)
{
if (bp->m_size >= size)
{
a = bp->m_addr;
s = bp->m_size;
bp->m_addr += size;
if ((bp->m_size -=size) == 0)
do
{
bp++;
(bp-1)->m_addr = bp->m_addr;
}
while((bp-1)->m_size = bp->m_size);
return(a);
}
}
return(-1);
}
void mfree(struct map *mp,int aa,int size) //存储释放函数{
register struct map *bp;
register int t;
register int a;
a = aa;
for(bp = mp; bp->m_addr<=a && bp->m_size != 0; bp++) ;
if(bp>mp && (bp-1)->m_addr+(bp-1)->m_size==a)
{ //与前合并
(bp-1)->m_size += size;
if (a+size == bp->m_addr)
{ //前后合并
(bp-1)->m_size += bp->m_size;
while (bp->m_size)
{
bp++;
(bp-1)->m_addr = bp->m_addr;
(bp-1)->m_size = bp->m_size;
}
}
}
else
{
if (a+size == bp->m_addr && bp->m_size)
{ //与后合并
bp->m_addr -= size;
bp->m_size += size;
}
else if (size)
do
{ //无合并
t = bp->m_addr;
bp->m_addr = a;
a = t;
t = bp->m_size;
bp->m_size = size;
bp++;
}
while (size = t);
}
}
void init()
{
struct map *bp;
int addr,size;
int i=0;
bp=map;
printf("Please input starting addr and total size:");
scanf("%d,%d",&addr,&size);
bp->m_addr=addr;
bp->m_size=size;
(++bp)->m_size=0; //表尾
}
void show_map()
{
int i=0;
system("clear"); //调用清屏命令
struct map *bp;
bp=map;
printf("\nCurrent memory map...\n");
printf("Address\t\tSize\n");
while(bp->m_size!=0)
{
printf("<%d\t\t%d>\n",bp->m_addr,bp->m_size);
bp++;
}
printf("\n");
}
main()
{
int a,s;
int c;
int i;
init();
do
{
//显示存储分配表
show_map();
printf("Please input, 1 for request,2 for release, 0 for exit:");
scanf("%d",&c);
switch(c)
{
case 1:
printf("Please input size:");
scanf("%d", &s);
if((a=FF_malloc(map,s))==-1) //call malloc
printf("request can't be satisfied\n");
else
printf("alloc memory at address:%d,size:%d\n",a,s);
break;
case 2:
printf("Please input addr and size:");
scanf("%d,%d",&a,&s);
mfree(map,a,s);
break;
case 0:
exit(0);
}
}
while(1); }
运行结果:
五、实验分析
上述算法沿用了UNIX系统所采用的数据结构,存储分配表中空闲区按m_addr 递增排列,对于任意请求,需要由表头查到表尾才能确定先适应分配区域。
六、实验小结
理解动态异长存储分区资源管理,掌握所需数据结构和管理程序,了解各种存储分配算法的优点和缺点。