存储管理---动态分区分配算法的模拟

合集下载

实验五 动态分区分配算法的模拟

实验五 动态分区分配算法的模拟

实验五动态分区分配算法的模拟

一、实验目的

1、加深操作系统内存管理过程的理解

2、掌握内存分配算法的基本应用

二、实验任务

请同学们用C/C++实现一个完整的(可变)动态分区管理器,包括分配,回收,分区碎片整理等。希望同学们实现如下功能:

n 初始化功能:内存状态设置为初始状态。

n 分配功能:要求至少使用两种算法,用户可以选择使用。

n 回收功能:

n 空闲块的合并:即紧凑功能,用以消除碎片。当做碎片整理时,需要跟踪分配的空间,修改其引用以保证引用的正确性。

n 显示当前内存的使用状态,可以使用表格或图形。

三、实验指导

1.基本思想

动态分区是指系统不预先划分固定分区,而是在装入程序的时候划分内存区域,使得为程序分配的分区大小恰好等于该程序的需求量,且分区的个数是动态的。显然动态分区有较大的灵活性,较之固定分区能获得好的内存利用率。

2.数据结构

动态分区管理可以用两种数据结构实现,一种是已分配区表和空闲区表,也就是用预先定义好的系统空间来存放空间分配信息。

另一种也是最常用的就是空闲链表,由于对分区的操作是动态的,所以很难估计数据结构所占用的空间,而且空闲区表会占用宝贵的系统空间,所以提出了空闲链表的概念。其特点是用于管理分区的信息动态生成并和该分区在物理地址上相邻。这样由于可以简单用两个空闲块之间的距离定位已分配空间,不仅节约了系统空间,而且不必维持已分配空间的信息。

本实验是要做一个模拟程序,来模拟动态分区算法的分配和回收过程,并不是真正的去分配和回收内存。基本的模拟方法有两种:

1、先从内存中申请一块存储区,对这块存储区进行模拟的分配和回收活动。

实验报告-动态分区分配算法

实验报告-动态分区分配算法

南昌大学实验报告

学生姓名:马江涛学号:8000612091 专业班级:计算机软件121班

实验类型:□验证□综合□设计□创新实验日期:2014-05-08 实验成绩:

【实验要求】

1、编程实现首次适应算法和最佳适应算法的动态分区分配的分配过程和回收过程。其中,空闲分区通过分区链来管理;在进行内存分配时,系统优先使用空闲区低端的空间。

2、假设初始状态下,可用内存空间为640K,并依次有下列请求序列:

1)作业1申请130KB。

2)作业2申请60KB。

3)作业3申请100KB。

4)作业2释放60KB。

5)作业4申请200KB。

6)作业3释放100KB。

7)作业1释放130KB。

8)作业5申请140KB。

9)作业6申请60KB。

10)作业7申请50KB。

11)作业6释放60KB。

请分别用首次适应算法和最佳适应算法进行内存块的分配和回收,要求每次分配和回收后显示出空闲内存分区链的情况【可参考后文的实验提示】。

3、上机时认真的进行测试,输入不同的资源分配请求,写出实验结果;

4、具体要求:

(1)对你的程序关键代码处进行注释。

(2)给出实验数据,对结果进行分析,说明对相关知识点的理解。

【实验目的】

了解动态分区分配方式中使用的数据结构和分配算法,并进一步加深对动态分区存储管理方式及其实现过程的理解。

【实验思路】

首次适应算法(First-fit):当要分配内存空间时,就查表,在各空闲区中查找满足大小要求的可用块。只要找到第一个足以满足要球的空闲块就停止查找,并把它分配出去;如果该空闲空间与所需空间大小一样,则从空闲表中取消该项;如果还有剩余,则余下的部分仍留在空闲表中,但应修改分区大小和分区始址。

计算机操作系统课程设计报告《存储管理——动态分区分配算法的模拟》

计算机操作系统课程设计报告《存储管理——动态分区分配算法的模拟》

《计算机操作系统》课程设计

题目:存储管理——动态分区分配算法的模拟

专业:软件工程

年级:2012级

