OS课程设计模拟内存分配算法MFC实现

合集下载

动态分区分配方式的模拟

动态分区分配方式的模拟

动态分区分配方式的模拟动态分区分配方式是计算机中内存管理的一种重要方式。

在动态分区分配方式中,内存空间被分割为多个不同大小的分区,每个分区可以被进程占用。

当一个进程需要内存时,系统会为其分配一个适当大小的分区,进程结束后,该分区将会被释放出来供其他进程使用。

为了更好地理解动态分区分配方式的原理和实际运作,可以通过模拟的方法来观察和分析。

下面是一个简单的动态分区分配方式的模拟过程:假设我们有一块容量为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。

在模拟的过程中,我们可以看到进程在内存中的分配情况和未分配内存的变化。

操作系统的内存分配算法

操作系统的内存分配算法

操作系统的内存分配算法操作系统的内存管理是计算机系统中一个重要的组成部分。

内存分配算法决定了如何合理地利用系统的内存资源,以达到高效、安全、稳定的运行。

本文将介绍几种常见的内存分配算法,包括首次适应算法、循环首次适应算法、最佳适应算法以及快速适应算法。

首次适应算法(First Fit Algorithm)首次适应算法是一种简单而常见的内存分配算法。

它从内存空闲列表的头部开始寻找第一个适合分配的内存块。

当找到满足要求的内存块后,将该块划分为两部分,一部分用于分配给请求的程序,另一部分保留为剩余空闲块。

这种算法的优点是分配速度较快,缺点是可能会导致内存碎片的产生。

循环首次适应算法(Next Fit Algorithm)循环首次适应算法是首次适应算法的一种改进版本。

与首次适应算法不同的是,循环首次适应算法从上一次分配的位置开始搜索空闲块,直到找到一个满足要求的内存块为止。

这样可以避免每次都从头开始搜索,提高了查找的效率。

同样,这种算法也可能导致内存碎片的产生。

最佳适应算法(Best Fit Algorithm)最佳适应算法是为了解决内存碎片问题而提出的一种分配算法。

该算法会在内存空闲列表中查找最小且能满足要求的空闲块,并将该块分配给请求的程序。

这样可以尽量充分利用内存资源,减少内存碎片的产生。

但是,最佳适应算法的缺点是分配速度相对较慢,因为需要遍历整个内存空闲列表。

快速适应算法(Quick Fit Algorithm)快速适应算法是一种综合了首次适应算法和最佳适应算法的策略。

它将内存空闲列表分成了多个不同大小的链表,每个链表分别存储相应大小的空闲块。

当有程序请求内存时,快速适应算法会直接从对应大小的链表中查找可用的空闲块进行分配,以提高分配的速度。

这个算法在时间效率和空间效率上都较为出色,但是需要付出额外的存储开销。

总结不同的内存分配算法各有优缺点,选择合适的算法取决于具体的应用场景和系统需求。

首次适应算法和循环首次适应算法适用于内存分配需求频繁变化的场景。

实现内存分配实验报告(3篇)

实现内存分配实验报告(3篇)

第1篇一、实验目的1. 理解操作系统内存分配的基本原理和常用算法。

2. 掌握动态分区分配方式中的数据结构和分配算法。

3. 通过编写程序,实现内存分配和回收功能。

二、实验环境1. 操作系统:Linux2. 编程语言:C语言3. 开发工具:GCC编译器三、实验原理1. 内存分配的基本原理操作系统内存分配是指操作系统根据程序运行需要,将物理内存分配给程序使用的过程。

内存分配算法主要包括以下几种:(1)首次适应算法(First Fit):从内存空间首部开始查找,找到第一个满足条件的空闲区域进行分配。

(2)最佳适应算法(Best Fit):在所有满足条件的空闲区域中,选择最小的空闲区域进行分配。

(3)最坏适应算法(Worst Fit):在所有满足条件的空闲区域中,选择最大的空闲区域进行分配。

