内存管理实验报告
内存实验报告

一、实验目的1. 了解内存的基本概念和组成结构。
2. 掌握内存的读写操作过程。
3. 熟悉内存寻址方式及其应用。
4. 分析内存性能对系统运行的影响。
二、实验原理1. 内存基本概念:内存是计算机中用于存储数据和指令的设备,它是计算机系统中的核心组成部分。
内存按照存储单元的存储容量和速度分为多种类型,如RAM、ROM、ROM、Cache等。
2. 内存组成结构:内存主要由存储单元、地址译码器、数据总线、控制电路等组成。
存储单元是内存的基本存储单元,每个存储单元都有一个唯一的地址,通过地址译码器将地址转换为存储单元的物理位置。
数据总线用于传输数据,控制电路负责协调读写操作。
3. 内存读写操作过程:内存的读写操作主要包括以下步骤:(1)将需要访问的存储单元地址送入地址寄存器;(2)根据地址寄存器中的地址,通过地址译码器找到对应的存储单元;(3)控制电路根据读写信号,将数据从存储单元读入数据寄存器或从数据寄存器写入存储单元。
4. 内存寻址方式:内存寻址方式主要有以下几种:(1)直接寻址:直接将操作数地址送入指令地址寄存器;(2)间接寻址:将操作数地址存储在内存单元中,通过指令访问该内存单元获取操作数地址;(3)基址寻址:以基址寄存器中的值作为操作数地址的基准;(4)变址寻址:以变址寄存器中的值加上指令中的偏移量作为操作数地址。
三、实验内容1. 内存读写操作实验:通过编程实现内存的读写操作,包括读取内存单元数据、写入内存单元数据等。
2. 内存寻址方式实验:分别使用直接寻址、间接寻址、基址寻址、变址寻址等寻址方式实现数据访问。
3. 内存性能分析实验:分析不同内存类型、容量、速度对系统运行的影响。
四、实验步骤1. 内存读写操作实验:(1)编写程序,实现将数据从内存单元读取到寄存器;(2)编写程序,实现将数据从寄存器写入内存单元。
2. 内存寻址方式实验:(1)使用直接寻址方式,实现数据访问;(2)使用间接寻址方式,实现数据访问;(3)使用基址寻址方式,实现数据访问;(4)使用变址寻址方式,实现数据访问。
存储器管理实验实验报告

存储器管理实验实验报告一、实验目的存储器管理是操作系统的重要组成部分,本次实验的目的在于深入理解存储器管理的基本原理和方法,通过实际操作和观察,掌握存储器分配与回收的算法,以及页面置换算法的实现和性能评估。
二、实验环境本次实验使用的操作系统为 Windows 10,编程语言为 C++,开发工具为 Visual Studio 2019。
三、实验内容与步骤(一)存储器分配与回收算法实现1、首次适应算法(1)原理:从空闲分区链的首地址开始查找,找到第一个满足需求的空闲分区进行分配。
(2)实现步骤:建立空闲分区链表,每个节点包含分区的起始地址、大小和状态(已分配或空闲)。
当有分配请求时,从链表头部开始遍历,找到第一个大小满足需求的空闲分区。
将该分区进行分割,一部分分配给请求,剩余部分仍作为空闲分区留在链表中。
若找不到满足需求的空闲分区,则返回分配失败。
2、最佳适应算法(1)原理:从空闲分区链中选择与需求大小最接近的空闲分区进行分配。
(2)实现步骤:建立空闲分区链表,每个节点包含分区的起始地址、大小和状态。
当有分配请求时,遍历整个链表,计算每个空闲分区与需求大小的差值。
选择差值最小的空闲分区进行分配,若有多个差值相同且最小的分区,选择其中起始地址最小的分区。
对选中的分区进行分割和处理,与首次适应算法类似。
3、最坏适应算法(1)原理:选择空闲分区链中最大的空闲分区进行分配。
(2)实现步骤:建立空闲分区链表,每个节点包含分区的起始地址、大小和状态。
当有分配请求时,遍历链表,找到最大的空闲分区。
对该分区进行分配和处理。
(二)页面置换算法实现1、先进先出(FIFO)页面置换算法(1)原理:选择在内存中驻留时间最久的页面进行置换。
(2)实现步骤:建立页面访问序列。
为每个页面设置一个进入内存的时间戳。
当发生缺页中断时,选择时间戳最早的页面进行置换。
2、最近最久未使用(LRU)页面置换算法(1)原理:选择最近一段时间内最长时间未被访问的页面进行置换。
存储管理实验报告

存储管理实验报告存储管理实验报告引言:存储管理是计算机系统中非常重要的一部分,它负责管理计算机系统中的存储资源,包括内存和外存。
合理的存储管理能够提高计算机系统的性能和效率,保证系统的稳定运行。
本次实验旨在通过实践操作,深入了解存储管理的原理和方法,并通过实验结果分析,探讨存储管理的优化策略。
一、实验目的本次实验的主要目的是通过实践操作,深入了解存储管理的原理和方法,并通过实验结果分析,探讨存储管理的优化策略。
具体目标如下:1. 了解存储管理的基本概念和原理;2. 掌握存储管理的常用方法和技术;3. 分析实验结果,探讨存储管理的优化策略。
二、实验环境本次实验使用了一台配置较高的计算机,具备较大的内存和高速的硬盘。
实验环境如下:1. 操作系统:Windows 10;2. 内存:16GB;3. 硬盘:1TB。
三、实验过程1. 内存管理实验在内存管理实验中,我们使用了一段较大的程序代码进行测试。
首先,我们通过编程语言将程序代码写入内存中,然后通过内存管理技术将程序代码加载到内存的合适位置。
在加载过程中,我们使用了分页和分段两种常用的内存管理技术,并比较了它们的性能差异。
实验结果显示,分页技术相对来说更加高效,能够更好地利用内存资源,提高系统的运行速度。
2. 外存管理实验在外存管理实验中,我们模拟了大文件的读写操作。
首先,我们将一个较大的文件写入硬盘中,然后通过外存管理技术将文件加载到内存中进行读取。
在加载过程中,我们使用了磁盘调度算法和文件系统管理技术,并比较了它们的性能差异。
实验结果显示,磁盘调度算法的选择对系统的读写速度有较大的影响,而文件系统的合理管理能够提高文件的存取效率。
四、实验结果分析通过对实验结果的分析,我们可以得出以下结论:1. 内存管理中,分页技术相对于分段技术更加高效,能够更好地利用内存资源,提高系统的运行速度;2. 外存管理中,磁盘调度算法的选择对系统的读写速度有较大的影响,合理选择磁盘调度算法能够提高系统的性能;3. 文件系统的合理管理能够提高文件的存取效率,减少文件的碎片化,提高系统的整体性能。
存储管理 实验报告