小组成员:

指导教师:

时间:

地点:

2012年5 月

目录

目录 (1)

概述 (3)

2. 课程设计任务及要求 (3)

2.1 设计任务 (3)

2.2 设计要求 (3)

2.3 课程设计任务安排 (3)

3. 算法及数据结构 (4)

3.1算法的总体思想(流程) (4)

3.2首次适应算法 (4)

3.2.1 功能 (4)

3.2.2 数据结构(包括变量的定义,要注释!) (4)

3.2.3 算法(流程图表示,或伪C表示) (5)

3.3循环首次适应算法 (6)

3.3.1功能 (6)

3.3.2 数据结构 (6)

3.3.3算法 (7)

3.4最佳适应算法 (8)

3.4.1功能 (8)

3.4.2 数据结构 (8)

3.4.3算法 (8)

3.5最坏适应算法 (10)

3.5.1功能 (10)

3.5.2 数据结构 (10)

3.5.3算法 (11)

4. 程序设计与实现 (12)

4.1 程序流程图 (12)

4.2 程序代码(要注释) (12)

4.3 实验结果 (21)

5. 结论 (23)

6. 收获、体会和建议。 (23)

A的总结: (23)

B的总结: (23)

7. 参考文献。 (24)

概述

动态分区分配是根据进程的实际需要,动态地为之分配内存空间,而在分配时,须按照一定的分配算法,从空闲分区表或空闲分区链中选出一分区分配给该作业。在本实验中运用了五种分配算法,分别是:

1.首次适应算法

2.循环首次适应算法

3.最坏适应算法

4.最佳适应算法

存储管理——动态分区分配回收算法的模拟

存储管理——动态分区分配回收算法的模拟

齐齐哈尔大学

操作系统课程综合实践

题目:存储管理——动态分区分配/

回收算法的模拟

班级:0

姓名:0

学号:0

指导教师:0

2011年 12 月

综合实践评分表

班级0 姓名0 指导教师0 题目:存储管理---动态分区分配/回收算法的模拟

评分标准

评分标准分数权重

评分的依据

得分A C

选题10 选题符合大纲要求,题

目较新颖,工作量大

选题基本符合大纲要

求,工作量适中

工作态度10 态度端正,能主动认真

完成各个环节的工作,

不迟到早退,出勤好。

能够完成各环节基本

工作,出勤较好。

存储结构、算法描述20

能正确选择存储结构,

定义准确,算法流程图

或类C语言描述的算

法准确无误

能正确选择存储结构,

算法流程图或类C语

言描述的算法基本准

独立解决问题的能力10

具有独立分析、解决问

题能力,有一定的创造

性,能够独立完成软件

的设计与调试工作,程

序结构清晰,逻辑严

谨,功能完善。

有一定的分析、解决问

题能力。能够在老师指

导下完成软件的设计

与调试工作,程序功能

较完善。

答辨问题回答20 能准确回答老师提出

的问题

能基本准确回答老师

提出的问题

程序运行情况10 程序运行正确、界面清

晰,测试数据设计合

理。

程序运行正确、界面较

清晰,能给出合适的测

试数据。

综合实践报告20 格式规范,层次清晰,

设计思想明确,解决问

题方法合理,体会深

刻。

格式较规范,设计思想

基本明确,解决问题方

法较合理。

总分

指导教师(签字):

注:介于A和C之间为B级,低于C为D级和E级。按各项指标打分后,总分在90~100为优,80~89为良,70~79为中,60~69为及格,60分以下为不及格。

操作系统 动态分区存储管理

操作系统 动态分区存储管理

实验四动态分区存储管理

实验目的:熟悉并掌握动态分区分配的各种算法。

熟悉并掌握动态分区中分区回收的各种情况,并能够实现分区合并。

实验内容:用高级语言模拟实现动态分区存储管理,要求:

1、分区分配算法至少实现首次适应算法、最佳适应算法和最坏适应算法中的至

少一种。熟悉并掌握各种算法的空闲区组织方式。

2、分区的初始化——可以由用户输入初始分区的大小。(初始化后只有一个空

闲分区,起始地址为0,大小是用户输入的大小)