2. 动态分区分配方式动态分区分配方式是指操作系统在程序运行过程中,根据需要动态地分配和回收内存空间。

动态分区分配方式包括以下几种:(1)固定分区分配:将内存划分为若干个固定大小的分区,程序运行时按需分配分区。

(2)可变分区分配:根据程序大小动态分配分区,分区大小可变。

(3)分页分配:将内存划分为若干个固定大小的页,程序运行时按需分配页。

四、实验内容1. 实现首次适应算法(1)创建空闲分区链表,记录空闲分区信息,包括分区起始地址、分区大小等。

(2)编写分配函数,实现首次适应算法,根据程序大小查找空闲分区,分配内存。

(3)编写回收函数,回收程序所占用的内存空间,更新空闲分区链表。

2. 实现最佳适应算法(1)创建空闲分区链表,记录空闲分区信息。

(2)编写分配函数,实现最佳适应算法,根据程序大小查找最佳空闲分区,分配内存。

(3)编写回收函数,回收程序所占用的内存空间,更新空闲分区链表。

3. 实验结果分析(1)通过实验,验证首次适应算法和最佳适应算法的正确性。

(2)对比两种算法在内存分配效率、外部碎片等方面的差异。

五、实验步骤1. 创建一个动态内存分配模拟程序,包括空闲分区链表、分配函数和回收函数。

可变分区存储管理的内存分配算法模拟实现----最佳适应算法

可变分区存储管理的内存分配算法模拟实现----最佳适应算法

可变分区存储管理的内存分配算法模拟实现----最佳适应算法可变分区存储管理是一种内存管理技术,其通过将内存分割成不同大小的区域来存储进程。

每个进程被分配到与其大小最匹配的区域中。

内存分配算法的选择影响了系统的性能和资源利用率。

本文将介绍最佳适应算法,并模拟实现该算法。

一、什么是最佳适应算法?最佳适应算法是一种可变分区存储管理中的内存分配策略。

它的基本思想是在每次内存分配时选择最合适的空闲区域。

具体来说,它从可用的空闲区域中选择大小与需要分配给进程的内存最接近的区域。

二、算法实现思路最佳适应算法实现的关键是如何快速找到最合适的空闲区域。

下面给出一个模拟实现的思路:1. 初始化内存分区列表,首先将整个内存定义为一个大的空闲区域。

2. 当一个进程请求分配内存时,从列表中找到与所需内存最接近的空闲区域。

3. 将该空闲区域分割成两部分,一部分分配给进程,并将该部分标记为已分配,另一部分留作新的空闲区域。

4. 更新内存分区列表。

5. 当一个进程释放内存时,将其所占用的内存区域标记为空闲,然后尝试合并相邻的空闲区域。

三、算法模拟实现下面是一个简单的Python代码实现最佳适应算法:pythonclass MemoryPartition:def __init__(self, start_addr, end_addr, is_allocated=False): self.start_addr = start_addrself.end_addr = end_addrself.is_allocated = is_allocatedclass MemoryManager:def __init__(self, total_memory):self.total_memory = total_memoryself.partition_list = [MemoryPartition(0, total_memory)]def allocate_memory(self, process_size):best_fit_partition = Nonesmallest_size = float('inf')# 找到最佳适应的空闲区域for partition in self.partition_list:if not partition.is_allocated and partition.end_addr - partition.start_addr >= process_size:if partition.end_addr - partition.start_addr < smallest_size:best_fit_partition = partitionsmallest_size = partition.end_addr - partition.start_addrif best_fit_partition:# 将空闲区域分割,并标记为已分配new_partition =MemoryPartition(best_fit_partition.start_addr,best_fit_partition.start_addr + process_size, True)best_fit_partition.start_addr += process_sizeself.partition_list.append(new_partition)return new_partition.start_addr,new_partition.end_addrelse:return -1, -1def deallocate_memory(self, start_addr, end_addr):for partition in self.partition_list:if partition.start_addr == end_addr and not partition.is_allocated:# 标记空闲区域partition.is_allocated = False# 尝试合并相邻空闲区域for next_partition in self.partition_list:if not next_partition.is_allocated andnext_partition.start_addr == end_addr:end_addr = next_partition.end_addrself.partition_list.remove(next_partition)breakelse:breakdef print_partitions(self):for partition in self.partition_list:if partition.is_allocated:print(f"Allocated Partition: {partition.start_addr} - {partition.end_addr}")else:print(f"Free Partition: {partition.start_addr} - {partition.end_addr}")# 测试最佳适应算法if __name__ == "__main__":mm = MemoryManager(1024)start, end = mm.allocate_memory(256)print(f"Allocated memory: {start} - {end}")mm.print_partitions()mm.deallocate_memory(start, end)print("Memory deallocated:")mm.print_partitions()以上代码实现了一个简单的内存管理器类`MemoryManager`,它具有`allocate_memory`和`deallocate_memory`等方法。