存储管理实验报告存储管理实验报告一、引言存储管理是计算机系统中一个非常重要的组成部分,它负责管理计算机内存的分配、回收和保护。
本次实验旨在通过实际操作,深入理解存储管理的原理和技术,并探索不同的存储管理策略对系统性能的影响。
二、实验目的1. 理解存储管理的基本概念和原理;2. 掌握常见的存储管理算法和策略;3. 分析不同存储管理策略对系统性能的影响。
三、实验环境本次实验使用了一台配置较低的个人电脑,操作系统为Windows 10,内存容量为4GB。
四、实验内容1. 静态分区分配算法静态分区分配算法是最简单的存储管理算法之一。
在实验中,我们使用了最先适应算法(First Fit)和最佳适应算法(Best Fit)进行静态分区分配。
通过对比两种算法的分配效果,我们发现最佳适应算法在减少内存碎片方面表现更好。
2. 动态分区分配算法动态分区分配算法是一种更加灵活的存储管理策略。
在实验中,我们实现了首次适应算法(First Fit)和最佳适应算法(Best Fit)两种动态分区分配算法。
通过观察不同算法的分配效果,我们发现首次适应算法在处理大量小内存块时效率较高,而最佳适应算法在处理大内存块时表现更好。
3. 页面置换算法页面置换算法是虚拟内存管理中的重要组成部分。
在实验中,我们实现了最近最少使用(LRU)算法和先进先出(FIFO)算法两种页面置换算法。
通过模拟内存不足的情况,我们观察了不同算法对系统性能的影响。
结果显示,LRU算法在减少页面置换次数方面比FIFO算法更为优秀。
五、实验结果与分析通过本次实验,我们对不同的存储管理算法和策略进行了实际操作,并观察了它们对系统性能的影响。
实验结果显示,最佳适应算法在静态分区分配中表现更好,而首次适应算法在动态分区分配中效率更高。
在页面置换算法中,LRU 算法在减少页面置换次数方面更为出色。
六、实验总结本次实验通过实际操作,深入理解了存储管理的原理和技术,并探索了不同的存储管理策略对系统性能的影响。
内存管理实验报告

内存管理实验报告内存管理实验报告引言内存管理是计算机系统中非常重要的一部分,它负责管理计算机系统的内存资源,为程序的运行提供必要的支持。
本次实验旨在探究不同的内存管理策略对计算机系统性能的影响,以及如何优化内存管理以提高系统效率。
一、实验背景计算机系统中的内存是用于存储程序和数据的关键资源。
在多道程序设计环境下,多个程序需要共享有限的内存资源,因此需要一种有效的内存管理策略来分配和回收内存空间。
本次实验中,我们将研究并比较两种常见的内存管理策略:固定分区和动态分区。
二、实验过程1. 固定分区固定分区是将内存划分为固定大小的若干区域,每个区域可以容纳一个程序。
在实验中,我们将内存划分为三个固定大小的区域,并将三个不同大小的程序加载到内存中进行测试。
通过观察程序的运行情况和内存利用率,我们可以评估固定分区策略的优缺点。
2. 动态分区动态分区是根据程序的大小动态地分配内存空间。
在实验中,我们将使用首次适应算法来实现动态分区。
首次适应算法将按照程序的大小从低地址开始查找可以容纳该程序的空闲分区,并分配给程序使用。
通过观察动态分区策略下的内存利用率和碎片情况,我们可以评估该策略的优劣。
三、实验结果1. 固定分区在固定分区策略下,我们观察到每个程序都能够顺利运行,但是内存利用率较低。
由于每个程序都需要占用一个固定大小的分区,当程序大小与分区大小不匹配时,会出现内存浪费的情况。
此外,固定分区策略也存在无法分配较大程序的问题。
2. 动态分区在动态分区策略下,我们观察到内存利用率较高,碎片情况也较少。
由于动态分区可以根据程序的大小动态分配内存空间,因此可以更加高效地利用内存资源。
然而,动态分区策略也存在着内存分配和回收的开销较大的问题。
四、实验总结通过本次实验,我们对固定分区和动态分区两种内存管理策略进行了比较和评估。
固定分区策略适用于程序大小已知且固定的情况,但会导致内存浪费;而动态分区策略可以更加灵活地分配内存空间,但会增加内存分配和回收的开销。
Linux内存管理报告

Linux内存管理实验一、实验内容:1.利用boches 观测linux0.11 下的GDT 表和LDT 表内容。
2.利用bochs 观测linux0.11 下的内存地址映射过程以及分页机制的实现。
3.利用bochs修改虚拟地址所对应的物理内存中存放的数值,观测程序运行情况的变化。
二、Linux内存管理机制分析1. 物理内存使用划分:为了有效使用物理内存,Linux将内存划分为几个功能区域,其中包括:内核模块区,高速缓冲区,主内存区,如下图:2.地址映射:逻辑地址:该地址是指由程序产生并与代码段相关的偏移地址,分段分页机制对于程序员是透明的,程序员仅需和逻辑地址打交道。
线性地址:是指由逻辑地址到物理地址之间变换的中间层地址。
程序代码会产生逻辑地址(即段内偏移地址),加上相应的段基址就产生了一个线性地址。
若启用分页机制,那么线性地址还要经过一系列变换生成物理地址,若没有启用分页机制,则线性地址就是物理地址(在实地址模式下,线性地址就是物理地址,但是线性地址加大了系统的不安全因素)。
物理地址:是指出现在cpu外部地址总线上的寻址物理内存的地址信号,即地址变换的最终结果。
当采用分页机制时,线性地址通过页目录,页表中的项来变换成物理地址,否则线性地址就直接是物理地址。
3. 段描述符和段选择符:段描述符:i386虚模式下的地址是32位,而段寄存器却只有16位,因此处理器要求系统在内存中创建一系列的表来存放每个段的首地址。
这些表中的内容用来描述一个段的信息,因此这些表叫段描述符表,包括(GDT:全局描述符表,LDT:局部描述符表,IDT:中断描述符表)表中的内容就称为段描述符。
而程序的逻辑地址就是用段和段内的偏移地址表示。
在linux中,程序的逻辑地址到线性地址的变换就是使用了cpu的全局描述符表GDT和局部描述符表LDT。
由GDT映射的地址空间称为全局地址空间,由LDT 映射的地址空间称为局部地址空间,其中LDT是GDT的二级表,即GDT 中存储了LDT的地址。
内存管理实验报告

内存管理实验报告实验名称:内存管理实验目的:掌握内存管理的相关概念和算法加深对内存管理的理解实验原理:内存管理是操作系统中的一个重要模块,负责分配和回收系统的内存资源。
内存管理的目的是高效地利用系统内存,提高系统的性能和稳定性。
实验过程:1.实验环境准备本实验使用C语言编程,要求安装GCC编译器和Linux操作系统。
2.实验内容实验主要包括以下几个部分:a.基本内存管理创建一个进程结构体,并为其分配一定大小的内存空间。
可以通过C语言中的指针操作来模拟内存管理的过程。
b.连续分配内存算法实现两种连续分配内存的算法:首次适应算法和最佳适应算法。
首次适应算法是从低地址开始寻找满足要求的空闲块,最佳适应算法是从所有空闲块中选择最小的满足要求的块。
c.非连续分配内存算法实现分页和分段两种非连续分配内存的算法。
分页是将进程的虚拟地址空间划分为固定大小的页面,然后将页面映射到物理内存中。
分段是将进程的地址空间划分为若干个段,每个段可以是可变大小的。
3.实验结果分析使用实验中的算法和方法,可以实现对系统内存的高效管理。
通过比较不同算法的性能指标,我们可以选择合适的算法来满足系统的需求。
具体而言,连续分配内存算法中,首次适应算法适用于内存中有大量小碎片的情况,可以快速找到满足要求的空闲块。
最佳适应算法适用于内存中碎片较少的情况,可以保证最小的内存浪费。
非连续分配内存算法中,分页算法适用于对内存空间的快速分配和回收,但会带来一定的页表管理开销。
分段算法适用于对进程的地址空间进行分段管理,可以灵活地控制不同段的权限和大小。
实验中还可以通过性能测试和实际应用场景的模拟来评估算法的性能和适用性。
实验总结:本实验主要介绍了内存管理的相关概念和算法,通过编写相应的代码实现了基本内存管理和连续分配、非连续分配内存的算法。
通过实际的实验操作,加深了对内存管理的理解。
在实验过程中,我们发现不同算法适用于不同情况下的内存管理。
连续分配算法可以根据实际情况选择首次适应算法或最佳适应算法。
操作系统存储管理实验报告

