内存管理

合集下载

操作系统原理第5章 存储管理

操作系统原理第5章 存储管理

• ⑶最佳适应算法
• 最佳适应算法的空闲链是按空闲区从小到大顺序排 列。为进程选择分区时总是寻找其大小最接近进程 所要求的存储区域。所谓“最佳”是指每次为进程 分配内存时,总是把能满足要求、又是最小的空闲 分区分配给进程,避免“大材小用”。
• 因为每次分配后所切割下来的剩余部分总是最小的, 这样将加速碎片的形成。
• ①如果被回收空闲分区没有空闲伙伴分区,那么保留该分区为一 个独立的空闲分区,否则执行②;
• ②合并回收分区及其伙伴分区,从而得到一个尺寸(2I+1)更大的 回收空闲分区,转移到①;
一个伙伴系统内存分配与回收的例子
• 伙伴系统克服了固定分区和动态分区存储管理技术的缺陷。但是伙伴 系统存在一个问题,即内存空间需要不断地进行分裂和合并,频繁的 伙伴分区合并操作会浪费很多时间。
• ③内存分配原则,以页帧为单位来分配内存,将进程若干个逻辑上连续的 页面装入若干个离散的页帧中,由页表提供进程的页号到存储空间帧号的 映射。
5.2.4伙伴系统
• 其实现原理如下: • 一个伙伴系统内存的用户可用空间为2U。进程申请存储空间时,
系统总是为其分配大小为2I的一个空闲分区。其中S≤I≤U,2S是系 统允许的最小分区尺寸。在实际操作系统中,最小分区尺寸一般 为212。 • 如果进程申请的存储空间大小为K,且2I-1<K≤2I,则将整个2I大小的 分区分配给该进程;否则,该分区被分割成两个大小相等的伙伴 分区,大小为2I-1;再判断K是否满足条件:2I-2<K≤2I-1,若满足条件, 则将两个伙伴中的任何一个分配给该进程。否则,将其中一个伙 伴又分成两个大小相等的伙伴分区;此过程一直继续进行,直到 产生的分区满足条件I-J≥S并2I-J-1<K≤2I-J,将2I-J大小的分区分配给该 进程;当I-J-1<S时,系统不再分割成两个大小相等的伙伴分区,将 2S大小的分区分配给该进程。 • 当进程执行完毕,释放一个尺寸为2I的分区时,系统用下面的算法 回收该分区。

两种常见的内存管理方法:堆和内存池

两种常见的内存管理方法:堆和内存池

两种常见的内存管理方法:堆和内存池本文导读在程序运行过程中,可能产生一些数据,例如,串口接收的数据,ADC采集的数据。

若需将数据存储在内存中,以便进一步运算、处理,则应为其分配合适的内存空间,数据处理完毕后,再释放相应的内存空间。

为了便于内存的分配和释放,AWorks提供了两种内存管理工具:堆和内存池。

本文为《面向AWorks框架和接口的编程(上)》第三部分软件篇——第9章内存管理——第1~2小节:堆管理器和内存池。

本章导读在计算机系统中,数据一般存放在内存中,只有当数据需要参与运算时,才从内存中取出,交由CPU运算,运算结束再将结果存回内存中。

这就需要系统为各类数据分配合适的内存空间。

一些数据需要的内存大小在编译前可以确定。

主要有两类:一类是全局变量或静态变量,这部分数据在程序的整个生命周期均有效,在编译时就为这些数据分配了固定的内存空间,后续直接使用即可,无需额外的管理;一类是局部变量,这部分数据仅在当前作用域中有效(如函数中),它们需要的内存自动从栈中分配,也无需额外的管理,但需要注意的是,由于这一部分数据的内存从栈中分配,因此,需要确保应用程序有足够的栈空间,尽量避免定义内存占用较大的局部变量(比如:一个占用数K内存的数组),以避免栈溢出,栈溢出可能破坏系统关键数据,极有可能造成系统崩溃。

一些数据需要的内存大小需要在程序运行过程中根据实际情况确定,并不能在编译前确定。

例如,可能临时需要1K内存空间用于存储远端通过串口发过来的数据。

这就要求系统具有对内存空间进行动态管理的能力,在用户需要一段内存空间时,向系统申请,系统选择一段合适的内存空间分配给用户,用户使用完毕后,再释放回系统,以便系统将该段内存空间回收再利用。

在AWorks中,提供了两种常见的内存管理方法:堆和内存池。