3、分区的动态分配过程:由用户输入作业号和作业的大小,实现分区过程。

4、分区的回收:用户输入作业号,实现分区回收,同时,分区的合并要体现出

来。(注意:不存在的作业号要给出错误提示!)

5、分区的显示:任何时刻,可以查看当前内存的情况(起始地址是什么,大小

多大的分区时空闲的,或者占用的,能够显示出来)

6、要求考虑:(1)内存空间不足的情况,要有相应的显示;

(2)作业不能同名,但是删除后可以再用这个名字;

(3)作业空间回收是输入作业名,回收相应的空间,如果这个作业名不存在,也要有相应的提示。

#include "iostream.h"

#include "iomanip.h"

#define ERR_NOFREEAREA 1

#define ERR_NOADEQUACYAREA 2

#define ERR_ALLOCATED 4

#define ERR_NOJOBS 1

#define ERR_NOSUCHJOB 2

#define ERR_RECLAIMED 4

typedef struct tagUsedNode

实验四动态分区分配算法

实验四动态分区分配算法

实验容:存储器管理实验

一、实验目的

采用首次适应算法〔FF〕,最正确适应算法〔BF〕,最坏适应算法〔WF〕三种不同的算法,实现对系统空闲区的动态分区分配。

二、实验题目

给予顺序搜索的动态分区算法的程序。

三、实验要求

读懂给出的核心代码,进展适当的修改,编译通过后,完成实验报告。

四、核心代码

#include <stdio.h>

#include <stdlib.h>

#include <malloc.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

int mem_size=DEFAULT_MEM_SIZE;

int ma_algorithm = MA_FF;

static int pid = 0;

int flag = 0;

struct free_block_type{

int size;

int start_addr;

struct free_block_type *next;

};

struct free_block_type *free_block;

//描述已分配的存块