操作系统存储管理实验报告一、实验目的本次实验的目的是通过编写一段程序,实现对内存的分配和回收操作,并验证算法的正确性和性能。
二、实验内容1.实现首次适应算法首次适应算法是一种动态分配的内存管理算法,通过从低地址往高地址内存块,找到第一个满足需求的空闲块进行分配。
具体实现过程如下:(1)初始化内存空间,设置内存块的大小和地址范围;(2)编写一个函数,实现内存的分配操作,根据需求大小找到第一个合适的空闲块,并在其前后设置相应的标志位;(3)编写一个函数,实现内存的回收操作,根据释放块的地址,将其前后的标志位进行合并;(4)模拟应用程序的运行,测试内存的分配和回收操作。
2.实现最佳适应算法最佳适应算法是一种动态分配的内存管理算法,通过整个内存空间,找到最小的满足需求的空闲块进行分配。
具体实现过程如下:(1)初始化内存空间,设置内存块的大小和地址范围;(2)编写一个函数,实现内存的分配操作,遍历整个内存空间,找到满足需求且大小最小的空闲块进行分配;(3)编写一个函数,实现内存的回收操作,根据释放块的地址,将其前后的标志位进行合并;(4)模拟应用程序的运行,测试内存的分配和回收操作。
三、实验结果1.首次适应算法经过测试,首次适应算法能够正确地进行内存的分配和回收操作,并且算法的性能良好。
尽管首次适应算法在分配过程中可能会产生碎片,但是由于它从低地址开始,可以在较短的时间内找到满足需求的空闲块。
在实际应用中,首次适应算法被广泛采用。
2.最佳适应算法经过测试,最佳适应算法能够正确地进行内存的分配和回收操作,并且算法的性能较好。
最佳适应算法会整个内存空间,找到大小最小的满足需求的空闲块。
因此,在分配过程中不会产生很多的碎片,但是算法的执行时间较长。
四、实验总结通过本次实验,我们成功地实现了首次适应算法和最佳适应算法,并对算法的正确性和性能进行了验证。
两种算法在内存的分配和回收过程中都表现出良好的性能,可广泛应用于实际场景中。
操作系统实验二-内存管理

操作系统实验二-内存
管理
-CAL-FENGHAI-(2020YEAR-YICAI)_JINGBIAN
洛阳理工学院实验报告
原始数据纪录:
输入数据:
T1时刻 a 80, b 60, c 100,输出空闲分区
T2时刻,进程结束,释放进程b,输出空闲分区
T3时刻输入d 50后,输出空闲分区
T4时刻进程结束,释放a, c,输出空闲分区
T5时刻进程结束,释放d,输出空闲分区
输出数据:
实验总结:本次实验还是比较难的,操作系统这本书上也没有什么例子供参考,所以只能靠自己的理解以及平时上课的积累才能完成此次实验。
这次实验让我们掌握了内存的分配,回收算法的思想,对内存管理有了进一步的认识。
总的来说,实验的意义就是为了进一步对C语言的认识与理解,根据不同的题目,能够很快想出相应的思路。
操作系统存储管理实验报告

操作系统存储管理实验报告一、实验目的操作系统的存储管理是计算机系统中非常重要的组成部分,它直接影响着系统的性能和资源利用率。
本次实验的目的在于深入理解操作系统中存储管理的基本原理和方法,通过实际操作和观察,掌握存储分配、回收、地址转换等关键技术,并对不同存储管理策略的性能进行分析和比较。
二、实验环境本次实验在 Windows 10 操作系统下进行,使用 Visual Studio 2019 作为编程环境,编程语言为 C++。
三、实验内容(一)固定分区存储管理1、原理固定分区存储管理将内存空间划分为若干个固定大小的分区,每个分区只能装入一道作业。
分区的大小可以相等,也可以不等。
2、实现创建一个固定大小的内存空间数组,模拟内存分区。
为每个分区设置状态标志(已分配或空闲),并实现作业的分配和回收算法。
3、实验结果与分析通过输入不同大小的作业请求,观察内存的分配和回收情况。
分析固定分区存储管理的优缺点,如内存利用率低、存在内部碎片等。
(二)可变分区存储管理1、原理可变分区存储管理根据作业的实际需求动态地划分内存空间,分区的大小和数量是可变的。
2、实现使用链表或数组来管理内存空间,记录每个分区的起始地址、大小和状态。
实现首次适应、最佳适应和最坏适应等分配算法,以及分区的合并和回收算法。
3、实验结果与分析比较不同分配算法的性能,如分配时间、内存利用率等。
观察内存碎片的产生和处理情况,分析可变分区存储管理的优缺点。
(三)页式存储管理1、原理页式存储管理将内存空间和作业都划分为固定大小的页,通过页表将逻辑地址转换为物理地址。
2、实现设计页表结构,实现逻辑地址到物理地址的转换算法。
模拟页面的调入和调出过程,处理缺页中断。
3、实验结果与分析测量页式存储管理的页面置换算法(如先进先出、最近最少使用等)的命中率,分析其对系统性能的影响。
探讨页大小的选择对存储管理的影响。
(四)段式存储管理1、原理段式存储管理将作业按照逻辑结构划分为若干个段,每个段有自己的名字和长度。
实验四操作系统存储管理实验报告

实验四操作系统存储管理实验报告一、实验目的本次实验的主要目的是深入理解操作系统中存储管理的基本原理和方法,通过实际操作和观察,掌握内存分配与回收、页面置换算法等关键概念,并能够分析和解决存储管理中可能出现的问题。
二、实验环境本次实验在装有 Windows 操作系统的计算机上进行,使用了 Visual Studio 等编程工具和相关的调试环境。
三、实验内容(一)内存分配与回收算法实现1、首次适应算法首次适应算法从内存的起始位置开始查找,找到第一个能够满足需求的空闲分区进行分配。
在实现过程中,我们通过建立一个空闲分区链表来管理内存空间,每次分配时从表头开始查找。
2、最佳适应算法最佳适应算法会选择能够满足需求且大小最小的空闲分区进行分配。
为了实现该算法,在空闲分区链表中,分区按照大小从小到大的顺序排列,这样在查找时能够快速找到最合适的分区。
3、最坏适应算法最坏适应算法则选择最大的空闲分区进行分配。
同样通过对空闲分区链表的排序和查找来实现。
(二)页面置换算法模拟1、先进先出(FIFO)页面置换算法FIFO 算法按照页面进入内存的先后顺序进行置换,即先进入内存的页面先被置换出去。
在模拟过程中,使用一个队列来记录页面的进入顺序。
2、最近最久未使用(LRU)页面置换算法LRU 算法根据页面最近被使用的时间来决定置换顺序,最近最久未使用的页面将被置换。
通过为每个页面设置一个时间戳来记录其最近使用的时间,从而实现置换策略。
3、时钟(Clock)页面置换算法Clock 算法使用一个环形链表来模拟内存中的页面,通过指针的移动和页面的访问标志来决定置换页面。
四、实验步骤(一)内存分配与回收算法的实现步骤1、初始化内存空间,创建空闲分区链表,并为每个分区设置起始地址、大小和状态等信息。
2、对于首次适应算法,从链表表头开始遍历,找到第一个大小满足需求的空闲分区,进行分配,并修改分区的状态和大小。
3、对于最佳适应算法,在遍历链表时,选择大小最接近需求的空闲分区进行分配,并对链表进行相应的调整。
《操作系统》存储管理实验报告