内存分配方式范文

内存分配方式范文

内存分配方式范文内存分配是计算机中的重要概念,它指的是将计算机的内存资源分配给不同的程序和数据。

内存分配方式可以根据分配的策略和实现方式来进行分类。

下面将介绍几种常见的内存分配方式。

1.静态分配:静态分配是指在编译或链接阶段将内存空间分配给程序的变量或数据结构。

在静态分配中,内存的分配和释放是由编译器或链接器完成的,程序在运行期间不会改变内存分配的情况。

静态分配的优点是分配速度快,不会发生内存碎片问题,但缺点是需要预先确定内存的大小,不能动态调整。

2.动态分配:动态分配是在程序运行期间根据需要分配和释放内存空间。

常见的动态分配方式有以下几种:- 堆(Heap)分配:堆分配是通过指定大小在堆内存中分配一块连续的内存空间。

它通常用于创建动态分配的数据结构,如链表、树、堆等。

堆分配的优点是可以根据需要分配灵活大小的内存,但缺点是分配和释放的速度较慢,并且容易产生内存碎片。

- 栈(Stack)分配:栈分配是指在程序运行期间分配局部变量和函数调用的内存空间。

栈内存具有后进先出的特性,每次分配内存只需要修改栈指针即可。

栈分配的优点是分配和释放速度快,但缺点是分配的内存大小固定,不适合动态分配。

- 池(Pool)分配:池分配是指事先在内存中创建一定数量的内存块,然后根据需要从池中分配和释放内存。

池分配的优点是分配和释放速度快,且不容易产生内存碎片,但缺点是需要事先确定池的大小,不能动态调整。

3.分区分配:分区分配是指将内存空间分成多个固定大小的分区,每个分区用于分配给不同的程序或数据。

常见的分区分配方式有以下几种:-等大小分区:等大小分区是将内存空间分成大小相等的分区,每个分区只能分配给一个程序或数据。

这种分区方式容易产生内存碎片,但分配和释放速度较快。

-不等大小分区:不等大小分区是将内存空间分成大小不等的分区,每个分区可以根据需要分配给不同大小的程序或数据。

这种分区方式可以更有效地利用内存空间,但分配和释放速度较慢。

c++动态分区分配算法模拟(操作系统课程设计)

c++动态分区分配算法模拟(操作系统课程设计)