struct allocated_block{

int pid; int size;

int start_addr;

char process_name[PROCESS_NAME_LEN];

动态分区算法实验报告

动态分区算法实验报告

动态分区算法实验报告

动态分区算法实验报告

一、引言

计算机操作系统是现代计算机系统中的核心组成部分,它负责管理计算机硬件资源,并提供各种服务。内存管理是操作系统的重要功能之一,它负责管理计算机的内存资源,为进程提供运行环境。在内存管理中,动态分区算法是一种常用的内存分配策略。本实验旨在通过实践,深入了解动态分区算法的原理和实现。

二、实验目的

1. 了解动态分区算法的基本原理和实现方式;

2. 掌握动态分区算法的实验环境搭建和使用方法;

3. 分析动态分区算法的优缺点,并比较不同算法的性能差异。

三、实验环境

本实验使用C语言编程实现,实验环境如下:

1. 操作系统:Windows 10;

2. 开发工具:Visual Studio 2019;

3. 编程语言:C语言。

四、实验过程

1. 实验准备

在开始实验之前,我们首先需要了解动态分区算法的基本原理。动态分区算法根据进程的内存需求,将内存划分为若干个不同大小的分区,并按照进程的请求进行分配和释放。常用的动态分区算法有首次适应算法、最佳适应算法和最

坏适应算法等。

2. 实验设计

本实验选择实现首次适应算法,并设计以下几个函数:

- 初始化内存空间:初始化一块指定大小的内存空间,将其划分为一个个的分区,并设置分区的状态;

- 分配内存:根据进程的内存需求,在内存空间中找到合适的分区进行分配,并更新分区的状态;

- 释放内存:将已分配的内存空间进行释放,并更新分区的状态;

- 显示内存状态:打印当前内存空间的分区状态。

3. 实验实现

根据上述设计,我们使用C语言实现了动态分区算法的相关函数。通过调用这些函数,我们可以模拟动态分区算法的运行过程,并观察分区的分配和释放情况。

(实验6)基于动态分区分配的内存管理的模拟设计与实现

(实验6)基于动态分区分配的内存管理的模拟设计与实现

(实验6)基于动态分区分配的内存管理的模拟设计与实现

实验6 内存的连续分配算法

一.实验目的

掌握内存的连续分配方式的各种分配算法

二.实验内容

本系统模拟操作系统内存分配算法的实现,实现固定分区和动态分区分配,

算法,采用PCB定义结构体来表示一个进程,定义了进程的名称和大小,进程内

存起始地址和进程状态。内存分区表采用单链表来模拟实现。

三.实验题目

基于动态分区分配的内存管理的模拟设计与实现

四.实验要求

1.定义与算法相关的数据结构,如PCB,空闲分区

2.在使用动态分区分配算法时必须实现紧凑和对换功能

3.武汉理工大学《操作系统》课程设计说明书14

{ if(FFA(id,size)==OK) cout<<"分配成功!"<<<"分配失败!"< { if(BFA(id,size)==OK) cout<<"分配成功!"<<<"分配失败!"< { if(WFA(id,size)==OK) cout<<"分配成功!"<<<"分配失败!"<<="" }="">

Show() { Node *cur=head->next; while(cur)

{ cout<<"***********************************"<<endl;< p=""> cout<<"区号:"; if(cur->data.ID==FREE) cout<<"无

A.5动态分区分配方式的模拟实验报告

A.5动态分区分配方式的模拟实验报告

动态分区分配方式的模拟

第一部分设计思想的说明

1 设计目标

用C语言或C++语言分别实现采用首次适应算法和最佳适应算法的动态分区分配过程alloc()和回收过程free()。其中,空闲分区通过空闲分区链表来管理,在进行内存分配时,系统优先使用空闲区低端空间。

预期结果:假设初始状态如下,可用的内存空间为640KB,并有下列请求序列:

作业1 申请 130KB

作业2 申请 60KB

作业3 申请 100KB

作业2 释放 60KB

作业4 申请 200KB

作业3 释放 100KB

作业1 释放 130KB

作业5 申请 140KB

作业6 申请 60KB

作业7 申请 50KB

作业6 释放 60KB

分别用首次适应算法和最佳适应算法进行内存块的分配和回收,同时显示内存块分配和回收后空闲内存分区链的情况。

2、设计理论

首次适应算法(First-fit):当要分配内存空间时,就查表,在各空闲区中查找满足大小要求的可用块。只要找到第一个足以满足要球的空闲块就停止查找,并把它分配出去;如果该空闲空间与所需空间大小一样,则从空闲表中取消该项;如果还有剩余,则余下的部分仍留在空闲表中,但应修改分区大小和分区始址。

最佳适应算法(Best-fit):当要分配内存空间时,就查找空闲表中满足要求的空闲块,并使得剩余块是最小的。然后把它分配出去,若大小恰好合适,则直按分配;若有剩余块,则仍保留该余下的空闲分区,并修改分区大小的起始地址。

第二部分程序清单

//*************************************************************** //******** 动态分区分配方式的模拟 *********

计算机操作系统实验报告动态分区分配方式的模拟

计算机操作系统实验报告动态分区分配方式的模拟

计算机操作系统实验报告姓名:班级:学号:

题目:动态分区分配方式的模拟

实习内容简要描述本次实验要完成两部分内容:

一是用C语言实现对采用首次适应算法和最佳适应算法的动态分区分配过程ALLOCo

和回收过程FREE(),其中空闲分区由空闲分区链来管理,进行分配时,系统优先使用空闲区底端空间。

二是假设初始状态下,可用内存空间为640KBO按照题目要求的作业顺序,以及各个作

业分配和回收的内存空间。分别采用首次适应法和最佳适应法,对内存进行分配和回收,

要求每次分配和回收后显示空闲内存分区链的情况。

实验分析算法介绍本次实验通过用C语言进行编程并调试、运行,形象地表现出动态分区的分配方式,直

观地展现了首次适应算法和最佳适应算法对内存的释放和回收方式之间的区别。加深了

我们对两种算法优缺点的理解,帮助我们了解一些数据结构和分配算法,进一步加深我

们对动态分区存储器管理方式及其实现过程的理解。主要的问题在于,如何解决两种算

法对内存的释放和回收空间的表示。

动态分区分配:又称为可变分区分配,这种分配方式并不事先先将主存划分成一块块的分区,而是在作业进入主存时,根据作业的大小动态地建立分区。并使分区的大小正好

适应作业的需要。因此系统中分区的大小是可变的,分区的数目也是可变的。

分区分配算法:(两者的空闲块链接方式不冋)

①首次适应法:

为作业选择分区时总是按地址从高到低搜索,只要找到可以容纳该作业的空白块,

就把该空白块分配给该作业。

特点:优先利用内存中底地址部分的空闲分区(将所有空闲区,按其地址递增的顺序链接)

②最佳适应算法:

动态分区分配方式模拟

动态分区分配方式模拟

动态分区分配方式模拟

动态分区分配方式的核心思想是将内存划分为若干个不同大小的分区,每个分区可以用来存放一个进程或作为一部分进程的存储区域。当一个进

程需要分配内存时,系统会根据进程的需要选择一个合适大小的空闲分区

分配给该进程。当进程执行完毕后,系统会回收其占用的内存分区,再次

将其标记为空闲分区。

首次适应算法(First Fit)是最简单的动态分区分配算法之一、它

从内存的起始位置开始,寻找第一个满足进程需要的空闲分区,然后将该

分区分配给进程。首次适应算法的优点是实现简单,且内存利用率较高。

然而,它也有一些缺点,比如容易产生碎片,导致内存的利用率下降。

最佳适应算法(Best Fit)是根据进程需要的内存大小,选择最小的

满足条件的空闲分区进行分配。最佳适应算法可以最大限度地减少碎片的

产生,提高内存的利用率。但是,最佳适应算法的缺点是实现较为复杂,

同时由于选择最小的分区进行分配,会导致大量的碎片出现。

最坏适应算法(Worst Fit)与最佳适应算法相反,它选择最大的满

足进程需要的空闲分区进行分配。最坏适应算法的优点是可以减少大型进

程的外部碎片,但由于选择最大的分区进行分配,会导致更多的碎片产生。

为了更好地理解动态分区分配方式,我们可以通过一个简单的模拟实

例来进行说明。假设有一块内存大小为1MB,现有以下三个请求需要进行

内存分配:

1.进程A需要200KB的内存;

2.进程B需要400KB的内存;

3.进程C需要600KB的内存。

首次适应算法:首先,进程A需要200KB的内存,首次适应算法从内

存起始位置开始寻找空闲分区,找到一个大小符合要求的空闲分区,将其

操作系统实验三

操作系统实验三

操作系统实验—存储分配收藏

[实验目的]

1.了解动态分区分配方式中使用的数据结构和分配算法,并进一步加深对动

态分区存储管理方式及实现过程的理解。

2.通过对页面、页表、地址转换和页面转换过程的模拟,加深对请求调页系

统的原理和实现过程的理解。

[实验内容和步骤]

-、动态分区分配方式的模拟

1.用C语言分别实现采用首次适应算法和最佳适应算法的动态分区分配过程alloc()和回收过程free()。其中,空闲分区通过空闲分区链管理;

在进行内存分配时,系统优先使用空闲区低端的空间。

2.假设初始状态下,可用的内在空间为640KB,并有下列的请求序列:作业1申请130KB

作业2申请60KB

作业3申请100KB

作业2释放60KB

作业4申请200KB

作业3释放100KB

作业1释放130KB

作业5申请140KB

作业6申请60KB

作业7申请50KB

作业6释放60KB

请分别采用首次适应算法和最佳适应算法进行内存块的分配和回收,要

求每次分配和回收后显示出空闲内存分区链的情况。

3.源代码如下:

//******** 动态分区分配方式的模拟 *********

#include<iostream.h>

#include<stdlib.h>

#define Free 0 //空闲状态

#define Busy 1 //已用状态

#define OK 1 //完成

#define ERROR 0 //出错

#define MAX_length 640 //最大内存空间为640KB

typedef int Status;

模拟设计动态分区存储管理的分配与回收

模拟设计动态分区存储管理的分配与回收

课程设计

题目模拟设计动态分区存储管理的分配与

回收

学院计算机科学与技术学院

专业物联网工程专业

班级

姓名

指导教师

2013 年01 月16 日

课程设计任务书

学生姓名:专业班级:物联网

指导教师:工作单位:计算机科学与技术学院

题目: 模拟设计动态分区存储管理的分配与回收

初始条件:

1.预备内容:阅读操作系统的内存管理章节内容,理解动态分区存储管理,掌握动态分区管理内存的分配和回收过程。

2.实践准备:掌握一种计算机高级语言的使用。

要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写

等具体要求)

1.采用动态分区管理方案实施内存分配和回收。能够处理以下的情形

⑴能够输入给定的内存大小,进程的个数,每个进程所需内存空间的大小;

⑵当某进程提出申请空间的大小后,显示能否满足申请,以及为该进程分配资

源后有关内存空间使用的情况;

⑶当某进程撤消时,显示内存回收后内存空间的使用情况(注意回收后的合

并)。

2.设计报告内容应说明:

⑴需求分析;

⑵功能设计(数据结构及模块说明);

⑶开发平台及源程序的主要部分;

⑷测试用例,运行结果与运行情况分析;

⑸自我评价与总结:

i)你认为你完成的设计哪些地方做得比较好或比较出色;

ii)什么地方做得不太好,以后如何改正;

iii)从本设计得到的收获(在编写,调试,执行过程中的经验和教训);

iv)完成本题是否有其他方法(如果有,简要说明该方法);