《操作系统》存储管理实验报告操作系统是计算机系统中最基础、最核心的软件之一,负责管理计算机硬件资源和提供资源的分配与调度。
而存储管理是操作系统中的重要组成部分,它负责管理计算机的内存,包括内存的分配、回收、保护等操作。
本文将针对存储管理进行实验,并撰写实验报告。
本次实验主要涉及以下内容:内存的分配与回收、内存的保护。
实验过程中,我首先根据操作系统的要求,设计了相应的算法用于内存的分配与回收。
并通过编写程序,验证了算法的正确性。
随后,我进一步研究了内存的保护机制,通过设置访问权限位和访问控制表,实现了对内存的合理保护。
在内存的分配与回收方面,我设计了一种简单的算法,首次适应算法。
具体实现如下:首先,将内存分为若干个块,每个块的大小为固定值。
当需要分配内存时,首先遍历内存块列表,找到第一个大小合适的块,将其分配给进程。
当进程终止时,将其占用的内存块回收,以便后续进程使用。
通过编写程序进行测试,结果表明该算法能够正确地进行内存的分配与回收。
在内存的保护方面,我采用了访问权限位和访问控制表的方式进行。
具体实现如下:首先,为每个进程分配一组访问权限位,记录了该进程能够访问的内存区域。
同时,设置一个访问控制表,记录了每个内存块的权限。
当进程访问一些内存块时,首先检查该进程的访问权限位,再与访问控制表中的权限进行比较,以确定该进程是否有权限访问该内存块。
通过编写程序进行测试,证明了该机制能够有效地保护内存。
总结来说,本次实验主要涉及了操作系统中的存储管理部分,包括内存的分配与回收、内存的保护。
通过设计算法和编写程序,我成功地实现了这些功能,并验证了其正确性。
通过本次实验,我进一步加深了对操作系统存储管理的理解,提高了编程和设计的能力。
操作系统实验-内存管理

操作系统实验-内存管理操作系统实验内存管理在计算机系统中,内存管理是操作系统的核心任务之一。
它负责有效地分配和管理计算机内存资源,以满足各种程序和进程的需求。
通过本次操作系统实验,我们对内存管理有了更深入的理解和认识。
内存是计算机用于存储正在运行的程序和数据的地方。
如果没有有效的内存管理机制,计算机系统将无法高效地运行多个程序,甚至可能会出现内存泄漏、内存不足等严重问题。
在实验中,我们首先接触到的是内存分配策略。
常见的内存分配策略包括连续分配和离散分配。
连续分配是将内存空间视为一个连续的地址空间,程序和数据被依次分配到连续的内存区域。
这种方式简单直观,但容易产生内存碎片,降低内存利用率。
离散分配则将内存分成大小相等或不等的块,根据需求进行分配。
其中分页存储管理和分段存储管理是两种常见的离散分配方式。
分页存储管理将内存空间划分为固定大小的页,程序也被分成相同大小的页,通过页表进行映射。
分段存储管理则根据程序的逻辑结构将其分成不同的段,如代码段、数据段等,每个段有不同的访问权限和长度。
接下来,我们研究了内存回收算法。
当程序不再使用分配的内存时,操作系统需要回收这些内存以便再次分配。
常见的内存回收算法有首次适应算法、最佳适应算法和最坏适应算法。
首次适应算法从内存的起始位置开始查找,找到第一个满足需求的空闲区域进行分配;最佳适应算法则选择大小最接近需求的空闲区域进行分配;最坏适应算法选择最大的空闲区域进行分配。
为了更直观地理解内存管理的过程,我们通过编程实现了一些简单的内存管理算法。
在编程过程中,我们深刻体会到了数据结构和算法的重要性。
例如,使用链表或二叉树等数据结构来表示空闲内存区域,可以提高内存分配和回收的效率。
在实验中,我们还遇到了一些实际的问题和挑战。
比如,如何处理内存碎片的问题。
内存碎片是指内存中存在一些无法被有效利用的小空闲区域。
为了解决这个问题,我们采用了内存紧缩技术,将分散的空闲区域合并成较大的连续区域。
操作系统内存管理实验报告

操作系统内存管理实验报告操作系统内存管理实验报告引言:操作系统是计算机系统中的核心软件,负责管理计算机系统的各种资源,其中内存管理是操作系统的重要功能之一。
内存管理的目标是有效地管理计算机的内存资源,提高计算机系统的性能和可靠性。
本实验旨在通过设计和实现一个简单的内存管理系统,加深对操作系统内存管理原理的理解,并通过实践来加深对操作系统的认识。
一、实验背景计算机内存是计算机系统中的重要组成部分,它用于存储程序和数据。
在操作系统中,内存被划分为多个不同的区域,每个区域有不同的用途和访问权限。
内存管理的主要任务是为进程分配内存空间,并进行合理的管理和调度,以提高系统的性能和资源利用率。
二、实验目的本实验旨在通过设计和实现一个简单的内存管理系统,加深对操作系统内存管理原理的理解,并通过实践来加深对操作系统的认识。
具体目标包括:1. 设计和实现一个简单的内存分配算法,实现内存的动态分配和回收;2. 实现内存的地址映射机制,实现虚拟地址到物理地址的转换;3. 实现内存保护机制,确保进程之间的内存隔离和安全性;4. 实现内存的页面置换算法,提高内存的利用率和性能。
三、实验设计与实现1. 内存分配算法为了实现内存的动态分配和回收,我们设计了一个简单的内存分配算法。
该算法根据进程的内存需求和剩余内存空间的大小,选择合适的内存块进行分配。
当进程结束或释放内存时,将已使用的内存块标记为空闲状态,以便下次分配。
2. 地址映射机制为了实现虚拟地址到物理地址的转换,我们设计了一个地址映射机制。
该机制使用页表来记录虚拟地址与物理地址的映射关系。
当进程访问内存时,操作系统根据页表将虚拟地址转换为物理地址,并进行内存访问。
3. 内存保护机制为了确保进程之间的内存隔离和安全性,我们实现了一个简单的内存保护机制。
该机制通过设置每个进程的访问权限,限制进程对内存的读写操作。
只有获得相应权限的进程才能访问内存,确保进程之间的数据安全和隔离。
操作系统实验之内存管理实验报告

