操作系统实验四报告-主存空间分配和回收(含源码)分析

合集下载

计算机操作系统动态分区存储管理方式下的内存空间的分配与回收实验报告

计算机操作系统动态分区存储管理方式下的内存空间的分配与回收实验报告

计算机操作系统

实验报告

实验二

实验题目:存储器管理

系别:计算机科学与技术系

班级:

姓名:

学号:2

一、实验目的

深入理解动态分区存储管理方式下的内存空间的分配与回收。

二、实验内容

编写程序完成动态分区存储管理方式下的内存分配和回收的实现。具体内容包括:

确定用来管理内存当前使用情况的数据结构;

采用首次适应算法完成内存空间的分配;

分情况对作业进行回收;

编写主函数对所做工作进行测试。

三、实验原理

分配:动态分区存储管理方式把内存除OS占用区域外的空间看作一个大的空闲区。当作业要求装入内存时,根据作业需要内存空间的大小查询内存中各个空闲区,当从内存中找到一个大于或等于该作业大小的内存空闲区时,选择其中一个空闲区,按作业要求划出一个分区装入该作业。

回收:作业执行完后,它所占用的内存空间被收回,成为一个空闲区。如果该空闲区的相邻分区也是空闲区,则需要将相邻空闲区合并成一个空闲区。

四、实验方法

实现动态分区的分配与回收,主要考虑三个问题:

第一、设计记录内存使用情况的数据表格,用来记录空闲区和作业占用的区域(利用结构体类型数组来保存数据);

第二、在设计的数据表格基础上设计内存分配算法(采用首次适应算法找合适的分区(对空闲分区表进行排序),分配时要考虑碎片问题);