9.1 堆管理器。

内存管理的名词解释

内存管理的名词解释

内存管理的名词解释1.引言在计算机科学中,内存管理是一个重要且复杂的领域,它涉及到如何有效地分配、使用和释放计算机的内存资源。

本文将深入探讨内存管理的重要概念和术语,并解释它们的含义和作用。

2.虚拟内存虚拟内存是一种内存管理技术,它允许操作系统将物理内存和磁盘空间结合起来,以扩展计算机的可用内存。

通过虚拟内存,每个进程都可以拥有自己的虚拟内存空间,而不受物理内存大小的限制。

该技术通过将内存中的数据分割成固定大小的块,称为页面,以实现对内存的动态分配。

3.物理内存物理内存是计算机中实际存在的内存,它包括RAM(Random Access Memory,随机存取存储器)和ROM(Read-Only Memory,只读存储器)等。

操作系统通过内存管理器来分配和回收物理内存,以满足程序的需求。

物理内存的大小直接影响到计算机的性能,如果内存不足,系统可能会变得缓慢或不稳定。

4.分页分页是一种内存管理技术,它将进程的虚拟内存空间划分为固定大小的页面,并将这些页面映射到物理内存的页面帧上。

分页的好处是可以更高效地使用内存空间,同时也能够有效地隔离各个进程的内存,提高系统的安全性。

5.分段分段是一种内存管理技术,它将进程的虚拟内存空间划分为多个段,如代码段、数据段、堆段和栈段等。

每个段具有不同的大小和属性,它们被映射到物理内存的连续区域中。

分段的好处是可以为不同的程序段提供不同的访问权限和保护级别,提高系统的可靠性和安全性。

6.内存分配内存分配是指将可用的内存资源分配给进程或程序使用。

在操作系统中,内存管理器负责处理内存分配请求。

常见的内存分配算法包括首次适应算法、最佳适应算法和最坏适应算法等。

内存分配的目标是尽可能高效地利用内存资源,同时确保进程之间不会发生冲突或互相访问彼此的内存。

7.内存回收内存回收是指在进程完成后将其使用的内存资源释放回操作系统,以便其他进程可以使用。

内存管理器负责跟踪和记录已分配的内存块,并在进程结束时将其标记为可用状态。

操作系统课程设计内存管理

操作系统课程设计内存管理

操作系统课程设计内存管理一、课程目标知识目标:1. 理解内存管理的基本概念,掌握内存分配、回收的原理及方法;2. 掌握虚拟内存的原理,了解分页、分段等内存管理技术;3. 了解操作系统中内存保护、共享、碎片处理等相关问题。

技能目标:1. 能够运用所学知识,分析并设计简单的内存管理算法;2. 能够通过编程实践,实现基本的内存分配与回收功能;3. 能够运用虚拟内存技术,解决实际问题。

情感态度价值观目标:1. 培养学生对操作系统中内存管理知识的学习兴趣,激发学生主动探索精神;2. 培养学生的团队协作意识,学会与他人共同解决问题;3. 增强学生的信息安全意识,了解内存管理在操作系统安全中的重要性。

课程性质分析:本课程为操作系统课程设计的一部分,侧重于内存管理方面的知识。

内存管理是操作系统核心功能之一,对于提高系统性能、保障系统安全具有重要意义。

学生特点分析:学生为计算机科学与技术等相关专业的高年级本科生,具备一定的操作系统基础知识,具备一定的编程能力,但可能对内存管理的深入了解和应用尚有不足。

教学要求:1. 结合实际案例,深入浅出地讲解内存管理的基本原理和方法;2. 采用任务驱动法,引导学生通过实践,掌握内存管理技术;3. 注重培养学生的动手能力和创新能力,提高学生解决实际问题的能力。

二、教学内容1. 内存管理概述:介绍内存管理的基本概念、任务和目标;- 教材章节:第2章 内存管理概述- 内容:内存分配、回收原理,内存保护、共享机制。

2. 内存管理技术:讲解物理内存管理和虚拟内存管理技术;- 教材章节:第3章 内存管理技术- 内容:分页管理、分段管理、段页式管理,内存碎片处理。

3. 内存管理算法:分析常见的内存分配和回收算法;- 教材章节:第4章 内存管理算法- 内容:首次适应算法、最佳适应算法、最坏适应算法等。

4. 操作系统内存管理实例分析:结合具体操作系统,分析其内存管理实现;- 教材章节:第5章 操作系统内存管理实例- 内容:Linux内存管理、Windows内存管理。