操作系统实验之内存管理实验报告一、实验目的内存管理是操作系统的核心功能之一,本次实验的主要目的是深入理解操作系统中内存管理的基本原理和机制,通过实际编程和模拟操作,掌握内存分配、回收、地址转换等关键技术,提高对操作系统内存管理的认识和实践能力。
二、实验环境本次实验在 Windows 操作系统下进行,使用 Visual Studio 作为编程环境,编程语言为 C++。
三、实验原理1、内存分配算法常见的内存分配算法有首次适应算法、最佳适应算法和最坏适应算法等。
首次适应算法从内存的起始位置开始查找,找到第一个满足需求的空闲分区进行分配;最佳适应算法则选择大小最接近需求的空闲分区;最坏适应算法选择最大的空闲分区进行分配。
2、内存回收算法当进程结束释放内存时,需要将其占用的内存区域回收至空闲分区链表。
回收过程中需要考虑相邻空闲分区的合并,以减少内存碎片。
3、地址转换在虚拟内存环境下,需要通过页表将逻辑地址转换为物理地址,以实现进程对内存的正确访问。
四、实验内容1、实现简单的内存分配和回收功能设计一个内存管理模块,能够根据指定的分配算法为进程分配内存,并在进程结束时回收内存。
通过模拟多个进程的内存请求和释放,观察内存的使用情况和变化。
2、实现地址转换功能构建一个简单的页式存储管理模型,模拟页表的建立和地址转换过程。
给定逻辑地址,能够正确计算出对应的物理地址。
五、实验步骤1、内存分配和回收功能实现定义内存分区的数据结构,包括起始地址、大小、使用状态等信息。
实现首次适应算法、最佳适应算法和最坏适应算法的函数。
创建空闲分区链表,初始化为整个内存空间。
模拟进程的内存请求,调用相应的分配算法进行内存分配,并更新空闲分区链表。
模拟进程结束,回收内存,处理相邻空闲分区的合并。
2、地址转换功能实现定义页表的数据结构,包括页号、页框号等信息。
给定页面大小和逻辑地址,计算页号和页内偏移。
通过页表查找页框号,结合页内偏移计算出物理地址。
实验四操作系统存储管理实验报告

实验四操作系统存储管理实验报告一、实验目的1.了解存储管理的概念和意义;2.掌握内存管理的基本原理和技术;3.了解常见的存储管理策略。
二、实验内容1.使用C/C++编程语言,设计并实现一个模拟内存管理的程序;2.实现内存的分配和回收算法,模拟内存的分配和释放过程;3.实现不同的内存管理策略,并通过实验比较它们的效果。
三、实验过程1.阅读相关的参考资料,了解存储管理的概念和意义,以及常用的内存管理策略;2.使用C/C++编程语言,设计并实现一个模拟内存管理的程序;3.设计并实现内存的分配和回收算法,模拟内存的分配和释放过程;4.设计并实现不同的内存管理策略,如首次适应算法、最佳适应算法和最坏适应算法;5.运行程序,测试不同的内存管理策略,比较它们的效果。
四、实验结果与分析在模拟的内存管理程序中,我们实现了三种常见的内存管理策略:首次适应算法、最佳适应算法和最坏适应算法。
这些策略在进行内存分配时,从空闲内存块列表中选择合适的内存块进行分配,并在内存回收时对已使用的内存块进行释放。
我们通过对不同策略的测试,得到了以下的实验结果。
首次适应算法:该算法会从空闲内存块列表中选择第一个满足要求的内存块进行分配。
该算法的优点是速度较快,但容易出现内存碎片的问题。
在实验中,我们发现该算法的分配速度相对较快,但在长时间运行后,可能会出现大量的内存碎片,导致无法分配较大的连续内存块。
最佳适应算法:该算法会遍历空闲内存块列表,选择大小最合适的内存块进行分配。
该算法的优点是能够更好地利用内存空间,减少内存碎片的发生。
在实验中,我们发现该算法的分配效果较好,但需要遍历整个空闲内存块列表,所以速度较慢。
最坏适应算法:该算法会选择大小最大的内存块进行分配。
该算法的优点是可以防止内存碎片的发生,但由于每次选择的内存块较大,可能会导致较多的内存浪费。
在实验中,我们发现该算法的分配效果较好,但会造成较多的内存浪费。
根据实验结果和分析,我们可以根据具体的需求选择合适的内存管理策略。
内存模拟管理实验报告

内存模拟管理实验报告引言内存管理是操作系统中重要的一部分,它负责管理计算机的内存资源,合理地分配和回收内存空间。
本实验旨在模拟内存管理过程,通过对内存分配、回收和置换算法的模拟实验,加深对内存管理的理解。
实验目的通过本实验,我们的目标是:1. 掌握内存分配、回收和置换算法的基本原理;2. 理解不同的内存管理算法的特点和适用场景;3. 学会使用模拟软件进行内存管理实验。
系统设计本实验采用基于模拟软件的方式进行,我们使用了一款常用的内存管理模拟软件——MemSim。
该软件可以模拟内存的分配、回收和置换算法,并根据实验结果生成相应的性能报告。
首先,我们在MemSim中设计了一个包含若干作业和内存分区的实验环境。
我们可以设置不同的作业大小和内存分区大小,以及各种不同的内存分配、回收和置换算法。
实验过程首先,我们设计了三种内存分配算法:首次适应算法(First Fit)、最佳适应算法(Best Fit)和最坏适应算法(Worst Fit)。
我们分别选择了一组作业和一组内存分区,并使用这三种算法进行内存分配测试。
我们观察到:- 首次适应算法往往会使碎片数量较少,但存在大量分散的小碎片;- 最佳适应算法分配的内存分区较为紧凑,但会导致外部碎片的增加;- 最坏适应算法可以很好地避免外部碎片的产生,但会导致更多的内部碎片。
接下来,我们针对内存回收算法进行了实验。
我们测试了随时间回收算法(FIFO)和优先级回收算法(Priority)两种算法,并选择了不同的作业和内存分区进行了测试。
我们观察到:- 随时间回收算法在作业的运行时间较长的情况下,表现较好;- 优先级回收算法可以根据作业的优先级来选择回收内存,适合于具有不同优先级的作业。
最后,我们还对内存置换算法进行了实验。
我们测试了最先进入先出算法(FIFO)和最不常使用算法(LFU)。
我们选择了一组较大的内存分区,并模拟了一组较大的作业。
通过实验,我们了解到:- 最先进入先出算法可以很好地保证作业的执行顺序,但会导致较高的缺页率;- 最不常使用算法可以合理地选择置换页面,但会增加算法的复杂度。
操作系统-内存分配与回收实验报告