第三、在设计的数据表格基础上设计内存回收算法(分四种情况进行回收(上邻、下邻、上下邻和无相邻分区)。

五、实验步骤

第一,设计记录内存使用情况的数据表格

●已分配分区表:起始地址、长度、标志(0表示“空表项”,1表示“已分配”)

●空闲分区表:起始地址、长度、标志(0表示“空表项”,1表示“未分

操作系统-第四次实验报告-文件系统

操作系统-第四次实验报告-文件系统
文件的读 int read(int,int,int)
.将文件整个内容整个取出在一个临时字符数组中 .根据要求的读取参数定位读写位置,输出读取内容,完成读操作 .返回状态信息
文件指针定位 int lseek(int,int)
.把文件的读写指针移动到 pos 指定的位置。pos .是一个整数,表示从文件开始位置的偏移量。文件打开时,读写指针 .自动设置为 0。每次读写操作之后,它指向最后被访问的字节的下一 .个位置。lseek 能够在不进行读写操作的情况下改变读写指针能位置。
int buffer_length = BUFFER_LENGTH; for (i = 0; i < BUFFER_LENGTH; i++) { if (open_list[list].buffer[i] == '\0') { buffer_length = i; break; } } int x = open_list[list].pointer[0]; int y = open_list[list].pointer[1]; int z = B - y; //当 Ì¡À 前¡ã 块¨¦空?闲 D 容¨Y 量¢? // printf("W:buffer_length: %d x:%d y:%d z:%d\n",buffer_length,x,y,z); if (buffer_length < z) //块¨¦容¨Y 量¢?可¨¦写¡ä 入¨?缓 o 冲?区? //缓 o 冲?区?有®D 效¡ì 长¡è 度¨¨

《操作系统》课程实验报告

《操作系统》课程实验报告
printf("进程号:%d \n占用内存块(%2d):", i, process[i][0]);
for (int j=1,count=0; j<=process[i][0]; j++)
{
printf("%2d ", process[i][j], count++);
if (count == 15)
{
loop:printf("请输入进程号(小于%d)和所需页面数:", N);
scanf("%d%d", &pid, &pages);
if (pid > 99)
{
printf("错误!进程号过大!\n");
goto loop;
}
if (pages > blockCount)
return false;
blockCount -= pages;
return false;
}
for (int j=1; j<pages; j++)
{
block[process[pid][j]] = 0;
process[pid][j] = -1;
}
process[pid][0] = 0;
processCount--;

操作系统:实验4 存储管理(实验报告)

操作系统:实验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且都有换页文件的计算机可行。从运行结果看,这种技术成功了吗?_________________。

实验四 操作系统存储管理实验报告

实验四  操作系统存储管理实验报告

实验四操作系统存储管理实验报告

一、实验目的

本次操作系统存储管理实验的主要目的是深入理解操作系统中存储

管理的基本原理和方法,通过实际操作和观察,掌握内存分配、回收、地址转换等关键技术,提高对操作系统存储管理机制的认识和应用能力。

二、实验环境

操作系统:Windows 10

开发工具:Visual Studio 2019

三、实验原理

1、内存分配方式

连续分配:分为单一连续分配和分区式分配(固定分区和动态分区)。

离散分配:分页存储管理、分段存储管理、段页式存储管理。

2、内存回收算法

首次适应算法:从内存低地址开始查找,找到第一个满足要求的空闲分区进行分配。

最佳适应算法:选择大小最接近作业需求的空闲分区进行分配。

最坏适应算法:选择最大的空闲分区进行分配。

3、地址转换

逻辑地址到物理地址的转换:在分页存储管理中,通过页表实现;在分段存储管理中,通过段表实现。

四、实验内容及步骤

1、连续内存分配实验

设计一个简单的内存分配程序,模拟固定分区和动态分区两种分配方式。

输入作业的大小和请求分配的分区类型,程序输出分配的结果(成功或失败)以及分配后的内存状态。

2、内存回收实验

在上述连续内存分配实验的基础上,添加内存回收功能。

输入要回收的作业号,程序执行回收操作,并输出回收后的内存状态。

3、离散内存分配实验

实现分页存储管理的地址转换功能。

输入逻辑地址,程序计算并输出对应的物理地址。

4、存储管理算法比较实验

分别使用首次适应算法、最佳适应算法和最坏适应算法进行内存分配和回收操作。

记录不同算法在不同作业序列下的内存利用率和分配时间,比较它们的性能。

操作系统实践报告

操作系统实践报告

操作系统实践报告

引言:

现代计算机已经成为人们生活和工作中不可或缺的一部分。而计算机的核心就是操作系统。操作系统是一种控制和管理计算机硬件和软件资源的软件系统。操作系统为我们提供了方便的用户界面和高效的资源管理,使得计算机能够更加稳定和高效地运行。本报告将重点介绍操作系统的实践,包括内存管理、文件系统、进程管理等方面的内容。通过实践操作系统,我们将更好地理解和掌握计算机系统的工作原理。

一、内存管理

内存管理是操作系统中最核心的部分之一。在操作系统实践中,我们学习了常见的内存管理技术,如连续内存分配和非连续内存分配。连续内存分配是将内存划分为若干连续的空闲区域,并根据进程的需要将其分配给进程。而非连续内存分配则是将内存分为若干不连续的块,进程在运行时可以随时申请或释放内存。通过实践内存管理,我们深入了解了进程的内存空间划分和管理方式,为进一步优化计算机系统性能提供了基础。

二、文件系统

文件系统是操作系统中用于管理文件和目录的一种机制。在实践操作系统中,我们学习了常见的文件系统类型,如FAT、NTFS等。文件系统不仅负责文件和目录的创建、读写和删除,还需要处理文件的权

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

三、进程管理

进程管理是操作系统中最重要的功能之一。在操作系统实践中,我们学习了进程的创建、调度和终止等操作。进程是计算机系统中正在执行的程序的实例。通过实践进程管理,我们深入了解了进程的运行机制和调度算法。合理的进程管理能够提高计算机系统的并发性和响应速度,为用户提供更好的使用体验。

操作系统 主存储器空间分配实验

操作系统 主存储器空间分配实验

学生实验报告(课程名称:操作系统)

实验题目:主存储器空间分配实验

一、实验目的

通过首次适应算法、最佳适应算法和最坏适应算法实现主存空间的分配,可以使读者可好地理解存储分配算法。

二、实验环境

VC++

三、实验内容与要求

编写一段程序来模拟可变分区管理方法。要求能通过文件形式定义空闲区表;能随意输入作业及需要分配的空间;能分别使用首次适应算法、最佳适应算法和最坏适应算法对输入的作业进行空间分配;能显示系统空闲表和已分配空间表。

⑴可变分区方式是按作业需要的主存空间大小来分区。当装入一个作业时,首先要查看是否有足够的空闲空间来分配,若有则按指定的分配方式进行分配;否则作业不能装入。随着作业的装入和撤离主存空间被分为若干个大大小小的不连续的区间,为了表明各区间的状态可以用一个内存分区表如表1所示来表示。

表1 内存分区表

起始地址长度标志

120k 20k 作业

1

200k 50k 空闲

这样我们可以定义一个如下的结构表示内存分区信息。

typedef struct node

{

int start; //起始地址

int length; //长度

char tag[20]; //标志

}job;

⑵可变分区的三种算法就是为作业分配主存空间的方法。

●首次适应算法:在空闲区间中查询满足作业需要的空间,并将作业装入第一个满足条件的空间中去。

●最佳适应算法:在空闲区间中查询满足作业需要的空间,并将作业装入满足条件的空闲空间中最小的一个空间中去。

●最坏适应算法:在空闲区间中查询满足作业需要的空间,并将作业装

入满足条件的空闲空间中最大的一个空间中去。

操作系统_内存分配与回收实验报告

操作系统_内存分配与回收实验报告

西安邮电大学

(计算机学院)

课内实验报告

实验名称:内存分配与回收

专业名称:计算机科学与技术

班级:计科1503

学生姓名:***

学号(8位):********

指导教师:***

实验日期:2016年5月23日---2016年6月6日

一. 实验目的及实验环境

1.实验目的

掌握内存分配FF,BF,WF策略及实现的思路;

掌握内存回收过程及实现思路;

实现内存的申请、释放的管理程序,调试运行,总结程序设计中出现的问题并找出原因,写出实验报告。

2.实验环境

(1)硬件

CPU:I7-6500

内存:8G

显示器:笔记本显示器

硬盘空间:1TB

(2)软件

虚拟机名称及版本:Vmware

操作系统名称及版本:Ubuntu Kylin 16.04

编译器:gcc

二. 实验内容

1、实验前准备工作

阅读参考资料,掌握操作系统内存管理的过程,并熟悉FF,BF,WF内存分配策略以及内存回收策略。

2、实验内容

根据下发ppt内容,内存分配与回收程序要求完成如下功能,具体详细设计要求见ppt。

1 -Set memory size (default=1024)//设置内存大小

2 - Select memory allocation algorithm//选择内存分配算法FF、BF、WF

3 - New process//创建新进程,分配内存

4 - Terminate a process//终止进程,回收内存

5 - Display memory usage//显示内存当前使用情况

0 – Exit//程序退出

三.方案设计

1.功能模块图及解释

2.核心数据结构及解释

操作系统实验四报告-主存空间分配和回收(含源码)

操作系统实验四报告-主存空间分配和回收(含源码)

操作系统实验四报告-主存空间分配和回收

(含源码)

计算机学院计算机科学与技术专业班学号

姓名教师评定_________________

实验题目主存空间的分配和回收

一、实验目的

熟悉主存的分配与回收。理解在不同的存储管理方式下,如何实现主存空间的分配与回收。掌握动态分区分配方式中的数据结构和分配算法及动态分区存储管理方式及其实现过程。

二、实验内容和要求

主存的分配和回收的实现是与主存储器的管理方式有关的。所谓分配,就是解决多道作业或多进程如何共享主存空间的问题。所谓回收,就是当作业运行完成时将作业或进程所占的主存空间归还给系统。

可变分区管理是指在处理作业过程中建立分区,使分区大小正好适合作业的需求,并且分区个数是可以调整的。当要装入一个作业时,根据作业需要的主存量查看是否有足够的空闲空间,若有,则按需要量分割一个分区分配给该作业;若无,则作业不能装入,作业等待。随着作业的装入、完成,主存空间被分成许多大大小小的分区,有的分区被作业占用,而有的分区是空闲的。

实验要求使用可变分区存储管理方式,分区分配中所用的数据结构采用空闲分区表和空闲分区链来进行,分区分配中所用的算法采用首次适应算法、最佳适应算法、最差适应算法三种算法来实现主存的分配与回收。同时,要求设

计一个实用友好的用户界面,并显示分配与回收的过程。同时要求设计一个实用友好的用户界面,并显示分配与回收的过程。

三、实验主要仪器设备和材料

实验环境

硬件环境:IBM-PC或兼容机

软件环境:VC++ 6.0

四、实验原理及设计分析

某系统采用可变分区存储管理,在系统运行当然开始,假设初始状态下,可用的内存空间为640KB,存储器区被分为操作系统分区(40KB)和可给用户的空间区(600KB)。

操作系统课程设计报告-主存空间的分配与回收

操作系统课程设计报告-主存空间的分配与回收

操作系统课程设计报告

学院:计算机科学与技术学院专业:软件工程班级:软件***班

else //输入操作有误

{

printf("输入有误,请重试!");

continue;

}

}

}

程序测试及结果分析

程序测试:初始化:

显示功能:实

验总结

这次实验比较复杂,用了很多时间,但同时收获了很多,对主存空间分配认识加深了很多。

操作系统实验四存储管理

操作系统实验四存储管理

集美大学计算机工程学院实验报告

课程名称:操作系统班级:计算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. * *

实验四_操作系统

实验四_操作系统

实验四实验报告

【实验题目】:动态分区分配算法

【实验目的】

通过这次实验,加深对动态分区分配算法的理解,进一步掌握首次适应算法、循环首次适应算法、最佳适应算法和最坏适应算法的实现方法。

【实验内容】

问题描述:

设计程序模拟四种动态分区分配算法:首次适应算法、循环首次适应算法、最佳适应算法和最坏适应算法的工作过程。假设内存中空闲分区个数为n,空闲分区大小分别为P1, … ,P n,在动态分区分配过程中需要分配的进程个数为m(m≤n),它们需要的分区大小分别为S1, …,S m,分别利用四种动态分区分配算法将m个进程放入n个空闲分区,给出进程在空闲分区中的分配情况。

程序要求如下:

1)利用首次适应算法、循环首次适应算法、最佳适应算法和最坏适应算法四种动态分区分配算法模拟分区分配过程。