时间安排:

设计安排一周:周1、周2:完成程序分析及设计。

周2、周3:完成程序调试及测试。

周4、周5:验收、撰写课程设计报告。

(注意事项:严禁抄袭,一旦发现,一律按0分记)

操作系统实验—动态分区分配算法

操作系统实验—动态分区分配算法

操作系统实验报告实验2动态分区分配算法

报告日期:2016-6-15

姓名:

学号:

班级:

任课教师:

5k 10k 14k 26k 32k

512k

实验2 动态分区分配算法

一、实验内容

编写一个内存动态分区分配模拟程序,模拟内存的分配和回收的完整过程。

二、实验目的

一个好的计算机系统不仅要有一个足够容量的、存取速度高的、稳定可靠的主存储器,而且要能合理地分配和使用这些存储空间。当用户提出申请存储器空间时,存储管理必须根据申请者的要求,按一定的策略分析主存空间的使用情况,找出足够的空闲区域分配给申请者。当作业撤离或主动归还主存资源时,则存储管理要收回作业占用的主存空间或归还部分主存空间。主存的分配和回收的实现与主存储器的管理方式有关的,通过本实验帮助学生理

解在可变分区管理方式下应怎样实现主存空间的分配和回收。

三、实验原理

模拟在可变分区管理方式下采用最先适应算法实现主存分配和回收。