操作系统-内存分配与回收实验报告本次实验是关于内存管理的实验,主要涉及内存分配和回收的操作。
本文将对实验过程和结果进行详细介绍。
1. 实验目的本次实验的主要目的是熟悉内存管理的基本原理和机制,掌握内存分配和回收的方法,并且实现一个简单的内存管理器。
2. 实验原理内存管理是操作系统的重要组成部分,主要负责管理计算机的内存资源,并且协调进程对内存的访问。
在计算机工作过程中,内存扮演着重要的角色,因此内存管理的效率和稳定性对计算机的性能和稳定性有着重要影响。
内存管理包括内存分配和回收两个方面。
内存分配是指为进程分配空闲的内存空间,以便程序可以执行;内存回收是指将已经使用完成的内存空间还回给系统,以便其他进程使用。
3. 实验步骤为了实现一个简单的内存管理器,我们需要进行以下步骤:(1)定义内存块结构体首先,我们需要定义一个内存块结构体,用于描述内存块的基本信息。
内存块结构体可以包含以下信息:· 内存块的起始地址· 内存块是否被分配下面是一个内存块结构体定义的示例代码:typedef struct mem_block{void *start_address; // 内存块的起始地址size_t size; // 内存块的大小bool is_allocated; // 内存块是否已经分配}MemBlock;(3)实现内存分配函数现在,我们可以开始实现内存分配函数了。
内存分配函数需要完成以下工作:· 在内存管理器中寻找一个合适的内存块void *mem_alloc(MemManager *manager, size_t size){MemBlock *p = manager->block_list;while(p){if(p->size >= size && !p->is_allocated){p->is_allocated = true;return p->start_address;}p = p->next;}return NULL;}· 找到该内存块所在的位置· 将该内存块标记为未分配状态4. 实验结果本次实验实现了一个简单的内存管理器,通过该内存管理器可以实现内存分配和回收的操作。
操作系统存储管理实验报告

操作系统存储管理实验报告操作系统存储管理实验报告引言:操作系统是计算机系统中的核心软件之一,它负责管理计算机硬件资源和提供用户与计算机之间的接口。
在操作系统中,存储管理是一个重要的子系统,它负责管理计算机的内存资源。
本实验旨在通过实际操作,深入了解操作系统的存储管理机制,并通过实验结果分析其性能和效果。
实验目的:1. 了解操作系统的存储管理机制;2. 掌握存储管理相关的概念和技术;3. 分析不同存储管理策略的优缺点;4. 通过实验验证不同策略的性能和效果。
实验内容:本次实验主要涉及以下几个方面的内容:1. 内存分配:在操作系统中,内存是计算机中的重要资源,它被划分为多个固定大小的块,每个块称为一页。
实验中,我们将学习不同的内存分配算法,如连续分配、离散分配和分页分配,并通过实验验证它们的性能和效果。
2. 内存回收:当某个进程不再需要使用内存时,操作系统需要回收该内存空间,以便其他进程使用。
实验中,我们将学习不同的内存回收算法,如最佳适应算法、最坏适应算法和首次适应算法,并通过实验比较它们的效果。
3. 虚拟内存管理:虚拟内存是一种扩展内存的技术,它将磁盘空间作为辅助存储器,将部分数据存储在磁盘上,以释放内存空间。
实验中,我们将学习虚拟内存的概念和原理,并通过实验验证其性能和效果。
实验结果与分析:通过实验,我们得到了不同存储管理策略的性能数据,并进行了分析。
在内存分配方面,连续分配在内存利用率方面表现较好,但容易产生外部碎片;离散分配能够充分利用内存空间,但需要额外的管理开销;分页分配能够灵活地分配内存,但会带来内部碎片。
在内存回收方面,最佳适应算法能够更好地利用内存空间,但需要较长的搜索时间;最坏适应算法能够减少外部碎片,但可能导致内存利用率较低;首次适应算法在搜索时间和内存利用率方面都有较好的平衡。
在虚拟内存管理方面,虚拟内存能够有效扩展内存空间,提高系统的性能和效率。
通过实验,我们发现虚拟内存的使用可以显著减少交换空间的开销,并提高系统的响应速度。
内存分配实验报告总结(3篇)

第1篇一、实验目的本次实验旨在让学生深入理解内存分配的基本原理和不同分配算法,通过实际操作,提高学生对内存管理技术的掌握程度。
通过本次实验,我们希望达到以下目标:1. 熟悉内存分配的基本概念和过程;2. 掌握常见的内存分配算法,如首次适应算法、最佳适应算法和最坏适应算法;3. 理解内存分配中的碎片问题,并尝试解决;4. 培养学生的动手实践能力和问题解决能力。
二、实验内容1. 实验环境:使用C语言编写程序,运行在Linux操作系统上。
2. 实验步骤:(1)首次适应算法:从内存空间的起始位置开始查找,找到第一个满足申请大小的空闲分区,将其分配给请求者。
(2)最佳适应算法:从所有空闲分区中查找一个最小的满足申请大小的分区,将其分配给请求者。
(3)最坏适应算法:从所有空闲分区中查找一个最大的满足申请大小的分区,将其分配给请求者。
(4)解决内存碎片问题:采用紧凑算法,将所有空闲分区合并成一个连续的大空间,从而减少内存碎片。
三、实验过程1. 编写程序实现内存分配算法,包括内存初始化、申请内存、释放内存等功能。
2. 对不同分配算法进行测试,观察分配效果,分析不同算法的优缺点。
3. 分析内存碎片问题,尝试解决方法,如紧凑算法。
四、实验结果与分析1. 首次适应算法:该算法简单易实现,但可能导致内存利用率较低,且可能产生较大的内存碎片。
2. 最佳适应算法:该算法分配效果较好,内存利用率较高,但分配速度较慢。
3. 最坏适应算法:该算法分配效果较差,内存利用率较低,但分配速度较快。
4. 紧凑算法:通过合并空闲分区,减少了内存碎片,提高了内存利用率。
五、实验体会1. 通过本次实验,我们深入了解了内存分配的基本原理和不同分配算法,掌握了常见内存分配算法的优缺点。
2. 实验过程中,我们遇到了各种问题,如内存碎片问题、算法实现问题等,通过查阅资料、讨论和尝试,最终解决了这些问题,提高了我们的问题解决能力。
3. 实验使我们认识到,内存管理是操作系统中的一个重要组成部分,对计算机性能和稳定性有着重要影响。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
西安邮电大学(计算机学院)课内实验报告实验名称:内存管理专业名称:软件工程班级:学生姓名:学号(8位):指导教师:实验日期:2018年12月04日一.实验目的及实验环境1、实验环境Linux centos7系统gcc编译器 gdb调试2、实验目的(1)掌握内存分配FF,BF,WF策略及实现的思路;(2)掌握内存回收过程及实现思路;(3)参考本程序思路,实现内存的申请、释放的管理程序,调试运行,总结程序设计中出现的问题并找出原因,写出实验报告。
二.实验内容(1)掌握内存分配FF,BF,WF策略及实现的思路;(2)掌握内存回收过程及实现思路;(3)参考本程序思路,实现内存的申请、释放的管理程序,调试运行,总结程序设计中出现的问题并找出原因,写出实验报告。
三.方案设计----------------------------------------------------------Memory management experiment1 - Set memory size (default=1024)2 - Select memory allocation algorithm3 - New process4 - kill a process5 - Display memory usage0 - Exit----------------------------------------------------------一、首次适应算法(First Fit):该算法从空闲分区链首开始查找,直至找到一个能满足其大小要求的空闲分区为止。
然后再按照作业的大小,从该分区中划出一块内存分配给请求者,余下的空闲分区仍留在空闲分区链中。
特点:该算法倾向于使用内存中低地址部分的空闲区,在高地址部分的空闲区很少被利用,从而保留了高地址部分的大空闲区。
显然为以后到达的大作业分配大的内存空间创造了条件。
缺点:低地址部分不断被划分,留下许多难以利用、很小的空闲区,而每次查找又都从低地址部分开始,会增加查找的开销。
二、循环首次适应算法(Next Fit):该算法是由首次适应算法演变而成的。
在为进程分配内存空间时,不再每次从链首开始查找,直至找到一个能满足要求的空闲分区,并从中划出一块来分给作业。
特点:使内存中的空闲分区分布的更为均匀,减少了查找时的系统开销。
缺点:缺乏大的空闲分区,从而导致不能装入大型作业。
三、最佳适应算法(Best Fit):该算法总是把既能满足要求,又是最小的空闲分区分配给作业。
为了加速查找,该算法要求将所有的空闲区按其大小排序后,以递增顺序形成一个空白链。
这样每次找到的第一个满足要求的空闲区,必然是最优的。
孤立地看,该算法似乎是最优的,但事实上并不一定。
因为每次分配后剩余的空间一定是最小的,在存储器中将留下许多难以利用的小空闲区。
同时每次分配后必须重新排序,这也带来了一定的开销。
特点:每次分配给文件的都是最合适该文件大小的分区。
缺点:内存中留下许多难以利用的小的空闲区。
四、最坏适应算法(Worst Fit):该算法按大小递减的顺序形成空闲区链,分配时直接从空闲区链的第一个空闲区中分配(不能满足需要则不分配)。
很显然,如果第一个空闲分区不能满足,那么再没有空闲分区能满足需要。
这种分配方法初看起来不合理,但它也有很强的直观吸引力:在大空闲区中放入程序后,剩下的空闲区常常也很大,于是还能装下一个较大的新程序。
最坏适应算法与最佳适应算法的排序正好相反,它的队列指针总是指向最大的空闲区,在进行分配时,总是从最大的空闲区开始查寻。
该算法克服了最佳适应算法留下的许多小的碎片的不足,但保留大的空闲区的可能性减小了,而且空闲区回收也和最佳适应算法一样复杂。
特点:给文件分配分区后剩下的空闲区不至于太小,产生碎片的几率最小,对中小型文件分配分区操作有利。
缺点:使存储器中缺乏大的空闲区,对大型文件的分区分配不利。
四.测试数据及运行结果五.总结本次实验使我受益匪浅,我不仅仅学习到了专业知识,更重要的是收获了经验与体会,这些使我一生受用不尽,记下来与大家共勉:1.多学多问,学会虚心求教。
在实验前内存管理的最佳适配算法不是很会计算,向班级同学请教后发现虽然思维上有点绕,但是并不是很难,很快就理解了原理思想。
2.善于思考,真正消化知识。
有知到识,永远不是那么简单的事,当你真正学会去思考时,他人的知识才能变成你自己的东西。
3.前人铺路,后人修路。
墨守陈规永远不会有新的建树,前人的道路固然重要,但是学会创新更为重要。
4.独立而不孤立。
学会独立思考,独立实验,但要记住与他人的交流也是十分重要的,实验和实验事永远不是你自己的。
5.认真仔细地做好实验纪录。
不要当你真正用到它时才知它的重要所在。
六.附录:源代码(电子版)#include <stdio.h>#include <stdlib.h>#include <ctype.h>#define PROCESS_NAME_LEN 32 //进程名长度#define MIN_SLICE 10 // 最小碎片大小#define DEFAULT_MEM_SIZE 1024 // 内存大小#define DEFAULT_MEM_START 0 // 起始地址//内存分配算法#define MA_FF 1#define MA_BF 2#define MA_WF 3//描述每一个空闲块的数据结构struct free_block_type{int size;int start_addr;struct free_block_type *next;};//每个进程分配到的内存块的描述struct allocated_block{int pid;int size;int start_addr;char process_name[PROCESS_NAME_LEN];struct allocated_block *next;};struct free_block_type *free_block;struct allocated_block *allocated_block_head = NULL;int mem_size=DEFAULT_MEM_SIZE; // 内存大小int ma_algorithm = MA_FF; // 当前分配算法static int pid = 0; // 初始pidint flag = 0;void display_menu();void do_exit();struct free_block_type *init_free_block(int mem_size); void set_mem_size();void set_algorithm();void new_process();void kill_process();void display_mem_usage();void rearrange(int choice);void rearrage_FF();void rearrage_BF();void rearrage_WF();int main(){char choice;pid=0;free_block = init_free_block(mem_size);display_menu();while(1){printf("Please choice: ");fflush(stdin);choice=getchar(); //获取用户输入switch(choice){case '1':set_mem_size(); //设置内存大小break;case '2':set_algorithm();//设置算法flag=1;break;case '3':new_process();//创建新进程flag=1;break;case '4':kill_process();//删除进程flag=1;break;case '5':display_mem_usage();//显示内存使用flag=1;break;case '0':do_exit();//释放链表并退出exit(0);default: break;}choice=getchar();}return 0;}//紧缩处理void free_memory_rearrage(int memory_reduce_size,int allocated_size) {struct free_block_type *p1,*p2;struct allocated_block *a1,*a2;if(memory_reduce_size!=0) //分配完还有小块空间{p1=free_block;p2=p1->next;p1->start_addr=0;p1->size=memory_reduce_size;p1->next=NULL;mem_size=memory_reduce_size;}else{p2=free_block;free_block=NULL;mem_size=0;}while(p2!=NULL)//释放节点{p1=p2;p2=p2->next;free(p1);}//allocated_block 重新修改链接a1=(struct allocated_block *)malloc(sizeof(struct allocated_block));a1->pid=pid;a1->size=allocated_size;a1->start_addr=memory_reduce_size; //已申请的开始地址,从memory_reduce_size开始sprintf(a1->process_name, "PROCESS-%02d", pid);a1->next=allocated_block_head;a2=allocated_block_head;allocated_block_head=a1;while(a2!=NULL){a2->start_addr=a1->start_addr+a1->size;a1=a2;a2=a2->next;}}int allocate_mem(struct allocated_block *ab){struct free_block_type *fbt, *pre;int request_size=ab->size;fbt = pre = free_block;while((pre!=NULL)&&(request_size>pre->size)){fbt=pre;pre=pre->next;}if(!pre){if(mem_size>=request_size){if(mem_size>=request_size+MIN_SLICE)free_memory_rearrage(mem_size-request_size,request_size);elsefree_memory_rearrage(0,mem_size);return 0;}elsereturn -1;}else{if((pre->size-request_size)>MIN_SLICE){pre->size=pre->size-request_size;ab->start_addr=pre->start_addr+pre->size;}else{if(pre==fbt){fbt=pre->next;free_block=fbt;}elsefbt->next=pre->next;ab->start_addr=pre->start_addr;ab->size=pre->size;free(pre);}mem_size-=ab->size;rearrange(ma_algorithm);return 1;}//创建新进程,分配内存void new_process(){struct allocated_block *ab;int size;int ret;if(mem_size==0){printf("the memory is all used!not to create new process,please release process!\n");return;}ab=(struct allocated_block *)malloc(sizeof(struct allocated_block));if(ab==NULL){printf("No Mem!\n");exit(1);}ab->next=NULL;pid++;sprintf(ab->process_name,"PROCESS-%02d",pid);//字符串格式化ab->pid=pid;while(1){printf("Please input the memory for %s(0-%d):",ab->process_name,mem_size);scanf("%d",&size);if(size<=mem_size&&size>0){ab->size=size;break;}printf("Please input again!\n");}ret=allocate_mem(ab);if((ret==1) &&(allocated_block_head == NULL))allocated_block_head=ab;else if(ret==1){ab->next=allocated_block_head;allocated_block_head=ab;}else if(ret==-1){printf("Allocation fail\n");free(ab);return;}printf("Allocation Success!\n");}//寻找已分配的内存块struct allocated_block *find_process(int pid){struct allocated_block *p;p=allocated_block_head;while(p){if(p->pid==pid)return p;p=p->next;}return p;}int free_mem(struct allocated_block *ab){int algorithm = ma_algorithm;struct free_block_type *fbt,*pre,*work;mem_size+=ab->size;fbt=(struct free_block_type *)malloc(sizeof(struct free_block_type));if(!fbt)return -1;fbt->size = ab->size;fbt->start_addr=ab->start_addr;fbt->next=NULL;rearrange(MA_FF);pre=NULL;work=free_block;while((work!=NULL)&&(fbt->start_addr>work->start_addr)){pre=work;work=work->next;}if(!pre)//插入开始位置{if (!work){free_block=fbt;}else{fbt->next=work;free_block=fbt;if(fbt->start_addr+fbt->size==work->start_addr){fbt->next=work->next;fbt->size=fbt->size+work->size;free(work);}}}else{if(!work){pre->next=fbt;if(fbt->start_addr==pre->start_addr+pre->size){pre->next=work;pre->size=fbt->size+pre->size;free(fbt);}}else{fbt->next=work;pre->next=fbt;if((fbt->start_addr==pre->start_addr+pre->size)&&(fbt->start_addr+fbt->size == work->start_addr)){pre->next=work->next;pre->size=pre->size+fbt->size+work->size;free(fbt);free(work);}else if(fbt->start_addr== pre->start_addr+pre->size){pre->next=work;pre->size=pre->size+fbt->size;free(fbt);}else if(work->start_addr==fbt->start_addr+fbt->size){fbt->next=work->next;fbt->size=work->size+fbt->size;free(work);}}}rearrange(ma_algorithm);return 1;}void dispose(struct allocated_block *free_ab){struct allocated_block *pre,*ab;if(free_ab==allocated_block_head){allocated_block_head=free_ab->next;free(free_ab);return ;}pre=allocated_block_head;ab=allocated_block_head->next;while(ab!=free_ab){pre=ab;ab=ab->next;}pre->next=ab->next;free(ab);}//终止进程,回收内存void kill_process(){struct allocated_block *ab;int pid;printf("Kill process,input pid = ");scanf("%d",&pid);ab=find_process(pid);if(ab!=NULL){free_mem(ab); //释放ab所表示的分配区dispose(ab); //释放ab数据结构节点printf("Kill Process Success!\n");return;}printf("Kill Process Failure!\n");}//显示当前内存的使用情况,包括空闲区的情况和已经分配的情况void display_mem_usage(){struct free_block_type *fbt=free_block;struct allocated_block *ab=allocated_block_head;/* 显示空闲区*/printf("----------------------------------------------------------\n");if(fbt==NULL)printf("success!\n");else{printf("Free Memory:\n");printf("%20s %20s\n", "\tstart_addr", " size");while(fbt!=NULL){printf("%20d %20d\n", fbt->start_addr, fbt->size);fbt=fbt->next;}}printf("----------------------------------------------------------\n");/* 显示已分配区*/if(ab==NULL)printf("尚未开始分配!\n");else{printf("\nUsed Memory:\n");printf("%10s %20s %10s %10s\n", "\tPID", " ProcessName", " start_addr ", "size");while(ab!=NULL){printf("%10d %20s %10d %10d\n", ab->pid, ab->process_name, ab->start_addr, ab->size);ab=ab->next;}}printf("----------------------------------------------------------\n");}//最佳适配算法void rearrage_BF(){struct free_block_type *p,*p1,*p2;struct free_block_type *last_flag;p1=(struct free_block_type *)malloc(sizeof(struct free_block_type));p1->next=free_block;free_block=p1;//不改变p1,free_block指向头p1if(free_block!=NULL){for (last_flag=NULL; last_flag!=free_block; last_flag=p){for (p=p1=free_block; p1->next!=NULL&&p1->next->next!=NULL&&p1->next->next!=last_flag; p1=p1->next){if (p1->next->size > p1->next->next->size){p2 = p1->next->next;p1->next->next = p2->next; //p2->next = p1->next;p1->next = p2;p = p1->next->next;}}}}p1 = free_block;free_block = free_block->next;free(p1);p1 = NULL;}//最差适配算法void rearrage_WF(){struct free_block_type *p,*p1,*p2;struct free_block_type *last_flag;p1=(struct free_block_type *)malloc(sizeof(struct free_block_type));p1->next=free_block;free_block=p1;//不改变p1,free_block指向头p1if(free_block!=NULL){for (last_flag=NULL; last_flag!=free_block; last_flag=p) {for (p=p1=free_block;p1->next!=NULL&&p1->next->next!=NULL&&p1->next->next!=last_flag; p1=p1->next){if (p1->next->size < p1->next->next->size){p2 = p1->next->next;p1->next->next = p2->next; //p2->next = p1->next;p1->next = p2;p = p1->next->next;}}}}p1 = free_block;free_block = free_block->next;free(p1);p1 = NULL;}//最快适配算法void rearrage_FF(){struct free_block_type *p,*p1,*p2;struct free_block_type *last_flag;p1=(struct free_block_type *)malloc(sizeof(struct free_block_type));p1->next=free_block;free_block=p1;//不改变p1,free_block指向头p1if(free_block!=NULL){for (last_flag=NULL; last_flag!=free_block; last_flag=p){for(p=p1=free_block;p1->next!=NULL&&p1->next->next!=NULL&&p1->next->next!=last_flag; p1=p1->next){if (p1->next->start_addr > p1->next->next->start_addr){p2 = p1->next->next;p1->next->next = p2->next;p2->next = p1->next;p1->next = p2;p = p1->next->next;}}}}p1 = free_block;free_block = free_block->next;free(p1);p1 = NULL;}//初始化空闲块struct free_block_type *init_free_block(int mem_size){struct free_block_type *fb;fb=(struct free_block_type *)malloc(sizeof(struct free_block_type));if(fb==NULL){printf("No Mem!\n");exit(1);}fb->size=mem_size;fb->start_addr=DEFAULT_MEM_START;fb->next=NULL;return fb;}void display_menu(){printf("\n");printf("----------------------------------------------------------\n");printf(" Memory management experiment \n");printf("1 - Set memory size (default=%d)\n", DEFAULT_MEM_SIZE);printf("2 - Select memory allocation algorithm\n");printf("3 - New process \n");printf("4 - kill a process \n");printf("5 - Display memory usage \n");printf("0 - Exit\n");printf("----------------------------------------------------------\n");}//选择分配算法void rearrange(int choice){switch(choice){case 1:rearrage_FF();break;case 2:rearrage_BF();break;case 3:rearrage_WF();break;}}//选择分配算法void set_algorithm(){int algorithm;printf("\t1 - First Fit\n");printf("\t2 - Best Fit \n");printf("\t3 - Worst Fit \n");scanf("%d", &algorithm);if(algorithm>=1 && algorithm <=3)ma_algorithm=algorithm;rearrange(ma_algorithm); //按指定算法重新排列空闲区链表}//设置内存大小void set_mem_size(){int size;if(flag!=0){printf("Cannot set memory size again or you have already started using the memory!\n");return;}printf("Total memory size =");scanf("%d", &size);if(size>0){mem_size = size;free_block->size = mem_size;}flag=1;}//退出void do_exit(){struct free_block_type *p1,*p2;struct allocated_block *a1,*a2;p1=free_block;if(p1!=NULL){p2=p1->next;for(;p2!=NULL;p1=p2,p2=p2->next){free(p1);}free(p1);}a1=allocated_block_head;if(a1!=NULL){a2=a1->next;for(;a2!=NULL;a1=a2,a2=a2->next){free(a1);}free(a1);}}。