学习操作系统和计算机网 络,了解计算机系统的工 作原理
参加编程比赛和项目实践, 提高解决问题的能力
关注行业动态和技术发展, 不断学习新知识和技能
感谢您的观看
汇报人:
算法性能评估
时间复杂度:O(n)
空间复杂度:O(1)
稳定性:稳定
适用场景:适用于动态分 区分配问题
模拟结果总结与反思
模拟结果:动态分区分配算法的性能表现 优点:提高了内存利用率,减少了内存碎片 缺点:增加了内存管理开销,可能导致内存碎片 改进方向:优化内存管理算法,提高内存利用率和性能
05 课程设计总结与展望优化目标Leabharlann 提高 算法的执行效率 和内存利用率
优化策略:采用 动态调整分区大 小、优化内存分 配策略等方法
优化效果:通过 优化,可以提高 算法的执行效率 和内存利用率, 降低内存碎片率, 提高系统的稳定 性和可靠性。
04 模拟结果分析
内存分配情况统计
内存分配次数:统 计模拟过程中内存 分配的次数
确定分区大小和数量
确定分区大小:根据需求确定分区大小,如1KB、2KB等 确定分区数量:根据需求确定分区数量,如10个、20个等 分区分配策略:采用最佳适应算法、最坏适应算法、首次适应算法等 分区合并策略:采用分区合并算法,如合并空闲分区、合并相邻空闲分区等
实现分区分配算法
初始化:设置分区表,记录每个分区的状态和位置 分配:根据请求大小,查找合适的分区 合并:将相邻的空闲分区合并为一个大分区 分割:将大分区分割为多个小分区 回收:释放不再使用的分区,将其加入空闲分区列表 维护:定期整理分区表,保持分区信息的准确性
实现内存回收函数
内存回收函数的作用:释放不再使用的内存空间,提高内存利用率 内存回收函数的实现:通过遍历内存块链表,找到空闲内存块,将其添加到空闲链表中 内存回收函数的调用:在程序运行过程中,当需要释放内存时,调用内存回收函数 内存回收函数的优化:通过改进算法,提高内存回收的效率和准确性

内存管理、分配与回收模拟实验

内存管理、分配与回收模拟实验

华中师范大学计算机科学系实验报告书实验题目:内存管理、分配与回收课程名称:操作系统主讲教师:辅导教师:课程编号:班级:实验时间:一、实验目的:(1)掌握内存分区管理的基本思想,理解内存分配表。

(2)深入理解可变分区的内存分配策略,掌握首先适应算法、最佳适应算法和最坏适应算法。

(3)掌握内存碎片产生的途径以及解决碎片的方法——拼接技术。

(4)实现分区的回收。

针对内存管理的相关活动,研究内存空闲队列的动态组织与管理问题,以及在此基础上执行的内存分配与回收活动。

二、实验内容:本实验将利用伙伴系统来组织内存空闲块队列和已使用内存块队列。

从初始化快照、某一组作业申请内存块前的快照、分配成功后的快照等状态出发,结合内存分配原语(算法)和内存回收原语(算法)的实现,结合实际内存块的动态分配与回收情况(某一快照),研究内存空闲块队列的组织、变化及其队列管理方面的问题。

具体内容如下:(1)实现内存分配算法和内存回收算法。

(2)以伙伴系统的组织方式管理内存空闲队列和已使用内存块队列,具体的组织策略应分别考虑首次适应策略、最佳适应策略和最坏适应策略。

(3)考虑在某一内存使用一段时间的快照,给出一组作业的内存申请,判断该申请是否可以被满足。

三、实验要求(1)分配算法中切割空闲区是从低地址开始;(2)需考虑门限值情况,门限值是指切割空闲区后剩下的区域若小于一个用户给定的值时,就不切割该空闲区,统统分给申请者,这个值由用户指定;(3)回收算法需要考虑上邻、下邻、上下邻和不相邻四种情况。

四、实验环境:实践平台:windows编写环境:CodeBlocks编译器:g++五、实验设计原理(1)可变分区基本思想可变分区是指系统不预先划分固定分区,而是在装入程序时划分,使程序分配的大小正好等于程序的需求量,且分区的个数是可变的,这样有较大的灵活性,较之固定分区能获得更好的内存利用率。

其状态如图所示:(2)内存分配表内存分配表由两张表格组成:一张是已分配表,记录已装入的程序在内存中占用分区的起始地址和长度,并表之位指出占用分区的程序名;另一张是空闲区表,记录内存中可供分配的空闲区的起始地址和长度,用标志位指出该分区是未分配的空闲区。

内存连续分配方式实验