(1)可变分区方式是按作业需要的主存空间大小来分割分区的。当要装入一个作业时,根据作业需要的主存量查看是否有足够的空闲空间,若有,则按需要量分割一个分区分配给该作业;若无,则作业不能装入。随着作业的装入、撤离,主存空间被分成许多个分区,有的分区被作业占用,而有的分区是空闲的。例如:

为了说明哪些区是空闲的,可以用来装入新作业,必须要有一张空闲区说明表,格式如下:

第一栏 第二栏

其中,起址——指出一个空闲区的主存起始地址。

长度——指出从起始地址开始的一个连续空闲的长度。 状态——有两种状态,一种是“未分配”状态,指出对应的由起址指出的某个长度的区

实验四连续动态存管理模拟实现.ppt

实验四连续动态存管理模拟实现.ppt

五流程图
分配算法流程图:
回收算法流程图:
六、实验源程序 #include <stdio.h> #include <stdlib.h> #include <conio.h> #define n 10 /*假定系统允许的最大作业为,假定模拟实验中n值为10*/ #define m 10 /*假定系统允许的空闲区表最大为m,假定模拟实验中m值为10*/ #define minisize 100 struct { float address; /*已分分区起始地址*/ float length; /*已分分区长度,单位为字节*/ int flag; /*已分配区表登记栏标志,用"0"表示空栏目*/ }used_table[n]; /*已分配区表*/ struct { float address; /*空闲区起始地址*/ float length; /*空闲区长度,单位为字节*/ int flag; /*空闲区表登记栏标志,用"0"表示空栏目,用"1"表示未分配*/ }free_table[m]; /*空闲区表*/ void allocate(char J,float x)/*采用首次适应算法分配x大小的空间*/ { int i,k; float ad; k=-1;
数据定义 动态分区常用的数据结构有空闲分区表和空闲分区链,用来记录内存的使用情 况,此题中我采用的是空闲分区链的结构,用链指针将所有的分区链接成一条链,每个 分区的结构如下所示: struct memory { struct memory *former; //前向指针 int address;//分区起始地址 int num;//作业号 int size;//分配内存大小 int state;//状态字 struct memory *next; //后向指针 }; 前向指针和后向指针分别用于与当前分区的前后分区相链接,address用于说明当前分区 的起始地址,状态字为0时表示当前分区空闲,为1时表示已分配,num为分配的作业号, size表示分配的内存大小。 4处理流程 分配算法 其中各个条件分别为: P1: ptr->next==NULL P2: ptr->size>=assign->size P3: current!=NULL P4: current->size>=assign->size&&current->state==0 P5: ptr->size>=assign->size P6: (ptr->next)->next!=NULL&&is_optimist==true 回收算法 则各条件分别为:

实验五 动态分区存储管理系统模拟

实验五 动态分区存储管理系统模拟

实验五动态分区存储管理模拟

一、实验目的

深入了解可变分区存储管理方式主存分配回收的实现。

二、实验预备知识

可变分区存储管理方式不预先将主存划分成几个区域,而把主存除操作系统占用区域外的空间看作一个大的空闲区。当进程要求装入主存时,根据进程需要主存空间的大小查询主存内各个空闲区,当从主存空间找到一个大于或等于该进程大小要求的主存空闲区时,选择其中一个空闲区,按进程需求量划出一个分区装入该进程。进程执行完后,它所占的主存分区被回收,成为一个空闲区。如果该空闲区的相邻分区也是空闲区,则需要将相邻空闲区合并成一个空闲区。

这个实验主要需要考虑三个问题:

(1)设计记录主存使用情况的数据表格,用来记录空闲区和进程占用的区域;

(2)在设计的数据表格基础上设计主存分配算法;

(3)在设计的数据表格基础上设计主存回收算法。

首先,考虑第一个问题:设计记录主存使用情况的数据表格,用来记录空闲区和进程占用的区域。

由于可变分区的大小是由进程需求量决定的,故分区的长度是预先不固定的,且分区的个数也随主存分配和回收而变动。总之,所有分区情况随时可能发生变化,数据表格的设计必须和这个特点相适应。由于分区长度不同,因此设计的表格应该包括分区在主存中的起始地址和长度。由于分配时空闲区有时会变成两个分区:空闲区和已分分区,回收主存分区时,可能会合并空闲分区,这样如果整个主存采用一张表格记录已分分区和空闲区,就会使表格操作繁琐。主存分配时查找空闲区进行分配,然后填写已分分区表,主要操作在空闲区;某个进程执行完成后,将该分区变成空闲区,并将其与相邻空闲区合并,主要操作也在空闲区。由此可见,主存分配和回收主要是对空闲区的操作。

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

一、设计任务

完成存储器动态分区分配算法的模拟实现。

二、设计思想

在对数据结构有一定掌握程度的情况下设计合理的数据结构来描述存储空间,实现分区存储管理的内存分配功能,应该选择最合适的适应算法(首次适应算法,最佳适应算法,最后适应算法,最坏适应算法),实现分区存储管理的内存回收算法,在这些存储管理中间必然会有碎片的产生,当碎片产生时,进行碎片的拼接,等等相关的内容。

三、预期目的

让我们了解操作系统的基本概念,理解计算机系统的资源如何组织,操作系统如何有效地管理这些系统资源,用户如何通过操作系统与计算机系统打交道。通过课程设计,我们可以进一步理解在计算机系统上运行的其它各类操作系统,并懂得在操作系统的支持下建立自己的应用系统。操作系统课程设计,对于训练学生掌握程序设计、熟悉上机操作和程序调试技术都有重要作用。重点培养学生的思维能力、设计能力、创新能力和排错能力。

四、设计方案

首先是对相关知识的掌握,例如数据结构,计算方法,组成原理以及操作系统等。在这些基本知识的基础上进行扩展,用语言的形式从函数,数据结构原代码,原程序等方面来达到自己想要的目的。该设计就是要达到对各个细节的问题的解决将各个数据块连接起来,最终达到存储器动态分区分配算法的模拟实现。

五、数据结构

1.设计合理的数据结构来描述存储空间:

1)对于未分配出去的部分,用空闲分区链表来描述。