2)模拟四种算法的分区分配过程,给出每种算法进程在空闲分区中的分配情况。

3)输入:空闲分区个数n,空闲分区大小P1, … ,P n,进程个数m,进程需要的分区大小S1, … ,S m,算法选择1-首次适应算法,2-循环首次适应算法,3-最佳适应算法,4-最坏适应算法。

4)输出:最终内存空闲分区的分配情况。

实现提示:

用C++语言实现提示:

1)程序中变量定义参考(根据需要可添加)如下:

const int MaxNumber=100;

int FreePartition[MaxNumber];

int FirstPartition[MaxNumber];

int CycleFirstPartition[MaxNumber];

int BestPartition[MaxNumber];

中南大学操作系统实验报告

中南大学操作系统实验报告

中南大学

操作系统实验报告

姓名:

学号:

班级:

进程模拟与主存分配回收

一、实验内容

1.设计进程管理中数据结构的内容;

2.设计一个优先权调度算法,实现进程调度;

3.设计至少两个临界资源的同步管理模拟。

4.主存存储器空间的分配和回收

二、实验目的

a)加深对进程概念及进程管理各部分内容的理解;

b)熟悉进程管理中主要数据结构的设计及进程调度算法、进程控制机构和同步机构的

实现过程。

c)帮助了解在不同的存储管理方式下,应怎样实现主存空间的分配和回收

