操作系统实验之内存管理实验报告
内存管理实验
内存管理实验
一.实验目的
1.通过本次实验体会操作系统中内存的分配模式;
2.掌握内存分配的方法;
3.学会进程的建立,当一个进程被终止时内存是如何处理被释放块,并当内存不满足进程申请时是如何使用内存紧凑;
4.掌握内存回收过程及实现方法;
5.学会进行内存的申请释放和管理;
6.掌握内存分配FF,BF,WF策略及实现的思路;
二. 实验内容
1.编写程序实现采用可变分区方法管理内存。
2.在该实验中,采用可变分区方式完成对存储空间的管理。
3.设计用来记录主存使用情况的数据结构:已分区表和空闲分区表或链表。
4.在设计好的数据结构上设计一个主存分配算法。
5.在设计好的数据结构上设计一个主存回收算法。其中,若回收的分区有上邻空闲分区和(或)下邻空闲分区,要求合并为一个空闲分区登记在空闲分区表的一个表项里。
三.概要设计
1.功能模块图
2.各个模块详细的功能描述
主要数据结构:
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;
};
(1)Set memory size (default=1024):
这个模块是用来设置内存大小的,从键盘获取一个数字,并将它赋值给内存大小;若没有设置,则默认内存的大小为1024。
内存管理实验报告
内存管理实验报告
内存管理实验报告
引言
内存管理是计算机系统中非常重要的一部分,它负责管理计算机系统的内存资源,为程序的运行提供必要的支持。本次实验旨在探究不同的内存管理策略对计算机系统性能的影响,以及如何优化内存管理以提高系统效率。
一、实验背景
计算机系统中的内存是用于存储程序和数据的关键资源。在多道程序设计环境下,多个程序需要共享有限的内存资源,因此需要一种有效的内存管理策略来分配和回收内存空间。本次实验中,我们将研究并比较两种常见的内存管理策略:固定分区和动态分区。
二、实验过程
1. 固定分区
固定分区是将内存划分为固定大小的若干区域,每个区域可以容纳一个程序。在实验中,我们将内存划分为三个固定大小的区域,并将三个不同大小的程序加载到内存中进行测试。通过观察程序的运行情况和内存利用率,我们可以评估固定分区策略的优缺点。
2. 动态分区
动态分区是根据程序的大小动态地分配内存空间。在实验中,我们将使用首次适应算法来实现动态分区。首次适应算法将按照程序的大小从低地址开始查找可以容纳该程序的空闲分区,并分配给程序使用。通过观察动态分区策略下的内存利用率和碎片情况,我们可以评估该策略的优劣。
三、实验结果
1. 固定分区
在固定分区策略下,我们观察到每个程序都能够顺利运行,但是内存利用率较低。由于每个程序都需要占用一个固定大小的分区,当程序大小与分区大小不
匹配时,会出现内存浪费的情况。此外,固定分区策略也存在无法分配较大程
序的问题。
2. 动态分区
在动态分区策略下,我们观察到内存利用率较高,碎片情况也较少。由于动态
操作系统:实验4 存储管理(实验报告)
欢迎共阅
班级: 姓名: 学号:
5) 当前计算机的实际内存大小为:
______________________________________ 分析程序4-1,请回答问题:
1) 理论上每个Windows 应用程序可以独占的最大存储空间是:_____________
2) 程序中,用于检查系统中虚拟内存特性的API 函数是:__________________ 4.2 Windows 虚拟内存
本节实验的目的是:
实验
4
存储管理
1) 通过实验了解Windows内存的使用,学习如何在应用程序中管理内存,体会Windows应用程序内存的简单性和自我防护能力。
2) 学习检查虚拟内存空间或对其进行操作;
3) 了解Windows的内存结构和虚拟内存的管理,进而了解进程堆和Windows为使用内存而提供的一些扩展功能。
1. 工具/准备工作
在开始本节实验之前,请回顾教材的相关内容。
需要准备一台运行Windows系统的计算机,且安装了C/C++编译器。
2. 实验内容与步骤
将系统当前的保留区(reserved)虚拟地址空间填入表4.3中。
表4.3 实验记录
2) 根据运行结果,请简单描述程序运行的流程:
_________________________________________________________________
___
_____________________________________________________________________
的程序段,该段程序试图通过VirtualAlloc()函数,然后利用物理备用内存将整个块分配到虚拟内存空间的任何位置。这种技术只对拥有1GB以上的RAM且都有换页文件的计算机可行。从运行结果看,这种技术成功了吗?_________________。
操作系统课程设计报告-内存管理
设计1 题目内存管理
一、问题描述与分析
1、虚拟存储技术
为了扩充内存容量,同时避免增加系统成本以及机器自身的限制,因此采取从逻辑上扩充内存容量的方法,即虚拟存储技术。
2、解决方法
程序运行之前,仅将当前需要运行的少数页面先装入内存便可继续运行,其余部分暂存在盘上。程序运行时,如果他所要访问的页面已调入内存,便可继续执行下去;但如果程序所要访问的页面尚未调入内存,此时程序应利用OS提供的请求调页功能,将他们调入内存,以是进程能继续执行下去。如果此时内存已满,无法再装入新的页面,则还需在利用页面的置换功能,将内存中暂时不用的页面调至盘上,腾出足够的内存空间,再将要访问的页面调入内存,使程序继续执行下去。
二、设计要求和目的
1、设计目的
在本课程设计中,通过对“请求分页存储管理方式”中“页面置换算法”的模拟实现,进一步了解虚拟存储的特点,掌握请求分页存储管理的页面置换算法、
2、设计要求
模拟页面置换设计中,分别利用最佳置换算法(OPT)、最近最久未使用置换算法(LUR)、先进先出置换算法(FIFO)。需要提供一定数量的页面序列,这些页面序列为了减少人工输入的麻烦,而采用随机产生。在执行程序时,只要改变页面的大小,就可以达到不用的页面序列。同时,记录页面置换次数,最后计算并输出OPT、LUR、FIFO 算法在不用页面数量下的缺页率。
三、背景知识
在学习了操作系统这本书之后,了解到:
为了扩充内存容量,采取虚拟存储技术,其中的核心思想就是从逻辑上扩充内存容量。所谓虚拟存储器,是指具有请求调入功能和置换功能,能从逻辑上对内存容量加以扩充的一种存储器系统。
内存管理实验
Linux页表
所以页目录项和页表一共只需要20位,占用物理地址
的12~31位,还有12位用作标志位,可以用于控制或 其他目的 。 存在位:表明项对应的物理页是否加载到主存。 读/写位:表明该页是只读还是可写,起保护作用。 用户/系统位:选择用户级访问许可或内核级访问许可。 访问位:表明该页是否被访问过。 脏标志位:表明该页是否被写过。 直写位:置位表明页面cache采用“直写”(既写主存 也写缓存),否则回写缓存。
Linux页面管理
在Linux中,主存的分配与管理以页框为单位,一个页
框的大小为4KB。 内核需要对每个页框的状态进行管理,为每个页框分 配一个struct page,该结构记录页框的使用状态。 使用bitmap对页框进行管理。共11个 。第0组的每一 个表示单个页框的使用情况,为1表示该页框正在使用, 为0表示空闲;第1组的每一位表示相邻的两个页框的 使用情况,如果其中有一个位置1,表示对应的两个页 框正在使用,以此类推;第i组中的每一位表示相邻的 2i个页框被使用的情况。
添加系统调用。在linux-2.6.18/kernel/sys.c文
件的最后添加以下内容。 asmlinkage long sys_global_pf(){ return global_pf; } asmlinkage long sys_pf(){ return current->pf; }
操作系统实验四存储管理实验(1)
操作系统课程实验
年级2012 级
专业计算机科学与技术(应用型)姓名
学号
指导教师
日期
实验四、存储管理实验
一、关键问题
1、实验目的
理解内存分配和回收原理。
2、实验环境
Ubuntu 8.0或者以上,Eclipse集成开发环境
3、实验内容
3.1 在控制台内观察Linux内存分配情况
3.2存储管理模拟实验要求:
写一动态分区管理程序,使其内存分配采用最佳适应分配算法。
老师所给的例子为内存分配算法是最先适应分配算法的系统模拟动态分区管理方案,而问题的关键就是如何把最先适应分配算法改为最佳适应分配算法。
二、设计修改思路
struct freearea* min1=NULL;//定义了一个符合条件的最小空白块链表首先我们在分配内存函数中需要定义一个记录符合条件的最小空白块的链表结构指针,对当前空闲分区链进行遍历,找到符合条件的最小空白块并记录。
系统为作业分配内存时,根据指针freep查找空闲分区链。当找到一块可以满足请求中最小的空闲分区时便分配。当空间被分配后剩余的空间大于规定的碎片,则形成一个较小的空闲分区留在空闲链中。
三、实现修改的关键代码
//有两个链:空白块链及作业链.空白块链描述空白块,链首指针freep,初始为一大块空白块.
//作业链按从高址到低址的顺序链接,链首指针jobp
//为作业jn分配jl大小内存,起始地址为ja
void ffallocation(int jl,char jn[10],int* ja)
{
struct mat* jp=NULL;//作业链当前节点
struct mat* jp2=NULL;//新的作业节点
操作系统实验二-内存管理
操作系统实验二-内存
管理
-CAL-FENGHAI-(2020YEAR-YICAI)_JINGBIAN
洛阳理工学院实验报告
原始数据纪录:
输入数据:
T1时刻 a 80, b 60, c 100,输出空闲分区
T2时刻,进程结束,释放进程b,输出空闲分区
T3时刻输入d 50后,输出空闲分区
T4时刻进程结束,释放a, c,输出空闲分区
T5时刻进程结束,释放d,输出空闲分区
输出数据:
实验总结:本次实验还是比较难的,操作系统这本书上也没有什么例子供参考,所以只能靠自己的理解以及平时上课的积累才能完成此次实验。这次实验让我们掌握了内存的分配,回收算法的思想,对内存管理有了进一步的认识。总的来说,实验的意义就是为了进一步对C语言的认识与理解,根据不同的题目,能够很快想出相应的思路。
操作系统实践报告
操作系统实践报告
引言:
现代计算机已经成为人们生活和工作中不可或缺的一部分。而计算机的核心就是操作系统。操作系统是一种控制和管理计算机硬件和软件资源的软件系统。操作系统为我们提供了方便的用户界面和高效的资源管理,使得计算机能够更加稳定和高效地运行。本报告将重点介绍操作系统的实践,包括内存管理、文件系统、进程管理等方面的内容。通过实践操作系统,我们将更好地理解和掌握计算机系统的工作原理。
一、内存管理
内存管理是操作系统中最核心的部分之一。在操作系统实践中,我们学习了常见的内存管理技术,如连续内存分配和非连续内存分配。连续内存分配是将内存划分为若干连续的空闲区域,并根据进程的需要将其分配给进程。而非连续内存分配则是将内存分为若干不连续的块,进程在运行时可以随时申请或释放内存。通过实践内存管理,我们深入了解了进程的内存空间划分和管理方式,为进一步优化计算机系统性能提供了基础。
二、文件系统
文件系统是操作系统中用于管理文件和目录的一种机制。在实践操作系统中,我们学习了常见的文件系统类型,如FAT、NTFS等。文件系统不仅负责文件和目录的创建、读写和删除,还需要处理文件的权
限控制和数据的存储方式。通过实践文件系统,我们掌握了文件系统的操作和管理技巧,提高了计算机系统的文件存储和访问效率。
三、进程管理
进程管理是操作系统中最重要的功能之一。在操作系统实践中,我们学习了进程的创建、调度和终止等操作。进程是计算机系统中正在执行的程序的实例。通过实践进程管理,我们深入了解了进程的运行机制和调度算法。合理的进程管理能够提高计算机系统的并发性和响应速度,为用户提供更好的使用体验。
内存管理实验
内存管理实验
实验目的:
用高级语言编写和调试一个内存管理程序,以加深对内存的分配、回收以及空闲块管理的理解。
实验内容:
编写一个模拟程序,完成内存可变分区分配的模拟,要求采用最佳适应法、最坏适应法、首次适应法或下次适应法之一。
实验具体包括:首先确定分配内存块管理的数据结构、空闲块的数据结构,然后完成内存分配、内存回收、空闲块管理等程序代码;最后编写模拟分配和回收过程的主函数,上机实验并取得结果数据。
程序流程图:
结果及分析:
给出至少两组模拟的输入和输出结果数据(包括已分配情况、空闲块情况),分析算法的模拟情况,以及自己的收获。
<一>.第一组数据:
输入: 初始化内存空间大小内存首址作业大小作业名称
100 1 35 1 输出: ------------已分配表-----------
分区号始地址作业名称作业大小状态
1 1 1 35 1
------------空闲表--------------
分区号始地址剩余大小状态
2 36 65 0
<二>.第二组数据:
输入: 作业名称作业大小
220
输出: -------------已分配表------------
分区号始地址作业名称作业大小状态
1 1 1 35 1
2 36 2 20 1
--------------空闲表--------------
分区号始地址剩余大小状态
2 56 45 0
源程序:
源程序包括两部分:
<一>.头文件:
//-----------------------------------------------------------------// //结构体定义
操作系统 实验二 windows内存管理实验
实验二windows内存管理实验
一.问题描述
内存管理是操作系统的主要任务之一,地址转换是其中的重要内容,本实验主要研究windows的地址转译过程。
通过这次实验了解windows内存管理策略及基本的数据结构,理解windows的地址过程。通过任意给出一个虚拟地址,可以从windbg 观察相关数据并找到其物理地址。
二.Windows地址转译过程原理
1.Windows内存管理器:
Windows的内存管理器主要由Windows执行体中的虚存管理程序负责,并由环境子系统负责与具体API相关的一些用户态特征的实现。
有两个任务:地主转换;变换。
2.Windows内存管理策略:
Windows采用页式虚拟存储管理技术管理内存,页面是硬件级别上的最小保护单位。
根据硬件体系结构的不同,页面尺寸被分为两种
大页面:4KB
小页面:4MB
通常的PC机,一般都为小页面。
3、Windows虚拟地址空间布局
Windows系统的虚拟地址空间布局,默认情况下,32位的windows 系统中每个用户进程可以占有2GB的私有地址空间,操作系统占有
另外的2GB。如下:
4、X86虚拟地址转译
X86虚拟地址转译是指进程的虚拟地址空间映射到实际物理页面的过程,Windows系统中地址转译过程如下:
关键的数据结构如下:
页目录:每个进程都有一个页目录,进程页目录的地址被保存在内核地址块(KPROCESS)中。在windows中,它被映射到虚拟地址0xC0300000。由cr3可以知道该进程页目录的位置。
页目录由页表项构成。
页表:进程的页目录指向页表。每个页表只占一个页面,含有1024个PTE,一个PTE为4字节,包含两个主域:PFN,即为数据所在的物理页面的页面帧编号。
操作系统实验报告-存储管理实验
存储管理实验
一.实验目的及要求:
通过编写和调试存储管理的模拟程序以加深对存储管理方案的理解。熟悉虚存管理的各种页面淘汰算法。
通过编写和调试地址转换过程的模拟程序以加强对地址转换过程的了解。
二. 实验环境:
操作系统:Windows XP
编译环境:Visual C++ 6.0
三.算法描述
由于在单道批处理系统中,作业一投入运行,它就占有计算机的一切资源直到作业完成为止,因此调度作业时不必考虑它所需要的资源是否得到满足,它所占用的 CPU时限等因素。
作业调度算法:采用先来先服务(FCFS)调度算法,即按作业提交的先后次序进行调度。总是首先调度在系统中等待时间最长的作业。
每个作业由一个作业控制块JCB表示,JCB可以包含如下信息:作业名、提交时间、所需的运行时间、所需的资源、作业状态、链指针等等。
作业的状态可以是等待W(Wait)、运行R(Run)和完成F(Finish)三种状态之一。每个作业的最初状态总是等待W。
各个等待的作业按照提交时刻的先后次序排队,总是首先调度等待队列中队首的作业。
每个作业完成后要打印该作业的开始运行时刻、完成时刻、周转时间和带权周转时间,这一组作业完成后要计算并打印这组作业的平均周转时间、带权平均周转时间。
四. 实验步骤:
核心源码:
void acceptment2(RECT *head,RECT *back1)
{
RECT *before,*after;
int insert ;
insert=0;
before=head;
after=head->next;
if(head->next==NULL) /*如果可利用区表为空*/
操作系统实验报告存储管理实验
操作系统实验报告:存储管理实验
摘要:
本次操作系统实验旨在深入了解操作系统存储管理的原理和工作方式。通过实验,我们能够加深对于操作系统存储管理技术的理解,并掌握相应的实践操作能力。本文将详细介绍本次实验的设计方案、实验过程、实验结果以及实验中所遇到的问题和解决方案。通过本次实验,我们深入了解了存储管理的各种算法和策略,并对操作系统的存储管理有了更全面的认识。
1. 引言
随着计算机应用的发展,存储管理成为操作系统设计中的重要组成部分。合理且高效的存储管理技术和算法能够有效地提升操作系统的性能和资源利用率。本次实验将主要围绕存储管理相关的算法和策略展开,包括分区分配、页面置换以及内存管理等方面,实践运用并测试这些算法和策略的性能以及效果。
2. 实验设计与方案
本次实验需要使用一台计算机和相应的操作系统实验环境。我们将通过模拟操作系统的存储管理机制,应用不同的算法来分配和管理内存空间,并通过实验数据对比和性能测试来分析评估不同算法和策略的优劣势。
2.1 分区分配
首先,我们将探讨不同的分区分配算法。常见的分区分配算法有固定式分区分配、可变式分区分配和最佳适应式分区分配。我们将依次实现这三种算法,并通过实验观察和数据对比来比较它们的性能差异。
2.2 页面置换
接下来,我们将关注页面置换算法。实验中使用的页面置换算法有先进先出(FIFO)、最近最久未使用(LRU)和最佳置换算法(OPT)。我们将实现这些算法,并通过仿真实验来测试它们的性能。通过比较不同算法的命中率和访问时间,我们可以评估并选择最适合实际应用场景的算法。
操作系统实验四存储管理
集美大学计算机工程学院实验报告
课程名称:操作系统班级:计算1014
指导教师:李传目姓名:林升仁
实验项目编号:实验四学号:2010810116
实验项目名称:存储管理实验成绩:
一、目的
理解动态异长存储分区资源管理,掌握所需数据结构和管理程序,了解各种存储分配算法的优点和缺点。
二、实验内容与设计思想
分析UNIX最先适应(FF)存储分配算法,即map数据结构、存储分配函数malloc()和存储释放函数mfree(),找出与算法有关的成分。
修改上述与算法有关的成分,使其分别体现BF分配原则和WF分配原则。三、实验使用环境
Red Hat Enterprise linux5
四、实验结果
源程序:
/******************************************************************** *******
* Copyright (C) 2004 by root
*
* root@simplymepis
*
*
*
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as pub lished by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. * *
操作系统实验报告11-系统内存使用统计
《操作系统》实验报告
实验序号:11实验项目名称:系统内存使用统计
/ * Allocate space for a pat name * /
string=malloc( MAX PATH); //分配内存空间
if(string==NULL)
prinf(“Insufficient memory available\n”);
else
{
printf(“Memory space allocated for path name\n”):
free(string);
printf(“Memory free \n”);
}
3、实验要求
能正确使用系统函数GlobalMemoryStatus()和数据结构MEMORYSTATUS 了解系统内存和虚拟存储空间使用情况,会使用VirtualAlloc()函数VirtualFree()函数分配和释放虚拟存储空间。
4、实验指导
在Microsoft Visual C++6.0环境下选择Win32 Console Application 建立一个控制台工程文件,由于内存分配、释放及系统存储空间使用情况函数均是Microsoft Windows操作系统的系统调用,因此需要选择An application that supports MFC。
四、程序调试(结果及分析)
运行代码截图如下图1-1:
图1-1 运行结果截图如下图1-2:
图1-2
五、总结与体会
总结、体会
该实验是实现进程间的信息传递的,是由客户端与服务端之间进行通信的。其中要实现客户端与服务端之间的通信,需要同时打开客户端与服务端的窗口,在客户端的编辑框输入信息,点击发送信息,则信息发送到服务端,点击确定则关闭客户端(服务端)。
操作系统实验 内存管理
操作系统实验报告
计算机学院(院、系)网络工程专业082 班组课
学号20 姓名区德智实验日期教师评定
实验四内存管理
一、实验目的
通过实验使学生了解可变式分区管理使用的主要数据结构,分配、回收的主要技术,了解最优分配、最坏分配、最先分配等分配算法。基本能达到下列具体的目标:
1、掌握初步进程在内存中的映像所需要的内存需求。
2、内存的最先分配算法首先实现,再逐步完成最优和最坏的分配算法。
二、实验内容
1、在进程管理的基础上实现内存分配。
2、运用java实现整体的布局与分配内存时的动态图画显示。
三、实验步骤
1.构建一个Process的对象类,每分配一次内存就实例化一个对象。这对象包含分配内存的名字,内存大小(byte),绘画的起点像素,绘画的终点像素。
主要代码:
public class Process {
private String name;
private int size;
private int beginPx;
private int endPx;
public int getBeginPx() {
return beginPx;
}
public void setBeginPx(int beginPx) {
this.beginPx = beginPx;
}
public int getEndPx() {
return endPx;
}
public void setEndPx(int endPx) {
this.endPx = endPx;
}
public String getName() {
return name;
实验报告 内存的认识
实验报告内存的认识
1. 引言
内存是计算机系统中非常重要的组成部分之一。它用于存储和访问数据和程序,对计算机系统的性能和功能起着至关重要的作用。在本次实验中,我们将深入研究内存的不同类型、工作原理和性能影响因素,并通过实际操作和测试来加深对内存的认识。
2. 内存的类型
在计算机系统中,主要有两种类型的内存,分别是随机存取内存(Random Access Memory,RAM)和只读存储器(Read-Only Memory,ROM)。RAM 是一种易失性存储器,可以读写数据,它的内容在断电时会消失;而ROM是一种不易被修改的存储器,用于存储不变的信息,例如计算机的BIOS。
在RAM内存中,又可以分为静态RAM(Static RAM,SRAM)和动态RAM (Dynamic RAM,DRAM)。SRAM使用触发器来存储数据,并且不需要定期刷新;DRAM使用电容来存储数据,需要定期刷新以保持数据的有效性。由于SRAM的工作原理复杂,造成成本较高,所以在现代计算机中主要使用DRAM。
3. 内存的工作原理
内存是由一系列存储单元组成的,每个存储单元可以存储一个位(0或1)。这些存储单元被组织成一个二维的矩阵,每个存储单元都有一个唯一的地址,用于访问其存储的数据。
在计算机执行程序时,需要从内存中读取数据和指令。CPU发送读取请求到内存控制器,内存控制器根据请求的地址找到对应的存储单元,并将其内容发送给CPU。而当需要将数据写入内存时,CPU发送写入请求到内存控制器,内存控
制器将数据写入到对应的地址中。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
所谓分区,是把内存分为一些大小相等或不等的分区,除操作系统占用一 个分区外,其余分区用来存放进程的程序和数据。本次实验中才用动态分区 法,也就是在作业的处理过程中划分内存的区域,根据需要确定大小。
动态分区的分配算法:首先从可用表/自由链中找到一个足以容纳该作业的 可用空白区,如果这个空白区比需求大,则将它分为两个部分,一部分成为已 分配区,剩下部分仍为空白区。最后修改可用表或自由链,并回送一个所分配 区的序号或该分区的起始地址。
五、测试用例及运行结果、分析
程序最初要对内存空间进行分配,设置内存空间的大小。初始设置内存总 大小为 100 个单位,若不手动设置,则默认为 256 个单位。
此为最初插入 7 个进程后的内存状态,此时内存空间无空余块可用。
通过进程终止操作将 pid 为 1、3、5、7 四个进程终止,则其原占用的内存 空间释放,变为空闲的内存空间。
学生学号
实验课成绩
武汉理工大学
学生实验报告书
实验课程名称 开课学院 指导老师姓名 学生姓名 学生专业班级
计算机操作系统 计算机科学与技术学院
2016 — 2017 学年 第一学期
实验三 内存管理
一、设计目的、功能与要求
1、实验目的
掌握内存管理的相关内容,对内存的分配和回收有深入的理解。
2、实现功能
通过输入对应 pid 完成对相应进程的终止功能,将其内存空间设置为空闲分 区,若与已有空闲分区的地址连续则进行空闲分区的合并。 2.5 最先适应法
对空闲分区按照首地址的大小从小到大进行排序。 2.6 最佳适应法
对空闲分区按照内存块的大小从小到大排序。 2.7 最坏适应法
对空闲分区按照内存块的大小从大到小排序。
该模块完成在内存空间中申请一块空间供进程使用的功能,通过输入进程大 小系统先查看内存空间中是否有足够的空间供其进行申请,若无,显示分配失败 相应信息,否则在空闲内存分区块中选择最先的一块进行分配,若内存空间不足 则继续向下查找,空闲内存分区的顺序通过三种算法给出。分配内存时,要指定 进程的首地址和大小,并对内存空闲分区的大小做相应的修改。 2.4 进程终止模块
最先适应法:按分区的起始地址的递增次序,从头查找,找到符合要求的 第一个分区。
最佳适应法:按照分区大小的递增次序,查找,找到符合要求的第一个分
区。
最坏适应法:按分区大小的递减次序,从头查找,找到符合要求的第一个
分区。
三、数据结构及功能设计
1、数据结构
定义空闲Baidu Nhomakorabea区结构体,用来保存内存中空闲分区的情况。其中 size 属性表示 空闲分区的大小,start_addr 表示空闲分区首地址,next 指针指向下一个空闲分 区。
况。其中 pid 作为该被分配分区的编号,用于在释放该内存空间时便于查找。
size 表示分区的大小,start_addr 表示分区的起始地址,process_name 存放进
程名称,next 指针指向下一个分区。
//已分配分区的结构体 typedef struct Allocate_Block {
int pid; int size; int start_addr; char process_name[PROCESS_NAME_LEN]; struct Allocate_Block *next; } Allocate_Block;
Free_Block *temp, *p = NULL; Free_Block *head = NULL; int current_min_addr;
if (free_block) {
temp = free_block; current_min_addr = free_block->start_addr; while (temp->next != NULL) {
current_min_addr = temp->next->start_addr; p = temp; } temp = temp->next; } if (p->next != head->next) { temp = p->next; p->next = p->next->next; temp->next = head->next;
printf("分配失败\n"); pid--; free(ab); return -1; } return 3; } //选择杀死一个进程 void Kill() { struct Allocate_Block *ab; int pid; printf("终结进程, pid="); scanf("%d", &pid); ab = find_process(pid); if (ab != NULL) { Free_Mem(ab); dispose(ab); } }
head->next = temp; } head = head->next; temp = head->next; p = head; } } return ; } //创建一个新的进程 int New_Job() { struct Allocate_Block *ab; int size; int ret; ab = (struct Allocate_Block *)malloc(sizeof(struct Allocate_Block)); if (!ab) exit(-5); ab->next = NULL; pid++; sprintf(ab->process_name, "进程-%02d", pid); ab->pid = pid; printf("Mem for %s:", ab->process_name); printf(" 进程大小 : "); scanf("%d", &size); if (size > 0) {
尽可能的利用了低地址空间,从而保证高地址有较大的空闲区来防止要求 内存较多的进程或作业
该算法的分配和释放的时间性能较好 最佳适应法:
利用最接近于所要求的内存大小。若存储空间中有正好等于所要求大小的 空白区,则必然被选中。
由于空白区一般不可能正好和要求的相等,这往往使剩下的空白区都比较 小,形成碎片。
if (temp->next->start_addr < current_min_addr) {
current_min_addr = temp->next->start_addr; p = temp; } temp = temp->next; } if (p != NULL) { temp = p->next; p->next = p->next->next; temp->next = free_block; free_block = temp; } head = free_block; p = head; temp = head->next; while (head->next != NULL) { current_min_addr = head->next->start_addr; while (temp->next != NULL) { if (temp->next->start_addr < current_min_addr) {
不足之处在于,本次实验中没有实现最坏适应法,分析可能是在在排序的 过程中链表的指针出现了错误,在开始调试阶段只对单一算法进行了调试从而 忽略了这个问题的存在,直到编写本报告的时候才发现这个问题。这种问题实 属不该,可以通过完善的测试避免,以后要避免这种问题。
本次实验通过对于内存管理的动态分区式算法实现,对这内存管理的理解 更加深刻了,也通过实验结果的比较,掌握了动态分区式内存管理中三种算法 在不同进程情况下的优劣情况。通过这样一个一个小实验,也一定程度上锻炼 了我的编程能力。
//空闲分区 typedef struct Free_Block {
int size; int start_addr; struct Free_Block *next; } Free_Block; Free_Block *free_block;
定义已分配的内存空间的结构体,用来保存已经被进程占用了内存空间的情
采用最先适应法新建一个大小为 16 的进程,结果如上图所示。
采用最佳适应法插入一个大小为 7 的进程后内存的情况。 分析:此处对于内存管理的模拟实现完成的较为成功,可以采用最先适应法和 最佳适应法两种算法进行进程的新建,能够正确计算对应的首地址,与内存空 间。同时对于空闲内存空间也可以做出正确的合并操作。最初内存空间为空, 可以通过新建进程和终止进程两种操作来完成不连续内存空闲空间的建立。 三种算法的比较: 最先适应法:
2、模块说明
2.1 初始化模块
对内存空间进行初始化,初始情况内存空间为空,但是要设置内存的最大容
量,该内存空间的首地址,以便之后新建进程的过程中使用。当空闲分区初始化
失败时,要进行相应的提示。 2.2 菜单显示模块
菜单包括,设置内存大小,选择分配算法,新建进程,终止进程,显示当前 内存使用情况,退出六个选项。各个选项完成其名对应的功能,在程序中通过相 应的函数实现对应的功能。 2.3 新建进程模块
四、开发工具及主要源代码
1、开发工具
sublimeText3 文本编辑器,采用 g++编译。
2、主要源码
这里只给出最先适应算法的源码,由于三种算法均为对链表进行排序,只是 排序依据的属性不同,结构上几乎相似,在此就不做赘述 /*最先适应算法,按地址的大小由小到达排序*/
void rFirst_Fit() {
模拟实现内存管理机制
3、具体要求 任选一种计算机高级语言编程实现 选择一种内存管理方案:动态分区式、请求页式、段式、段页式
等 能够输入给定的内存大小,进程的个数,每个进程所需内存空间
的大小等 能够选择分配、回收操作 内购显示进程在内存的储存地址、大小等 显示每次完成内存分配或回收后内存空间的使用情况
寻找一个较大的空白区时,要花费较多的时间;回收一个分区时,为了把 它插入到空白区链中合适的位置上开销较大。 最坏适应法:
避免了空闲区越分越小留下碎片的问题,即每次分配时总是将最大的空闲 区切去一部分分配给请求者(使分配后的剩余部分可能仍是一个较大的空闲 区,仍能进行再分配)。
六、自我评价与总结
在本次实验中,通过运用 c++高级程序设计语言,与操作系统的理论结合起 来,验证了动态分区式内存管理中的最先适应法和最优适应法的整体过程,和 其对于内存管理的优缺点。采用链表的形式进行操作也使得过程较为方便,便 于在分配和回收内存空间之后将空闲区链接起来。另外程序在终端和人的交互 良好,通过菜单显示相应操作提示人进行操作。
ab->size = size; } ret = Alloc_Mem(ab); if ((ret == 1) && (Allocate_Block_head == NULL)) {
Allocate_Block_head = ab; return 1; }
else if (ret == 1) {
ab->next = Allocate_Block_head; Allocate_Block_head = ab; return 2; } else if (ret == -1) {