struct freeList

{

int startAddress; /* 分区起始地址 */

int size; /* 分区大小 */

struct freeList *next; /* 分区链表指针 */ }

2)对于已经分配出去的部分,由装入内存的作业占据。

struct usedList

{

int startAddress; /* 分区起始地址 */

int jobID; /* 分区中存放作业ID */

struct usedList *next; /* 分区链表指针 */ }

3)将作业组织成链表。

struct jobList

{

int id; /* 作业ID */

int size; /* 作业大小(需要的存储空间大小)*/

int status; /* 作业状态 0 : new job ,1 : in the memory , 2 : finished . */

struct jobList *next; /* 作业链表指针 */

}

以上将存储空间分为空闲可占用两部分,在usedlist中设jobID而不设size,可以在不增加空间复杂度(与freelist相比)的同时更方便的实现可变分区存储管理(从后面的一些函数的实现上可以得出这个结论)。

尽管设置joblist增加了空间复杂度,但它的存在,使得该程序可以方便的直接利用D盘中的JOB文件。该文件可以认为是一个和其他进程共享的资源。通过这个文件,其他进程写入数据供读取。这中思想在操作系统设计中体现的很多。

2.实现分区存储管理的内存分配功能,选择适应算法(首次适应算法,最佳适应算法,最后适应算法,最坏适应算法)。