三、实验要求

1.最好采用图形界面;

2.可随时增加进程;

3.规定道数,设置后备队列和阻塞状态。若内存中进程少于规定道数,可自动从后备队

4.列中调度作业进入。被阻塞进程入阻塞队列,设置唤醒功能用于将指定阻塞进程唤醒

进入就绪队列;

5.每次调度完成,显示各进程状态;

6.设置至少两个临界资源阻塞队列和公共变量,模拟同步过程;

7.设置时间片中断操作;

8.自行假设主存空间大小,预设操作系统所占大小并构造未分分区表。

9.采用最先适应算法分配主存空间

10.进程完成后,分配主存,并与相邻空闲分区合并。

四、 具体实现

将实验一与实验二结合在一起。所以整合成了一分实验报告。在这里统一给出自己实现的思想。

1. 流程图 开始

就绪队列

内存是否够用

是否有临界资源

可以使用

阻塞队列外存队列是否完成

释放资源部分进程进

入就绪队列

结束队列2.关键代码:

1. 利用冒泡法实现优先级的排序

//优先级的排序

public void sort(ArrayList<PCB> arraylist){

for(int i=0;i<arraylist.size();i++){

操作系统第四次实验报告文件系统

操作系统第四次实验报告文件系统

实验介绍

本实验要求在假设的I/O 系统之上开发一个简单的文件系统,这样做既能让实验者对文件系统有整体了解,又避免了涉及过多细节。用户通过create, open, read 等命令与文件系统交互。文件系统把磁盘视为顺序编号的逻辑块序列,逻辑块的编号为0 至L-1。I/O 系统利用内存中的数组模拟磁盘。

实际物理磁盘的结构是多维的:有柱面、磁道、扇区等概念。I/O 系统的任务是隐藏磁盘的结构细节,把磁盘以逻辑块的面目呈现给文件系统。逻辑块顺序编号,编号取值范围为0 至L -1,其中L 表示磁盘的存储块总数。实验中,我们可以利用字符数组ldisk[L][B] 构建磁盘模型,其中B 表示每个存储块的长度。I/O 系统从文件系统接收命令,根据命令指定的逻辑块号把磁盘块的内容读入命令指定的内存区域,或者把命令指定的内存区域内容写入磁盘块。内存区域内容写入磁盘块。

整体组织

注:我定义的文件系统中,磁盘分为两大部分:数据区和保留区。其中保留区中又包含位图区和文件描述符区,数据区的首部是文件的目录项,也就是说,文件的目录项在文件创建时会创建相应的目录项在数据区的文件首部;而位图区用于表征数据的占用情况,例如数据区的第N块被分配了,那么位图区中也要做相应的改变。

文件描述符

注:文件描述符位于保留区后半部,用于分为两类型,即表示目录的0号描述符和1号以后的描述符,用于表示文件的长度和分配块情况,具体看上图。

目录项

注:目录项位于数据区的首部,目录项的0位用于保存文件描述符的序号,1号以后用于存放文件名总结:

一个文件的所有存放于由位视图,文件描述符,目录项和数据区表征。

内存分配和内存回收的算法

内存分配和内存回收的算法

内存分配和内存回收的算法

内存分配和内存回收是计算机科学中非常重要的话题,它们是操作系统和编程语言中的核心概念。在本文中,我们将深入探讨内存分配和内存回收的算法,以及它们在实际应用中的一些常见方法和技术。

第一部分:内存分配

内存分配是将计算机系统中的可用内存空间分配给程序和进程

使用的过程。在常规操作系统中,内存分配包括两种主要方法:静态分配和动态分配。

1. 静态分配:静态分配是在编译时为程序分配固定大小的内存空间。这种方法的一个明显优点是速度较快,因为内存分配是在程序加载时完成的,无需额外的运行时开销。然而,缺点是在程序运行时无法根据需要调整内存大小,并且可能导致内存浪费或不足的问题。

2. 动态分配:动态分配是在程序运行时根据需要分配和释放内存空间。这种方法基于一种称为“堆”的数据结构,其中包含系统中未使用的内存块。常见的动态分配算法包括:

a. 首次适应算法:该算法从堆的起始位置开始查找第一个足够大的空闲内存块,并在找到后分配给程序。这种算法的优点是分配速度比较快,但后续的内存分配可能会导致碎片化。

b. 最佳适应算法:该算法搜索堆中最小的足够大的内存块并进行分配。这种方法可以最大限度地减少碎片化,但可能导致内存分配速度较慢。

c. 最差适应算法:该算法搜索堆中最大的足够大的内存块并

进行分配。与最佳适应算法相反,这种方法可以最大限度地减少外部碎片,但可能导致内存分配速度较慢。

d. 快速适应算法:该算法使用一个包含不同大小的内存块的链表,以便根据需要选择最合适的内存块进行分配。这种方法在分配速度和内存利用率方面都具有较好的平衡。

操作系统实验报告四

操作系统实验报告四

操作系统实验报告四

操作系统实验报告四

引言

操作系统是计算机系统中最重要的软件之一,它负责管理计算机硬件和软件资源,为用户提供一个良好的运行环境。操作系统实验是学习操作系统的重要途

径之一,通过实际操作和实验验证,可以更好地理解和掌握操作系统的原理和

机制。本篇文章将围绕操作系统实验报告四展开,从实验目的、实验环境、实

验步骤、实验结果和实验总结等方面进行论述。

实验目的

操作系统实验报告四的主要目的是通过实验,深入了解操作系统中进程调度的

原理和实现方法。进程调度是操作系统中的一个重要组成部分,它决定了进程

在处理器上的执行顺序,直接影响着系统的性能和响应速度。通过本次实验,

我们将学习和掌握不同的进程调度算法,并通过实验验证它们的性能和效果。

实验环境

本次实验使用的操作系统是Linux,实验环境是一台配置较高的计算机。实验过程中,我们将使用C语言编写程序,通过系统调用和相关库函数实现进程的创建、调度和执行等操作。同时,我们还将使用一些工具和命令来监测和评估进

程的执行情况,以及对实验结果进行分析和比较。

实验步骤

1. 实验准备:在开始实验之前,我们需要对实验环境进行一些准备工作。首先,我们需要安装和配置必要的软件和工具,如编译器、调试器和性能监测工具等。其次,我们需要了解和熟悉实验所需的进程调度算法和相关知识,为后续的实

验操作做好准备。

2. 实验设计:在实验设计阶段,我们需要根据实验要求和目的,选择适合的进

程调度算法,并设计实验方案。实验方案包括进程创建和调度的具体步骤,以

及实验中所需的测试数据和指标等。在设计实验方案时,我们需要考虑实验的

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

计算机学院计算机科学与技术专业班学号

姓名教师评定_________________ 实验题目主存空间的分配和回收

一、实验目的

熟悉主存的分配与回收。理解在不同的存储管理方式下,如何实现主存空间的分配与回收。掌握动态分区分配方式中的数据结构和分配算法及动态分区存储管理方式及其实现过程。

二、实验内容和要求

主存的分配和回收的实现是与主存储器的管理方式有关的。所谓分配,就是解决多道作业或多进程如何共享主存空间的问题。所谓回收,就是当作业运行完成时将作业或进程所占的主存空间归还给系统。

可变分区管理是指在处理作业过程中建立分区,使分区大小正好适合作业的需求,并且分区个数是可以调整的。当要装入一个作业时,根据作业需要的主存量查看是否有足够的空闲空间,若有,则按需要量分割一个分区分配给该作业;若无,则作业不能装入,作业等待。随着作业的装入、完成,主存空间被分成许多大大小小的分区,有的分区被作业占用,而有的分区是空闲的。

实验要求使用可变分区存储管理方式,分区分配中所用的数据结构采用空闲分区表和空闲分区链来进行,分区分配中所用的算法采用首次适应算法、最佳适应算法、最差适应算法三种算法来实现主存的分配与回收。同时,要求设计一个实用友好的用户界面,并显示分配与回收的过程。同时要求设计一个实用友好的用户界面,并显示分配与回收的过程。

三、实验主要仪器设备和材料

实验环境

硬件环境:IBM-PC或兼容机

软件环境:VC++ 6.0

四、实验原理及设计分析

某系统采用可变分区存储管理,在系统运行当然开始,假设初始状态下,可用的内存空间为640KB,存储器区被分为操作系统分区(40KB)和可给用户的空间区(600KB)。

(作业1 申请130KB、作业2 申请60KB、作业3 申请100KB 、作业2 释放 60KB 、作业4 申请 200KB、作业3释放100KB、作业1 释放130KB 、作业5申请140KB 、作业6申请60KB 、作业7申请50KB)

当作业1进入内存后,分给作业1(130KB),随着作业1、2、3的进入,分别分配60KB、100KB,经过一段时间的运行后,作业2运行完毕,释放所占内存。此时,作业4进入系统,要求分配200KB内存。作业3、1运行完毕,释放所占内存。此时又有作业5申请140KB,作业6申请60KB,作业7申请50KB。为它们进行主存分配和回收。

1、采用可变分区存储管理,使用空闲分区链实现主存分配和回收。

空闲分区链:使用链指针把所有的空闲分区链成一条链,为了实现对空闲分区的分配和链接,在每个分区的起始部分设置状态位、分区的大小和链接各个分区的前向指针,由状态位指示该分区是否分配出去了;同时,在分区尾部还设置有一后向指针,用来链接后面的分区;分区中间部分是用来存放作业的空闲内存空间,当该分区分配出去后,状态位就由“0”置为“1”。

设置一个内存空闲分区链,内存空间分区通过空闲分区链来管理,在进行内存分配时,系统优先使用空闲低端的空间。

设计一个空闲分区说明链,设计一个某时刻主存空间占用情况表,作为主存当前使用基础。初始化空间区和已分配区说明链的值,设计作业申请队列以及作业完成后释放顺序,实现主存的分配和回收。要求每次分配和回收后显示出空闲内存分区链的情况。把空闲区说明链的变化情况以及各作业的申请、释放情况显示打印出来。

2.采用可变分区存储管理,分别采用首次适应算法、最佳适应算法和最坏适应算法实现主存分配和回收。

3、主存空间分配

(1)首次适应算法

在该算法中,把主存中所有空闲区按其起始地址递增的次序排列。在为作业分配存储空间时,从上次找到的空闲分区的下一个空闲分区开始查找,直到找到第一个能满足要求的空闲区,从中划出与请求的大小相等的存储空间分配给作业,余下的空闲区仍留在空闲区链中。

(2)最佳适应算法

在该算法中,把主存中所有空闲区按其起始地址递增的次序排列。在为作业分配存储空间时,从上次找到的空闲分区的下一个空闲分区开始查找,直到找到一个能满足要求的空闲区且该空闲区的大小比其他满足要求的空闲区都小,从中划出与请求的大小相等的存储空间分配给作业,余下的空闲区仍留在空闲区链中

(3)最坏适应算法

在该算法中,把主存中所有空闲区按其起始地址递增的次序排列。在为作业分配存储空间时,从上次找到的空闲分区的下一个空闲分区开始查找,直到找到一个能满足要求的空闲区且该空闲区的大小比其他满足要求的空闲区都大,从中划出与请求的大小相等的存储空间分配给作业,余下的空闲区仍留在空闲区链中。

4、主存空间回收

当一个作业执行完成撤离时,作业所占的分区应该归还给系统。归还的分区如果与其它空闲区相邻,则应合成一个较大的空闲区,登记在空闲区说明链中,此时,相邻空闲区的合并问题,要求考虑四种情况:

(1)释放区下邻空闲区(低地址邻接)

(2)释放区上邻空闲区(高地址邻接)

(3)释放区上下都与空闲区邻接

(4)释放区上下邻都与空闲区不邻接

五、程序流程图

main函数里的流程图

分配空间里的流程图

回收空间里的流程图

六、相关数据结构及关键函数说明

本程序采用了一个struct free_table数据结构,里面包含分区序号(num)、起始地址(address)、分区长度(length)和分区状态(state)。还用了线性表的双性链表存储结构(struct Node),里面包含前区指针(prior)和后继指针(next)。一开始定义一条(含有first和end)的链,用开始指针和尾指针开创空间链表。然后分别按三种算法进行分配和回收。

在该程序中关键函数有,sort()、allocation()、recovery()、和First_fit()、Best_fit ()、Worst_fit();其中sort()函数是用来整理分区序号的,如在删序号3时,她与前面序号2相连在一起了,然后序号2中的长度总满足申请的内存大小,就会在序号2中分配,然后序号在2的基础上加1,一直加,加到与原本序号3的下一个序号也就是4相等,这时sort()就开始有明显的工作了;allocation()是分配空间的,也是过渡到三个算法中的,当三个算法中满足或者不满足分配请求,都会又返回值给allocation();recovery()是用来回收内存的,里面包含了四种情况相连结果,即释放区上与空闲区邻接、释放区下与空闲区邻接、释放区上下都与空闲区邻接、释放区上下都与空闲区不邻接这四种情况的结果。

七、源代码

#include

#include

#define OK 1 //完成

#define ERROR 0 //出错

typedef int Status;

typedef struct free_table//定义一个空闲区说明表结构

{

int num; //分区序号

long address; //起始地址

long length; //分区大小

int state; //分区状态

}ElemType;

typedef struct Node// 线性表的双向链表存储结构

{

ElemType data;

struct Node *prior; //前趋指针

struct Node *next; //后继指针

}Node,*LinkList;

LinkList first; //头结点

LinkList end; //尾结点

int flag;//记录要删除的分区序号

Status Initblock()//开创带头结点的内存空间链表

{

first=(LinkList)malloc(sizeof(Node));

end=(LinkList)malloc(sizeof(Node));

first->prior=NULL;

first->next=end;

end->prior=first;

end->next=NULL;

相关文档
最新文档