内存连续分配方式实验

内存连续分配方式实验内存连续分配是操作系统中的重要概念之一、在计算机系统中,内存分配是指将进程所需的内存空间分配给其使用,同时也需要满足内存管理的要求。

内存连续分配方式是指将进程所需的内存空间连续地划分并分配给进程。

下面将介绍内存连续分配的几种方式及实验。

1.固定分区分配方式:固定分区分配方式是将整个内存空间分为若干个大小相等的分区,并为每个分区分配一个进程。

这种分配方式适用于进程数固定或进程大小相对稳定的场景。

固定分区分配方式的优点是简单易实现,缺点是可能会造成内存空间浪费,同时,当进程数或进程大小发生变化时,需要重新划分分区,性能较差。

2.动态分区分配方式:动态分区分配方式是根据进程的实际需要动态地分配内存空间。

动态分区分配方式将内存空间划分为若干个大小不等的分区,每个分区都可以独立地分配给进程使用。

当有新进程需要内存空间时,系统会根据分区空闲情况找到合适的分区进行分配。

动态分区分配方式的优点是充分利用内存空间,缺点是可能会出现内存碎片问题。

3.伙伴系统分配方式:伙伴系统分配方式是一种动态分区分配方式的改进版本。

它将内存空间划分为若干个大小相等的块,每个块大小都是2的幂。

当有新进程需要内存空间时,系统会找到与其大小最接近的空闲块进行分配。

如果找到的块大于所需大小,则将其划分为两个大小相等的块,其中一个分配给进程,另一个留作备用;如果找到的块小于所需大小,则会继续查找更大的空闲块进行分配。

伙伴系统分配方式的优点是减少了内存碎片问题,缺点是实现较为复杂。

实验设计:1.实验目的:通过实验,测试和比较不同的内存连续分配方式在不同场景下的性能和效果。

2.实验环境:使用一台具备内存管理功能的计算机,并在上面运行操作系统。

3.实验步骤:a.首先,选择一种内存连续分配方式,如固定分区分配方式。

b.根据选择的分配方式,设置相应的分区大小和数量。

c.运行一些需要内存空间的进程,并观察它们的分配情况。

d.记录每个进程所分配到的内存空间大小和位置,以及未分配的内存空间大小和位置。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

课程设计报告设计题目:内存的连续分配算法班级: 1003学号:211011023姓名:指导老师:设计时间:2012年8月摘要1、主要算法包括:固定分区分配、动态分区分配、伙伴算法、可重定位分区分配。

2、内容要求:1)定义与算法相关的数据结构,如PCB,空闲分区表;2)至少实现两种以上分配算法,且用户可以选择在某次执行过程中使用何种算法;3)在使用动态分区分配或可重定位分区分配算法时必须实现紧凑和对换功能;4)动态分区分配和可重定位分区分配必选一个实现。

本系统模拟了操作系统内存分配算法的实现,实现了固定分区分配和动态分区分配,以及可重定位分区分配算法,采用PCB 定义结构体来表示一个进程,定义了进程的名称和大小,进程内存起始地址和进程状态。

内存分区表采用单链表来模拟实现。

关键词:固定分区分配、动态分区分配、可重定位分区分配。

目录1. 概述 (4)2. 课程设计任务及要求2.1 设计任务 (4)2.2 设计要求 (4)3. 算法及数据结构3.1算法的总体思想(流程) (5)3.2 PCB模块3.2.1 功能(运算) (5)3.2.2 数据结构(存储结构) (5)3.2.3 算法(实现) (5)3.3 进程队列模块3.3.1功能 (6)3.3.2 数据结构 (6)3.3.3算法 (6)4. 程序设计与实现4.1 程序流程图 (7)4.2 程序说明(代码)4.3 实验结果 (9)5. 结论 (10)6. 参考文献。

(10)7. 收获、体会和建议。