基本原理分析:

1) Best fit :将空闲分区按大小从小到大排序,从头找到大小合适的分区。

2) Worst fit:将空闲分区按大小从大到小排序,从头找到大小合适的分区。

3) First fit :将空闲分区按起始地址大小从小到大排序,……

4) Last fit :将空闲分区按起始地址大小从大到小排序,……

由此,可将空闲分区先做合适的排序后用对应的适应算法给作业分配存储空间。排序函数 order(bySize为零则按分区大小排序,否则按分区起始地址;inc为零从小到大排序,否则从大到小排序;通过empty指针返回结果)。

void order(struct freeList **empty,int bySize,int inc)

{

struct freeList *p,*q,*temp;

int startAddress,size;

for(p = (*empty) -> next;p;p = p -> next)

{ /* 按bySize和inc两个参数寻找合适的节点,用temp指向它 */ for(temp = q = p;q;q = q -> next)

{

switch(bySize)

{

case 0 : switch(inc)

{

case 0:if(q->size < temp->size)

temp = q;break;

default:if(q->size > temp->size)

temp = q;break;

} break;

default: switch(inc)

{

case 0:if(q->startAddress < temp->startAddress)

temp = q;break;

default:if(q->startAddress > temp->startAddress)

temp = q;break;

} break;

}

} /* 交换节点的成员值 */

if(temp != p)

{

startAddress = p->startAddress;

size = p->size;

p->startAddress = temp->startAddress;

p->size = temp->size;

temp->startAddress = startAddress;

temp->size = size;

}

}

}

3.实现分区存储管理的内存回收算法。

void insertFreeNode(struct freeList **empty,int startAddress,int size) 插入回收的空节点分区,处理回收分区与空闲分区的四种邻接关系。

{

struct freeList *p,*q,*r;

相关文档
最新文档