内存管理实验指导书

内存管理实验指导书
struct _MMVAD *LeftChild;
struct _MMVAD *RightChild;
ULONG_PTR StartingVpn;
ULONG_PTR EndingVpn;
union {
ULONG_PTR StartingVpn;
ULONG_PTR EndingVpn;
union {
ULONG_PTR LongFlags;
MMVAD_FLAGS VadFlags;
} u;
PCONTROL_AREA ControlArea;
关于该结构参数的说明如下:StartingVpn指这个VAD所描述的那段地址空间的开始虚拟页号;EndVpn指这个VAD所描述的那段地址空间的结束虚拟页号;CommitCharge指提交的物理页数。
(2) _MMVAD_LONG结构体
Line 3999 mm\Mi.h
typedef struct _MMVAD_LONG {
Line 3976 mm\Mi.h
typedef struct _MMVAD {
union {
LONG_PTR Balance : 2;
struct _MMVAD *Parent;
} u1;
释放:当你的程序算法不再需要访问已经保留的地址空间区域时,该区域应该被释放。这个过程称为释放地址空间的区域,它是通过调用VirtualFree函数完成。在页面释放的过程中,只需将页面(工作集中未修改的)挂在空闲页面链表中即可。
(2) 基于堆的内存分配和回收分析
得到句柄:线程调用GetProcessHeap函数得到一个指向它的句柄。该函数返回描述该进程的默认堆的堆数据结构的地址。

操作系统实践报告

操作系统实践报告

操作系统实践报告引言:现代计算机已经成为人们生活和工作中不可或缺的一部分。

而计算机的核心就是操作系统。

操作系统是一种控制和管理计算机硬件和软件资源的软件系统。

操作系统为我们提供了方便的用户界面和高效的资源管理,使得计算机能够更加稳定和高效地运行。

本报告将重点介绍操作系统的实践,包括内存管理、文件系统、进程管理等方面的内容。

通过实践操作系统,我们将更好地理解和掌握计算机系统的工作原理。

一、内存管理内存管理是操作系统中最核心的部分之一。

在操作系统实践中,我们学习了常见的内存管理技术,如连续内存分配和非连续内存分配。

连续内存分配是将内存划分为若干连续的空闲区域,并根据进程的需要将其分配给进程。

而非连续内存分配则是将内存分为若干不连续的块,进程在运行时可以随时申请或释放内存。

通过实践内存管理,我们深入了解了进程的内存空间划分和管理方式,为进一步优化计算机系统性能提供了基础。

二、文件系统文件系统是操作系统中用于管理文件和目录的一种机制。

在实践操作系统中,我们学习了常见的文件系统类型,如FAT、NTFS等。

文件系统不仅负责文件和目录的创建、读写和删除,还需要处理文件的权限控制和数据的存储方式。

通过实践文件系统,我们掌握了文件系统的操作和管理技巧,提高了计算机系统的文件存储和访问效率。

三、进程管理进程管理是操作系统中最重要的功能之一。

在操作系统实践中,我们学习了进程的创建、调度和终止等操作。

进程是计算机系统中正在执行的程序的实例。

通过实践进程管理,我们深入了解了进程的运行机制和调度算法。

合理的进程管理能够提高计算机系统的并发性和响应速度,为用户提供更好的使用体验。

四、设备管理设备管理是操作系统管理计算机硬件设备的关键部分。

在操作系统实践中,我们学习了设备的分配、控制和回收等操作。

设备可以是计算机内部的硬件设备,如CPU、内存等,也可以是外部的设备,如打印机、鼠标等。

通过实践设备管理,我们熟悉了设备的初始化和驱动程序的安装,提高了计算机系统对硬件设备的控制和管理能力。

内存管理基础

内存管理基础

系统对进程的虚拟内存管理:mm{},vm_area_struct{}系统对物理内存管理:page{}每个进程都可用4G的虚拟地址空间 0~4G,每个进程的页表不同(page table : 内存映射。

Memory mapping)几种内存地址:物理地址(PA),虚拟地址:内核空间: 3~4G共1G, 内核虚拟地址(其中包括896M的内核逻辑地址)又划分为两部分:实际的物理地址直接映射到内核空间,当实际物理内存>896M时,此时要做映射,通过建立页表,只有前896M存在这种映射关系当实际物理内存<896M时,PA全部映射到内核空间,此时内核VA –3G=对应的物理PA,反之亦然。

此部分地址称为内核逻辑地址区域kernellogical address用户空间: 0~3G ,页表映射高端内存: >896M的内存空间以上4G虚拟地址空间分配见本子Figure-1。

重点掌握kernel logical address见课件涉及到的内核结构体:task-struct { mm_struct *mm ;}mm_struct *mm {pgd_t pgd;}vm_area_struct * mmap{ } /* emphasis Linux内核中对应进程内存区域的数据结构,一个进程有多个内存区域,所以有多个vma*/cat /proc/<pid>/map内存映射的两层含义:1. 把VA 映射到对应的 PA 上(对VA的操作即对PA的操作)2. 把一个文件的地址空间(文件打开后有缓存,即文件打开后存在于内存上,占用一定内存空间)映射到进程,让进程可以通过访问内存从而访问文件。

内存映射的基本单位都是VMA,如structfile_operations{int (*mmap) (struct file *, struct vm_area_struct *);}Linux内存管理中,4G的进程地址空间, 0-3G为用户空间,3-4G为内核空间,内核空间中小于896M的虚拟内存可以通过offset容易的映射到物理内存,大于896M的部分通过页表映射到物理内存,假如只有800M内存,会被内核空间完全映射,那用户空间的虚拟地址映射到物理内存哪里?是不是内核空间虽然能够完全映射到物理内存,但是因为不会全部使用物理内存,所以当用户空间需要内存映射时,会从物理内存中空闲的部分进行映射?如果是这样,对于物理内存而言,同时存在着内核空间的映射和当前进程的用户空间的映射Problems:文件打开后被调入内存,称之为缓存下载一个新的内核叶框与页区别页的状态page cache, buffer cachefile inodechar tr = malloc(0);把各个函数都用一下,把每个函数的返回值打印出来,看在哪个空间内。

内存:分析内存的种类、组成和管理工作原理

内存:分析内存的种类、组成和管理工作原理

内存:分析内存的种类、组成和管理工作原理引言你是否曾经想过,当你的计算机运行时,它是如何存储和访问信息的?内存是计算机系统中至关重要的一部分,它扮演着存储和访问数据的角色。

在本篇文章中,我们将深入探索内存的不同种类、组成以及管理工作原理。

什么是内存?内存是计算机系统中一种用于存储和访问数据的电子设备。

它可以看作是计算机的短期存储器,它的作用是临时存储运行中的程序和数据。

内存的种类1. 随机访问存储器(RAM)随机访问存储器(Random Access Memory,RAM)是计算机系统中最常见的内存类型之一。

它具有快速的读写速度,并且可以随机访问存储的数据。

RAM中的数据可以通过内存地址直接访问,因此它被广泛用于存储操作系统、程序和临时数据。

静态随机访问存储器(SRAM)静态随机访问存储器(Static Random Access Memory,SRAM)是一种高速随机访问存储器。

它由触发器和逻辑门组成,不需要刷新电路来保持存储的数据。

这使得SRAM具有快速的访问速度,但相对于动态随机访问存储器(DRAM)而言,它的容量较小且价格更高。

动态随机访问存储器(DRAM)动态随机访问存储器(Dynamic Random Access Memory,DRAM)是一种常用的内存类型。

DRAM使用电容来存储数据,因此需要定期刷新电路来维持数据的准确性。

它的容量较大,但相对于SRAM而言,读写速度较慢。

2. 只读存储器(ROM)只读存储器(Read-Only Memory,ROM)是一种永久性存储器,其中存储的数据在断电后仍然保持不变。

ROM中的数据无法被修改,因此被广泛用于存储计算机系统的启动程序(BIOS)和固件。

根据其可编程性,ROM又可分为可编程只读存储器(PROM)、可擦写可编程只读存储器(EPROM)和电可擦写可编程只读存储器(EEPROM)等类型。

3. 快速缓存存储器(Cache)快速缓存存储器(Cache)是一种位于中央处理器(CPU)和主存之间的高速存储器。

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

一、概述1、设计目的(1)了解多道程序系统中,多个进程并发执行的内存资源分配。

(2)模拟可变分区存储管理算法实现分区管理的最佳适应分配算法(3)利用最佳适应算法动态实现内存分配与回收(3)通过实现最佳算法来进一步了解动态分区模式的优缺点。

(4)掌握最佳适应分配算法,深刻了解各进程在内存中的具体分配策略。

2、开发环境PC机WINDOWS环境Visual C++6.0 for Windows二、实验基本原理1、可变分区存储管理之循环首次适应算法分配的概念:分区存储管理是给内存中的进程划分适当大小的存储区,以连续存储各进程的程序和数据,使各进程能并发地执行。

循环首次适应分配算法扫描整个未分配区表或链表,从空闲区中挑选一个能满足用户进程要求的最小分区进行分配。

2、关于循环首次适应的一些基本原理:在可变分区模式下,在系统初启且用户作业尚未装入主存储器之前,整个用户区是一个大空闲分区,随着作业的装入和撤离,主存空间被分成许多分区,有的分区被占用,而有的分区时空闲的。

为了方便主存空间的分配和去配,用于管理的数据结构可由两张表组成:“已分配区表”和“未分配区表”。

在“未分配表中”将空闲区按长度递增顺序排列,当装入新作业时,从未分配区表中挑选一个能满足用户进程要求的分区进行分配。

这时从已分配表中找出一个空栏目登记新作业的起始地址和占用长度,同时修改未分配区表中空闲区的长度和起始地址。

当作业撤离时已分配区表中的相应状态变为“空”,而将收回的分区登记到未分配区表中,若有相邻空闲区再将其连接后登记。

三、数据结构设计1、内存块struct mem{int pr_num; //进程号char * start_addr; //起始地址int size; //大小struct mem * next; //指向下一个内存块};2、程序流程图2.1、整体程序流程图2.2、内存分配流程图2.3、内存回收流程图四、算法的实现1、程序主要功能函数设计思想int neicun();int siquence[MAX]; 存储进程号的数组void showmem(char *); 显示内存分配情况void Menu(void ); 显示操作信息int getnum(void ); 获取进程序号void insert(struct mem *,struct mem *); 将释放内存控制块插入到free列队中int check(int n); 判断是否存在序号为n的进程,存在返回1 void showmcb(struct mem *,int i); 将free,used的信息输出void ch_siquence(int); 进程序列号变反void writemem(char *addr,int snum,int size ); 对内存写入void deletmem(char *addr,int size); 撤消内存内容void freeunion(struct mem * ); 合并空闲表2、程序清单int neicun(void){struct mem *free,*sta_free=NULL,*used,*sta_used,*change;char * mem_addr,*staticmem;char commu;int pro_size,flag=0,snum,i;//flag标志是否获得内存struct mem *temp=sta_free,*p,*temp_used;staticmem=mem_addr=(char *)malloc(SIZE*sizeof(char));//分配内存for(i=0;i<MAX;i++) //进程序列初始化siquence[i]=0;for(i=0;i<SIZE;i++,mem_addr++) //内存初始化(*mem_addr)='_';sta_free=free=(struct mem*)malloc(sizeof(struct mem));free->pr_num=-1;free->start_addr=staticmem;free->size=SIZE;free->next=NULL;sta_used=used=(struct mem*)malloc(sizeof(struct mem));used->pr_num=0;used->start_addr=NULL;used->size=0;used->next=NULL;int cycle=1;while(cycle){Menu(); //显示主菜单scanf("%c%*c",&commu);switch(commu){case 'g':{//为进程分配内存printf("请输入需要的内存大小:");scanf("%d",&pro_size);for(flag=0,temp=sta_free;temp!=NULL;temp=temp->next){if(temp->size>=pro_size){//分配新的内存管理块p=(struct mem *)malloc(sizeof(struct mem));p->pr_num=getnum();p->start_addr=temp->start_addr;p->size=pro_size;p->next=NULL;writemem(p->start_addr,p->pr_num,p->size);//写内容temp->start_addr=temp->start_addr+pro_size;temp->size=temp->size-pro_size;flag=1;break;}}if(flag==1){if(DEBUG) printf("已做过flag==1部分\n");//将新管理块插入到used列队中for(temp_used=sta_used;temp_used->next!=NULL;)temp_used=temp_used->next;temp_used->next=p;printf("成功分配内存块\n请按任意键继续......\n");}else printf("分配内存出错,无法分配所需内存!\n请按任意键继续......\n"); }break;case 'd':{//释放内存snumprintf("输入要释放的进程号:");scanf("%d",&snum);if(check(snum)==1)//判断输入的号码是否正确{//序号正确for(temp_used=sta_used;temp_used->next!=NULL&&temp_used->next->pr_num!=snum;) temp_used=temp_used->next;//往下寻找snum序号if(temp_used->next!=NULL){//找到所需释放的进程deletmem(temp_used->next->start_addr,temp_used->next->size);//删除内容ch_siquence(temp_used->next->pr_num);//进程号变反temp_used->next->pr_num=-1;//撤消进程号change=temp_used->next;temp_used->next=temp_used->next->next;//将内存块从used队列中删除insert(sta_free,change);//将所需释放的内存块插入到free队列中freeunion(sta_free);printf("释放进程%d成功\n请按任意键继续......\n",snum);}}else printf("出错,该序号无效\n请按任意键继续......\n");}break;case 's':{ //显示目前内存分配情况showmem(staticmem);printf("内存起始地址:%d\n",staticmem);showmcb(sta_free,0);showmcb(sta_used,1);printf("请按任意键继续......\n");}break;case 'b':{printf("请按任意键继续......\n");cycle=0;break;}default:{printf(" 对不起,你的输入不合法,请确保你的输入为g,d,s,b中的任一个\n");printf(" 请按任意键继续......\n");}}getchar();}return 0;}//菜单选择函数void Menu(void){system("color 9f"); //背景颜色函数printf("\t 输入命令\n");printf("\t ===============\n");printf("\t g--分配内存\n");printf("\t d--释放内存\n");printf("\t s--显示信息\n");printf("\t b--退出系统\n");printf("\t ===============\n");printf("\t 请选择:");}//显示整个内存起始地址void showmem(char *mem_addr){int i;printf("\n内存内容:\n");for(i=1;i<=SIZE;i++,mem_addr++){printf("%c ",*mem_addr);if(i%20==0)printf("\n");}printf("\n");}//将空闲,分派内存的信息输出void showmcb(struct mem * base,int i){if(i==0) //空闲表{printf("-----------------------------------------\n");printf("空闲表:\n");for(;base!=NULL;base=base->next)printf("起始地址%d:大小%d\n",base->start_addr,base->size); printf("----------------------------------------\n");}if(i==1) //已占表{printf("已分配表:\n");for(base=base->next;base!=NULL;base=base->next)printf("进程号%d,起始地址%d:大小%d\n",base->pr_num,base->start_addr,base->size); printf("-----------------------------------------\n");}}//获取进程序号int getnum(void ){int i;for(i=0;siquence[i]>0;)i++;if(siquence[i]==0){siquence[i]=i+1;return siquence[i] ;}else{siquence[i]*=-1;return siquence[i];}}//对内存写入void writemem(char *addr,int snum,int size ){for(int i=1;i<=size;i++,addr++)*addr=snum+'0';}void insert(struct mem *base,struct mem *p){//将释放内存控制块插入到free列队中for(;base->next!=NULL&&p->start_addr<base->next->start_addr;) base=base->next;if(base->next==NULL){//已到末尾,在末尾插入pbase->next=p;p->next=NULL;}else{ //在链表中间插入pp->next=base->next;base->next=p;}}//判断是否存在序号为n的进程,存在返回1int check(int n){for(int i=0;siquence[i]!=0;i++)if(siquence[i]==n){return 1;break;}return 0;}//进程序列号变反void ch_siquence(int n){for(int i=0;siquence[i]!=0;i++)if(siquence[i]==n)siquence[i]*=-1;}//撤消内存内容void deletmem(char *addr,int size){for(int i=1;i<=size;i++,addr++)*addr='_';}//对空闲表中相邻的空闲块合并void freeunion(struct mem * base){for(;base!=NULL;){if(base->next!=NULL&&base->start_addr==base->next->start_addr+base->next->size) {base->start_addr=base->next->start_addr;base->size=base->size+base->next->size;base->next=base->next->next;}elsebase=base->next;}}3、测试用例与程序运行结果截图3.1、菜单选错误用例:t图1 程序运行结果:输入不合法3.2、内存分配正确测试用例用例:(g, 4)图2 程序运行结果:分配成功3.3、内存分配错误测试用例用例:(g,101)图3 程序运行结果:内存分配错误3.4、内存显示测试用例用例:(s)图4 程序运行结果:显示内存分配情况3.5、内存回收测试用例用例:(d,1),(d,3)图5 程序运行结果:释放成功3.6、循环首次适应算法测试用例用例:(g,51),(g,5)图6 分配成功五、总结1、经验总结:设计程序时,最好将不同的功能用不同的函数实现。

相关文档
最新文档