(10)一:概述本系统模拟了操作系统内存分配算法的实现,实现了固定分区分配和动态分区分配,以及可重定位分区分配算法,采用PCB定义结构体来表示一个进程,定义了进程的名称和大小,进程内存起始地址和进程状态。

内存分区表采用单链表来模拟实现。

固定分区实现就是将单链表的每个节点的大小设为固定大小,系统默认如果按固定分区分配的话,只能分成20个相等大小的分区,因此系统只能最多运行20个进程。

动态分区的实现是根据进程所申请的内存大小来决定动态的有系统进行分配内存空间大小,因此分区表里的空闲分区个数是不定的,根据进程数和进程大小决定的。

可重定位分区算法比动态分区算法增加了紧凑和进程对换的功能。

二:课程设计任务及要求设计任务:使用C++ MFC实现模拟操作系统内存分配算法的实现,定义结构体数据结构表示进程,定义单链表表示内存分区表。

设计要求:定义与算法相关的数据结构,如PCB,空闲分区表;至少实现两种以上分配算法,且用户可以选择在某次执行过程中使用何种算法;在使用动态分区分配或可重定位分区分配算法时必须实现紧凑和对换功能;动态分区分配和可重定位分区分配必选一个实现。

三:算法及数据结构#define free 0 //表示进程状态空闲#define busy 1 //表示进程状态忙typedef int Status; //表示进程状态struct PCB //表示进程PCB结构体{CString name; //进程nameStatus status; //进程状态busy or freeint lStartAddres; //进程起始地址int Size; //进程大小};struct Node //表示组成链表的结点结构体{PCB data;Node *next;};class Queue //表示分区表的单链表类{public:Queue();~Queue(){}//void Show(); //内存区分配情况显示int GetLength();int GetAllFree(); //获得所有空闲分区总大小void InitialMemory(int ); //初始化内存区域大小void FixedPartitonAlloc(); //固定分区分配初始化空闲内存链表bool AllocProFixed(CString ,int ); //为进程分配内存(执行固定分区分配算法)bool AllocProDynamic(CString ,int ); //为进程分配内存(动态分区分配)bool FreeMemory(CString ); //释放进程内存bool AllMerge(int); //内存紧凑分区算法bool Swaping(int ,PCB&); //进程对换算法Node *GetFirst(); //返回头结点void Clear(); //链表节点清除private:Node *first;};#include "StdAfx.h"#include "Queue.h"Queue::Queue(){//默认头结点数据first = new Node;first->data.lStartAddres=0;first->="";first->data.Size=0;first->data.status=busy;first->next=NULL;}int Queue::GetLength(){int n=0;Node *p=first;while(p->next){p=p->next;n++;}return n;}Node *Queue::GetFirst(){return first;}int Queue::GetAllFree(){int n=0;Node *p=first;while(p->next){p=p->next;if (p->data.status==free){n+=p->data.Size;}}return n;}//void Queue::Show()// Node *p=first;// while(p->next)// {// p=p->next;// cout<<"分区号:"<<p-><<endl;// cout<<"分区状态:"<<(p->data.status==busy ?"busy":"free")<<endl;// cout<<"分区起始地址:"<<p->data.lStartAddres<<endl;// cout<<"分区大小:"<<p->data.Size<<endl;// cout<<"--------------------------------\n";// }//}void Queue::InitialMemory(int i){PCB tmp;="";tmp.status=free;tmp.lStartAddres=0;tmp.Size=i;Node *s=new Node;s->data=tmp;first->next=s;s->next=NULL;}void Queue::Clear(){Node *q;Node *p=first->next;while(p->next){q=p;p=p->next;delete q;}}void Queue::FixedPartitonAlloc() {PCB tmp;int AllSize=first->next->data.Size;int perSize=AllSize/20;first->next->data.Size=perSize;Node *p= first;for (int i=1;i<20;i++){while(p->next){p=p->next;}="";tmp.status=free;tmp.lStartAddres=i*perSize+1;tmp.Size=perSize;Node *s= new Node;s->data=tmp;p->next=s;s->next=NULL;}}bool Queue::AllocProFixed(CString _name,int _size) {PCB tmp;Node *p= first;while(p->next){p=p->next;if (p->data.Size>=_size&&p->data.status==free){p->=_name;p->data.status=busy;return true;}}return false;}void Queue::SortList(){Node *p=NULL;Node *q=NULL;for(p=first->next;p->next;p=p->next)for (q=p->next;q;q=q->next){if (p->data.Size>q->data.Size){PCB tmp;tmp=p->data;p->data=q->data;q->data=tmp;}}}//动态分区分配算法(最佳适应算法)bool Queue::AllocProDynamic(CString _name,int _size) {Node *p=first;Node *q=NULL; //用来记录最佳插入点位置int ch=0; //用来记录最小碎片值while(p->next){p=p->next;//分区大小正好和进程大小相等if (p->data.status==free&&p->data.Size==_size){p->=_name;p->data.status=busy;return true;}if (p->data.status==free&&p->data.Size>_size) {ch=p->data.Size-_size;q=p;break;}/*//分区大小大于进程大小,分割分区,并按大小分区排序if (p->data.Size>_size&&p->data.status==free) {Node *s=new Node;int tmp=p->data.Size-_size;if (tmp>_size){s->data.lStartAddres=p->data.lStartAddres;s->data.Size=_size;s->=_name;s->data.status=busy;p->data.lStartAddres+=_size;p->data.Size=tmp;s->next=q->next;q->next=s;SortList(); //对分区链表进行按大小有小到大排序return true;}else{s->data.lStartAddres=p->data.lStartAddres+tmp;s->=_name;s->data.Size=_size;s->data.status=busy;p->data.Size=tmp;s->next=p->next;p->next=s;SortList(); //对分区链表进行按大小有小到大排序return true;}*/}while(p){if (p->data.status==free&&p->data.Size>=_size) {if (p->data.Size-_size<ch){ch=p->data.Size-_size;q=p;}}p=p->next;}if(q==NULL){return false;}else{Node *s=new Node;s->data.lStartAddres=q->data.lStartAddres+ch;s->=_name;s->data.Size=_size;s->data.status=busy;q->data.Size=ch;s->next=q->next;q->next=s;return true;}}bool Queue::FreeMemory(CString _name){Node *p=first;Node *q;while(p->next){q=p;p=p->next;if (p->==_name){p->="";p->data.status=free;//进行相邻分区合并if (q->data.status==free){q->data.Size+=p->data.Size;q->next=p->next;}//判断是否为链表尾if (p->next!=NULL){if (p->next->data.status==free){p->data.Size+=p->next->data.Size;p->next=p->next->next;}}return true;}}return false;}bool Queue::AllMerge(int _size){Node *p=first;Node *q;int sum=0;bool flag=true; //标志是否为第一次找到free分区while(p->next){while(p->next){q=p;p=p->next;if (p->data.status==free&&flag){sum=p->data.Size;q->next=p->next;flag=false;break;}if (!flag&&p->data.status==busy){//对数据进行重定位p->data.lStartAddres-=sum;}if (p->data.status==free&&!flag) {p->data.Size+=sum;//对数据进行重定位p->data.lStartAddres-=sum;if (p->data.Size>=_size){return true;}q->next=p->next;sum=p->data.Size;break;}}while(p){q=p;p=p->next;if (p->data.status==free){p->data.Size+=sum;//对数据进行重定位p->data.lStartAddres-=sum;if (p->data.Size>_size){return true;}q->next=p->next;sum=p->data.Size;break;}else{//对数据进行重定位p->data.lStartAddres-=sum;}}}return false;}bool Queue::Swaping(int needSize ,PCB &pro) {Node *p=first;//Node *q;while(p->next){p=p->next;if (p->data.Size>=needSize){pro=p->data;p->="";p->data.status=free;return true;}}return false;}四:程序设计与实现。

相关文档
最新文档