文档库 最新最全的文档下载
当前位置:文档库 › 动态分区分配方式模拟

动态分区分配方式模拟

动态分区分配方式模拟
动态分区分配方式模拟

使用动态分区分配方式的模拟

1内容

(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。

请分别采用首次适应算法和最佳适应算法,对内存块进行分配和回收,要求每次分配和回收后显示出空闲分区链的情况。

2、示例程序:

//Tittle: 使用动态分区算法的模拟

//author: XuYongzhen

#include

#include

#include

#include

using namespace std;

typedef struct DuLNode{

struct DuLNode *prior;

struct DuLNode *next;

int address;

int jsize;

int jnumber;//显示分区被那个作业占用,显示零则为空闲分区;

}DuLNode,*DuLinkList ;

void CreatList(DuLinkList &L){

DuLinkList p=(DuLinkList)malloc(sizeof(DuLNode));

L->next=p;

L->jnumber=100;//为释放头结点后面的结点空间做统一化处理

p->prior=L;

p->next=NULL;

p->jsize=600;

p->address=0;

p->jnumber=0;

}

void RequestList(DuLinkList &L,int job,int size){

cout<<"作业"<

DuLinkList p=L->next;

while((p->jnumber>0||p->jsize

p=p->next;

if(p==NULL)

cout<<"没有适合的空间分配"<

else{

DuLinkList s=(DuLinkList)malloc(sizeof(DuLNode));

s->prior=p->prior;

p->prior->next=s;

s->next=p;

p->prior=s;

s->jnumber=job;

s->jsize=size;

s->address=p->address;

p->address=p->address+s->jsize;

p->jsize=p->jsize-s->jsize;

DuLinkList t=L->next;

while(t){

if(t->jnumber==0)

cout<<"空闲分区:始址="<address<<"大小="<jsize<

else

cout<<"已分配的分区:作业号="<jnumber<<"始址="<address<<"大小="<jsize<

t=t->next;

}//while

cout<

}//else

}//RequestList

void FreeList(DuLinkList &L,int job){

cout<<"作业"<

DuLinkList p=L->next;

while(p->next&&p->jnumber!=job)

p=p->next;

if(p->prior->jnumber==0 && p->next->jnumber==0){

//p的前后都是空闲分区,则合并三者

DuLinkList s=p->next;

DuLinkList q=p->prior;

p->prior->next=p->next;

p->next->prior=p->prior;

s->prior->next=s->next;

s->next->prior=p->prior;

q->jsize=p->jsize+s->jsize+q->jsize;

}

if(p->prior->jnumber==0 && p->next->jnumber!=0){

//回收区与插入点的前一个分区相临接

DuLinkList q=p->prior;

p->prior->next=p->next;

p->next->prior=p->prior;

q->jsize=p->jsize+q->jsize;

}

if(p->prior->jnumber!=0 && p->next->jnumber==0){

//回收区与插入点的后一个分区相临接

DuLinkList q=p->next;

p->prior->next=p->next;

p->next->prior=p->prior;

q->address=p->address;

q->jsize=p->jsize+q->jsize;

}

if(p->prior->jnumber!=0 && p->next->jnumber!=0)

//回收区去插入点前后的两个空闲分区都不相临接

p->jnumber=0;

DuLinkList t=L->next;

while(t){

if(t->jnumber==0)

cout<<"空闲分区:始址="<address<<"大小="<jsize<

else

cout<<"已分配的分区:作业号="<jnumber<<"始址="<address<<"大小="<jsize<

t=t->next;

}

cout<

}

void main(){

DuLinkList L=(DuLinkList)malloc(sizeof(DuLNode));

CreatList(L);

RequestList(L,1,130);

RequestList(L,2,60);

RequestList(L,3,100);

FreeList(L,2);

RequestList(L,4,200);

FreeList(L,3);

FreeList(L,1);

RequestList(L,5,140);

RequestList(L,6,60);

RequestList(L,7,50);

FreeList(L,6);

}

分区分配算法的实现

分区分配算法的实现 实验要求: ?分区空闲表要表示出分区号、始址、大小 ?作业序列能够动态输入 ?内存不足,必须有提示功能 ?总结收获体会及对该题解的改进意见和见解 (红色字体为再修改处)

源代码: /********************操作系统实验四:首次适应(first fit)算法的分区分配算法*******************/ #include void main() { int m,n,i,j,j0,k,k0,A[30][3],B[30]; printf("请输入空闲分区块数:"); scanf("%d",&m); printf("\t分区号\t\t大小\t\t起始地址\n"); for(i=0;i

} } } printf("\n---------首次适应算法按地址从小到大排列后空闲区---------\n"); printf("\t分区号\t\t大小\t\t起始地址\n"); for(i=0;i

动态分区式存储管理

可变分区存储管理 设计思路: 整体思路: 可变分区管理方式将内存除操作系统占用区域外的空间看做一个大的空闲区。当作业要求装入内存时,根据作业需要内存空间的大小查询内存中的各个 空闲区,当从内存空间中找到一个大于或等于该作业大小的内存空闲区时,选择其中一个空闲区,按作业需求量划出一个分区装人该作业,作业执行完后,其所占的内存分区被收回,成为一个空闲区。如果该空闲区的相邻分区也是空闲区,则需要将相邻空闲区合并成一个空闲区。 设计所才用的算法: 采用最优适应算法,每次为作业分配内存时,总是把既能满足要求、又是最小的空闲分区分配给作业。但最优适应算法容易出现找到的一个分区可能只比作业所需求的长度略大一点的情行,这时,空闲区分割后剩下的空闲区就很小以致很难再使用,降低了内存的使用率。为解决此问题,设定一个限值min size,如果空闲区的大小减去作业需求长度得到的值小于等于min size,不再将空闲区分成己分分区和空闲区两部分,而是将整个空闲区都分配给作业。 内存分配与回收所使用的结构体: 为便于对内存的分配和回收,建立两张表记录内存的使用情况。一张为记录作业占用分区的“内存分配表”,内容包括分区起始地址、长度、作业名/标志(为0时作为标志位表示空栏目);一张为记录空闲区的“空闲分区表”,内容包括分区起始地址、长度、标志(0表空栏目,1表未分配)。两张表都采用顺序表形式。 关于分配留下的内存小碎片问题: 当要装入一个作业时,从“空闲分区表”中查找标志为“ 1”(未分配)且满足作业所需内存大小的最小空闲区,若空闲区的大小与作业所需大小的差值小于或等于min size,把该分区全部分配给作业,并把该空闲区的标志改为“0”(空栏目)。同时,在已分配区表中找到一个标志为“ 0”的栏目登记新装人作业所占用分区的起始地址,长度和作业名。若空闲区的大小与作业所需大小的差值大于

主存空间的分配与回收实验报告

主存空间的分配与回收实验报告

实验报告 课程名称:操作系统 实验名称:主存空间的分配与回收学号: 110310014 学生姓名:于钊 班级:信管1101班 指导教师:吴联世 实验日期: 2013 年12月5日

3、采用最先适应算法(顺序分配算法)分配主存空间。 按照作业的需要量,查空闲区说明表,顺序查看登记栏,找到第一个能满足要求的空闲区。当空闲区大于需要量时,一部分用来装入作业,另一部分仍为空闲区登记在空闲区说明表中。 由于本实验是模拟主存的分配,所以把主存区分配给作业后并不实际启动装入程序装入作业,而用输出“分配情况”来代替。 4、当一个作业执行完成撤离时,作业所占的分区应该归还给系统,归还的分区如果与其它空闲区相邻,则应合成一个较大的空闲区,登记在空闲区说明表中。例如,在上述中列举的情况下,如果作业2撤离,归还所占主存区域时,应与上、下相邻的空闲区一起合成一个大的空闲区登记在空闲区说明表中。 2)程序结构(流程图) 首次适应分配模拟算法

主存回收算法 3)实现步骤 实现动态分区的分配与回收,主要考虑三个问题:第一,设计记录主存使用情况的数据表格,用来记录空闲区和作业占用的区域;第二,在设计的数据表格基础上设计主存分配算法;第三,在设计的数据表格基础上设计主存回收算法。 1.设计记录主存使用情况的数据表格 由于动态分区的大小是由作业需求量决定的,故分区的长度是预先不固定的,且分区的个数也随主存分配和回收变动。总之,所有分区情况随时可能发生变化,数据表格的设计必须和这个特点相适应。由于分区长度不同,因此设计的表格应该包括分区在主存中的起始地址和长度。由于分配时,空闲区有时会变成两个分区:空闲区和已分分区,回收主存分区时,可能会合并空闲区,这样如果整个主存采用一张表格记录已分分区和空闲区,就会使表格操作繁琐。主存分配时查找空闲区进行分配,然后填写已分配区表,主要操作在空闲区;某个作业执行完后,将该分区贬词空闲区,并将其与相邻的空闲区合并,主要操作也在空闲区。由此可见,主存的分配与回收主要时对空闲区的操作。这样为了便于对主存空间的分配与回收,就建立两张分区表记录主存的使用情况:“已分配区表”记录作业占用分区,“空闲区表”记录空闲区。 这两张表的实现方法一般由两种:链表形式、顺序表形式。在本实验中,采用顺序表形式,用数组模拟。由于顺序表的长度必须提前固定,所以无论是“已分配区表”还是“空闲区表”都必须事先确定长度。它们的长度必须是系统可能的最大项数,系统运行过程中才不会出错,因此在多数情况下,无论是“已分配表区”还是“空闲区表”都是空闲栏目。已分配区表中除了分区起始地址、长度

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

操作系统实验四 【实验题目】:动态分区分配算法 【实验学时】:4学时 【实验目的】 通过这次实验,加深对动态分区分配算法的理解,进一步掌握首次适应算法、循环首次适应算法、最佳适应算法和最坏适应算法的实现方法。 【实验内容及要求】 问题描述: 设计程序模拟四种动态分区分配算法:首次适应算法、循环首次适应算法、最佳适应算法和最坏适应算法的工作过程。假设内存中空闲分区个数为n,空闲分区大小分别为P1, … ,P n,在动态分区分配过程中需要分配的进程个数为m(m≤n),它们需要的分区大小分别为S1, … ,S m,分别利用四种动态分区分配算法将m个进程放入n个空闲分区,给出进程在空闲分区中的分配情况。 程序要求: 1)利用首次适应算法、循环首次适应算法、最佳适应算法和最坏适应算法四种动态分区分配算法模拟分区分配过程。 2)模拟四种算法的分区分配过程,给出每种算法进程在空闲分区中的分配情况。 3)输入:空闲分区个数n,空闲分区大小P1, … ,P n,进程个数m,进程需要的分区大小S1, … ,S m。

4)输出:首次适应算法,循环首次适应算法,最佳适应算法,最坏适应算法,最终内存空闲分区的分配情况。 实现源代码: #include #include #include #include #define max 100 using namespace std; int work_num; int zone_num; struct Data{ int data; char name; }; Data *d=new Data[max]; struct Table{ int data; char array[max]; int length; };

动态分区分配算法资料

动态分区分配算法 一实验内容与要求 内容:动态分区分配是根据进程的实际需要,动态地为之分配内存空间,而在分配时,须按照一定的分配算法,从空闲分区表或空闲分区链中选出一分区分配给该作业。在本实验中运用了三种分配算法,分别是1.首次适应算法,2.循环首次适应算法,3.最佳适应算法。 要求:动态分区算法也称为可变分区分配算法,常见的空闲区查找算法有首次适应算法,循环首次适应算法,最佳适应算法。特别注意分区回收时,相邻空闲分区需要合并。 (1)参考操作系统教材理解这3种分配算法以及回收算法。 (2)实现3种分配算法以及回收算法。 (3)已知作业申请内存和释放内存的序列,给出内存的使用情况。 (4)作业申请内存和释放内存的序列可以存放在文本文件中。 (5)设计简单的交互界面,演示所设计的功能。(可以使用MFC进行界面的设计) (6)可根据自己能力,在完成以上基本要求后,对程序功能进行适当扩充。 二、需求分析 本次实验通过用C语言进行编程并调试、运行,形象地表现出动态分区的分配方式,直观地展现了首次适应算法和最佳适应算法对内存的释放和回收方式之间的区别。加深了我们对两种算法优缺点的理解,帮助我们了解一些数据结构和分配算法,进一步加深我们对动态分区存储器管理方式及其实现过程的理解。主要的问题在于,如何解决两种算法对内存的释放和回收空间的表示。 动态分区分配:又称为可变分区分配,这种分配方式并不事先先将主存划分成一块块的分区,而是在作业进入主存时,根据作业的大小动态地建立分区。并使分区的大小正好适应作业的需要。因此系统中分区的大小是可变的,分区的数

目也是可变的。 分区分配算法: 1.首次适应法: 为作业选择分区时总是按地址从高到低搜索,只要找到可以容纳该作业的空白块,就把该空白块分配给该作业。 特点:优先利用内存中底地址部分的空闲分区 (将所有空闲区,按其地址递增的顺序链接) 2.循环首次适应算法 该算法是由首次适应算法演变而成,在为进程分配内存空间时,不再是每次都从第一个空间开始查找,而是从上次找到的空闲分区的下一个空闲分区开始查找,直至找到第一个能满足要求的空闲分区,从中划出一块与请求大小相等的内存空间分配给作业,为实现本算法,设置一个全局变量f,来控制循环查找,当f%N==0时,f=0;若查找结束都不能找到一个满足要求的分区,则此次内存分配失败。 3.最佳适应算法: 接到内存申请时,在空闲块表中找到一个不小于请求的最小空块进行分配;为作业选择分区时总是寻找其大小最接近于作业所要求的存储区域。 三、概要设计 动态分区常用的数据结构有空闲分区表和空闲分区链,用来记录内存的使用情况,此题中我采用的是空闲分区链的结构,用链指针将所有的分区链接成一条链,每个分区的结构如下所示: typedef struct freearea//定义一个空闲区说明表结构 { int ID; //分区号 long size; //分区大小 long address; //分区地址 int state; //状态 }ElemType; typedef struct DuLNode //double linked list { ElemType data; struct DuLNode *prior; //前趋指针 struct DuLNode *next; //后继指针 }DuLNode,*DuLinkList;

动态分区与回收

XI`AN TECHNOLOGICAL UNIVERSITY 实验报告

西安工业大学实验报告 一、实验目的 1.加深对可变分区的存储管理的理解。 2.熟悉主存分配与回收。 3.理解在不同存储管理方式,如何实现贮存空间的分配与回收。 4.掌握动态分区分配中的方式中的数据结构和分配算法及动态分区存储管理方式及其实现过程。 二、实验原理 实现方式:C语言单链表。 建立两个链表,空闲表和已分配表,分别将未分配的作业和已分配好的作业放入其中。当要装入一个作业时,从空闲区表中查找空闲区,从中找出一个能容纳该作业的空闲区。如果找到的空闲区正好等于该作业的长度,则把该分区全部分配给作业,这时应该把该空闲分区从链表上删除。同时在已分配区表中插入这个已申请的结点。如果找到的空闲区大于作业长度,则把空闲区分成两部分,一部分用来装入作业,另外一部分仍为空闲区。 实验采用的有“最优适应”算法。最优适应算法是按作业要求挑选一个能满足作业要求的最小空闲区,这样保证可以不去分割一个

大的区域,使装入大作业时比较容易得到满足。“最坏适应算法”,他是根据分配空间的大小分配空间,空闲区按照从大到小的顺序,排好序,这样子每次都分配最大的分区,会让空闲分区的碎片不会很多。“首次适应算法”,按地址从小到大排序。“循环首次适应算法”地址还是按照从小到大排序的,但是查找会从上一次查找的地方开始继续查找。 四、实验步骤、数据记录及处理 实验步骤: 1.首先是链表的建立,它分为了这样子的一个结构体, typedef struct _MEN { int data; int head; //起始地址 int tail; //结束地址 struct _MEN *next; }MEN; 2.考虑申请释放和回收,申请的时候:你必须先看到知道进程的大小的进程名,从空闲区表中查找空闲区,从中找出一个能容纳该作业的空闲区。如果找到的空闲区正好等于该作业的长度,则把该分区全部分配给作业,这时应该把该空闲分区从链表上删除。同时在已分配区表中插入这个已申请的结点。如果找到的空闲区大于作业长度,则把空闲区分成两部分,一部分用来装入作业,另外一部分仍为空闲区。回收的时候:如果在这个大小和进程名,会被考虑他的大小跟他的上下有没有必要链接起来。 这个是在找有没有跟上面的链接的p1 ->head == s->tail (s为需要释放的结点)

动态分区分配方式模拟

使用动态分区分配方式的模拟 1内容 (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。 请分别采用首次适应算法和最佳适应算法,对内存块进行分配和回收,要求每次分配和回收后显示出空闲分区链的情况。 2、示例程序: //Tittle: 使用动态分区算法的模拟 //author: XuYongzhen #include #include #include #include using namespace std; typedef struct DuLNode{ struct DuLNode *prior; struct DuLNode *next; int address; int jsize; int jnumber;//显示分区被那个作业占用,显示零则为空闲分区; }DuLNode,*DuLinkList ; void CreatList(DuLinkList &L){ DuLinkList p=(DuLinkList)malloc(sizeof(DuLNode)); L->next=p; L->jnumber=100;//为释放头结点后面的结点空间做统一化处理 p->prior=L; p->next=NULL; p->jsize=600; p->address=0; p->jnumber=0;

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

南昌大学实验报告 学生姓名:马江涛学号: 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):当要分配内存空间时,就查表,在各空闲区中查找满足大小要求的可用块。只要找到第一个足以满足要球的空闲块就停止查找,并把它分配出去;如果该空闲空间与所需空间大小一样,则从空闲表中取消该项;如果还有剩余,则余下的部分仍留在空闲表中,但应修改分区大小和分区始址。 最佳适应算法(Best-fit):当要分配内存空间时,就查找空闲表中满足要求的空闲块,并使得剩余块是最小的。然后把它分配出去,若大小恰好合适,则

动态分区分配管理系统

动态分区分配管理系统 学院 专业 学号 学生姓名 指导教师姓名 2014年3月14 日

目录 1程序设计的内容和相关的要求---------------------------------2 2程序总的功能说明--------------------------------------------3 3程序的模块的说明--------------------------------------------4 4程序设计的流程图--------------------------------------------5 5程序的操作说明及运行结果-----------------------------------7 6源程序-------------------------------------------------------11 7心得体会----------------------------------------------------27

1程序设计的内容和相关的要求: 课程设计的目的:操作系统课程设计是计算机学院重要的教学环节,它为学生提供了一个既动手又动脑,将课本上的理论知识和实际有机的结合起来,独立分析和解决实际问题的机会。 ● 进一步巩固和复习操作系统的基础知识。 ● 培养学生结构化程序、模块化程序设计的方法和能力。 ● 提高学生调试程序的技巧和软件设计的能力。 ● 提高学生分析问题、解决问题以及综合利用C语言进行程序设计的能 力。 实现的任务:编写一个动态分区分配程序。 设计内容: 用高级语言编写和调试一个动态分区内存分配程序,演示实现下列两种动态分区分配算法 1.首次适应算法 2.循环首次适应算法 设计要求: 1.内存中有0-100M的空间为用户程序空间,最开始用户空间是空闲的; 2.作业数量、作业大小、进入内存空间、运行时间需要通过界面进行输入; 3.可读取样例数据(要求存放在外部文件夹中)进行作业数量、作业大小、进图内存时间、运行时间的初始化; 4.根据作业进图内存的时间,采用简单的先进先出原则进行从外村到内存的调度,作业具有等待(从外存进入内存执行)、装入(在内存可执行)、结束(运行结束,退出内存)三种状态。(为了简化,不考虑cpu的调度与切换,运行时间为作业在内存中驻留的时间); 5.能够自动进行内存分配与回收,可根据需要自动进行紧凑与拼接操作,所有过程均有动态图形变化的显示; 6.采用可视化界面,可随时暂停显示当前内存分配和使用情况图。 2程序总的功能说明: 本程序可以从界面直接输入作业并进行动态的内存分配,也可以自动地生成作业文件并自行调度进行内存分配,每次分配可以选择两种算法(首次适应算法和循环首次算法)中的一种,每次作业结束后可以进入操作主界面进行再次作业的操作。 首次适应算法(First-fit):当要分配内存空间时,就查表,在各空闲区中查找满足大小要求的可用块。只要找到第一个足以满足要球的空闲块就停止查找,并把它分配出去;

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

操作系统实验报告实验2 动态分区分配算法 报告日期:2016-6-15 姓名: 学号: 班级: 任课教师:

实验2 动态分区分配算法 一、实验内容 编写一个内存动态分区分配模拟程序,模拟内存的分配和回收的完整过程。 二、实验目的 一个好的计算机系统不仅要有一个足够容量的、存取速度高的、稳定可靠的主存储器,而且要能合理地分配和使用这些存储空间。当用户提出申请存储器空间时,存储管理必须根据申请者的要求,按一定的策略分析主存空间的使用情况,找出足够的空闲区域分配给申请者。当作业撤离或主动归还主存资源时,则存储管理要收回作业占用的主存空间或归还部分主存空间。主存的分配和回收的实现与主存储器的管理方式有关的,通过本实验帮助学生理 解在可变分区管理方式下应怎样实现主存空间的分配和回收。 三、实验原理 模拟在可变分区管理方式下采用最先适应算法实现主存分配和回收。 (1)可变分区方式是按作业需要的主存空间大小来分割分区的。当要装入一个作业时,根据作业需要的主存量查看是否有足够的空闲空间,若有,则按需要量分割一个分区分配给该作业;若无,则作业不能装入。随着作业的装入、撤离,主存空间被分成许多个分区,有的分区被作业占用,而有的分区是空闲的。例如: 为了说明哪些区是空闲的,可以用来装入新作业,必须要有一张空闲区说明表,格式如下: 第一栏 第二栏 其中,起址——指出一个空闲区的主存起始地址。 长度——指出从起始地址开始的一个连续空闲的长度。 状态——有两种状态,一种是“未分配”状态,指出对应的由起址指出的某个长度的区域是空闲区。

(2) 当有一个新作业要求装入主存时,必须查空闲区说明表,从中找出一个足够大的空闲区。有时找到的空闲区可能大于作业需要量,这时应把原来的空闲区变成两部分:一部分分给作业占用;另一部分又成为一个较小的空闲区。为了尽量减少由于分割造成的空闲区,而尽量保存高地址部分有较大的连续空闲区域,以利于大型作业的装入。为此,在空闲区说明表中,把每个空闲区按其地址顺序登记,即每个后继的空闲区其起始地址总是比前者大。 (3) 采用最先适应算法(顺序分配算法)分配主存空间。 按照作业的需要量,查空闲区说明表,顺序查看登记栏,找到第一个能满足要求的空闲区。当空闲区大于需要量时,一部分用来装入作业,另一部分仍为空闲区登记在空闲区说明表中。 由于本实验是模拟主存的分配,所以把主存区分配给作业后并不实际启动装入程序装入作业,而用输出“分配情况”来代替。 (4) 当一个作业执行结束撤离时,作业所占的区域应该归还,归还的区域如果与其它空闲区相邻,则应合成一个较大的空闲区,登记在空闲区说明表中。 (5) 请按最先适应算法设计主存分配和回收的程序。假设初始时主存中没有作业,现按下面序列进行内存的申请与释放: 作业1申请300K,作业2申请100K,作业1释放300K,作业3申请150K, 作业4申请30K,作业5申请40K,作业6申请60K,作业4释放30K。 请你为它们进行主存分配和回收,把空闲区说明表的初值以及每次分配或回收后的变化显示出来或打印出来。 四、实验报告 1. 画出算法流程图。

动态分区分配方式的模拟C语言代码和C代码

实验三使用动态分区分配方式的模拟 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。 请分别采用首次适应算法和最佳适应算法,对内存块进行分配和回收,要求每次分配和回收后显示出空闲分区链的情况。 程序代码——C语言实现 #include #include struct node //空闲分区链结点的定义 { node *before; node *after; int size; int address; int state; }; node L; struct usenode { usenode *next; int num; int add; int size; }U,*n;

void Init() //空闲分区链的初始化 { node *p; p=(node *)malloc(sizeof(node)); p->before=&L; p->after=NULL; p->size=640; p->address=0; p->state=0; L.after=p; L.before=NULL; L.size=0; U.next=NULL; n=&U; } node *search(int a) { node *p=L.after; if(p==NULL) { printf("没有空闲的区域!"); p=NULL; return p; } else { while(p!=NULL && a>p->size) p=p->after; if(p==NULL) { printf("没有找到合适的空闲空间!"); p=NULL; return p; } else return p; } } void recovery(int a,int b) //内存回收算法 {

循环首次适应的动态分区分配算法模拟

课程设计报告 课程设计题目:循环首次适应的动态分区分配算法模拟 专业:计算机科学与技术 班级:10204102 姓名:谱 学号: 10204102 指导教师:高小辉 2013年1月11 日

目录 一.循环首次适应算法 (3) 1. 概述 (3) 2.需求分析 (3) 二.实验指导 (4) 1.基本思想 (4) 2.数据结构 (4) 三.运行环境 (6) 四.流程图 (6) 五.循环首次适应算法代码 (5) 六.调试结果 (11) 七、总结 (14) 八.参考文献 (14)

一.循环首次适应算法 1.概述: 该算法是由首次适应算法演变而成的。在为进程分配内存空间时,不再是每次都从链首开始查找,而是从上次找到的空闲分区的下一个空闲分区开始查找,直至找到一个能满足要求的空闲分区,从中划出一块的请求大小相等的内存空间分配给作业。为实现该算法,应设置一起始查找指针,用于指示下一次起始查询的空闲分区,并采用循环查找方式,即如果最后一个(链尾)空闲分区的大小仍不能满足要求,则返回到第一个空闲分区,比较大小是否满足,找到后,应调整起始查询指针。 2. 需求分析 了解动态分区分配中使用的数据结构和分配算法,并进一步加深对动态分区存储管理方式及其实现过程的理解。采用首次适应算法的动态分区分配过程alloc()和回收过程free()。 空闲分区通过空闲分区链表来管理,在进行内存分配时,系统优先使用空闲区低端的空间,即每次分配内存空间是总是从低址部分开始进行循环,找到第一个合适的空间,便按作业所需分配的大小分配给作业。 作业完成时,需要释放作业所占空间,此时要考虑到四种情况: (1)回收区与插入点的前一个空闲分区相邻接。此时将二者合并,修改前一 分区的大小。 (2)回收区与插入点的后一空闲分区相邻接,将二者合并,用回收区的首址 作为新空闲区的首址。 (3)回收区同时与插入点的前后两个空闲分区相邻接,三者合并,使用前一空 闲分区的表项和首址。 (4)回收区单独存在。 二、实验指导 1.基本思想 动态分区是指系统不预先划分固定分区,而是在装入程序的时候划分内存区域,使得为程序分配的分区大小恰好等于该程序的需求量,且分区的个数是动态的。显然动态分区有较大的灵活性,较之固定分区能获得好的内存利用率。 2.数据结构 动态分区管理可以用两种数据结构实现,一种是已分配区表和空闲区表,也就是用预先定义好的系统空间来存放空间分配信息。

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

计算机学院计算机科学与技术专业班学号 姓名教师评定_________________ 实验题目主存空间的分配和回收 一、实验目的 熟悉主存的分配与回收。理解在不同的存储管理方式下,如何实现主存空间的分配与回收。掌握动态分区分配方式中的数据结构和分配算法及动态分区存储管理方式及其实现过程。 二、实验内容和要求 主存的分配和回收的实现是与主存储器的管理方式有关的。所谓分配,就是解决多道作业或多进程如何共享主存空间的问题。所谓回收,就是当作业运行完成时将作业或进程所占的主存空间归还给系统。 可变分区管理是指在处理作业过程中建立分区,使分区大小正好适合作业的需求,并且分区个数是可以调整的。当要装入一个作业时,根据作业需要的主存量查看是否有足够的空闲空间,若有,则按需要量分割一个分区分配给该作业;若无,则作业不能装入,作业等待。随着作业的装入、完成,主存空间被分成许多大大小小的分区,有的分区被作业占用,而有的分区是空闲的。 实验要求使用可变分区存储管理方式,分区分配中所用的数据结构采用空闲分区表和空闲分区链来进行,分区分配中所用的算法采用首次适应算法、最佳适应算法、最差适应算法三种算法来实现主存的分配与回收。同时,要求设计一个实用友好的用户界面,并显示分配与回收的过程。同时要求设计一个实用友好的用户界面,并显示分配与回收的过程。 三、实验主要仪器设备和材料 实验环境 硬件环境: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、采用可变分区存储管理,使用空闲分区链实现主存分配和回收。

最新c++动态分区分配算法模拟(操作系统课程设计)

c++动态分区分配算法模拟(操作系统课程 设计)

课程设计 课程设计名称:操作系统课程设计 专业班级: 学生姓名: 学号: 指导教师: 课程设计时间:6月13日-——6月17日

计算机科学专业课程设计任务书 说明:本表由指导教师填写,由教研室主任审核后下达给选题学生,装订在设计(论文)首页

1:需求分析 (1)用C语言实现采用首次适应算法的动态分区分配过程alloc()和回收过程free()。其中,空闲分区通过空闲分区链表来管理,在进行内存分配时,系统优先使用空闲区低端的空间。 (2)假设初始状态下,可用的内存空间为640KB,并有下列的请求序列:作业1申请130KB;作业2申请60KB;作业3申请100KB;作业2释放60KB;作业4申请200 KB;作业3释放100 KB;作业1释放 130 KB;作业5申请140 KB;作业6申请60 KB;作业7申请 50KB;作业6释放60 KB。采用首次适应算法进行内存块的分配和回 收,同时显示内存块分配和回收后空闲内存分区链的情况。 2:概要设计 (1)数据结构:作业队列数据结构,用于存储待处理作业;阻塞作业队列数据结构,用于存储阻塞的作业。已分配内存块的双向链表,记录当前系 统已分配的各个内存块;未分配内存块的双向链表,记录系统中剩余的 各个内存块;系统内存分配总情况的结点对象,记录系统中阻塞的作业 总数,已分配的内存块数,剩余的内存块数。 (2)主函数:对作业队列、阻塞队列、已分配内存块链表、未分配内存块链表、系统总内存分配情况结点对象进行初始化,调用分配函数或回收函 数,循环处理11个作业步。 (3)分配函数alloc():首次适应算法检索未分配的内存块链表,若找到合适的内存块,则加以判断,空闲内存块大小减去作业去请求内存块大小小于

存储管理分区分配算法

/*9.3.2 源程序*/ /***pcb.c***/ #include "stdio.h" #include "stdlib.h" #include "string.h" #define MAX 32767 typedef struct node /*设置分区描述器*/ { int address,size; struct node *next; }RECT; /*函数原型*/ RECT *assignment(RECT *head,int application); void acceptment1(RECT *head,RECT *back1); void acceptment2(RECT *head,RECT *back1) ; int backcheck(RECT *head,RECT *back1); void print(RECT *head); /*变量声明*/ RECT *head,*back,*assign1,*p; int application1,maxblocknum; char way; /*主函数*/ main() { char choose[10]; int check; head=malloc(sizeof(RECT)); /*建立可利用区表的初始状态*/ p=malloc(sizeof(RECT)); head->size=MAX; head->address=0; head->next=p; maxblocknum=1; p->size=MAX; p->address=0; p->next=NULL; print(head); /*输出可利用表初始状态*/ printf("Enter the way(best or first(b/f)\n");/*选择适应策略*/ scanf("%c",&way); do{ printf("Enter the assign or accept(as/ac)\n"); scanf("%s",choose); /*选择分配或回收*/ if(strcmp(choose,"as")==0) /*as为分配*/ { printf("Input application:\n");

实验四动态分区分配算法实验分析报告及程序

实验四动态分区分配算法实验报告及程序

————————————————————————————————作者:————————————————————————————————日期:

实验报告四动态分区分配算法 班级学号姓名 一、实验目的 动态分区分配是根据进程的实际需要,动态地为之分配内存空间,而在分配时,须按照一定的分配算法,从空闲分区表或空闲分区链中选出一分区分配给该作业。在本实验中运用了四种分配算法,分别是 1.首次适应算法,2.循环首次适应算法,3.最坏适应算法4.最佳适应算法。 二、实验环境 普通的计算机一台,编译环境Microsoft Visual C++ 6.0 三、算法思想 1.数据结构 (1)分区开始地址startaddress (2)分区大小size (3)分区状态state 2.功能介绍 (1)首次适应算法 在首次适应算法中,是从已建立好的数组中顺序查找,直至找到第一个大小能满足要求的空闲分区为止,然后再按照作业大小,从该分区中划出一块内存空间分配给请求者,余下的空间令开辟一块新的地址,大小为原来的大小减去作业大小,若查找结束都不能找到一个满足要求的分区,则此次内存分配失败。 (2)循环首次适应算法 该算法是由首次适应算法演变而成,在为进程分配内存空间时,不再是每次都从第一个空间开始查找,而是从上次找到的空闲分区的下一个空闲分区开始查找,直至找到第一个能满足要求的空闲分区,从中划出一块与请求大小相等的内存空间分配给作业,为实现本算法,设置一个全局变量f,来控制循环查找,当f%N==0时,f=0;若查找结束都不能找到一个满足要求的分区,则此次内存分配失败。

可变分区分配与回收——采用最坏算法操作系统课程设计.doc

哈尔滨理工大学 课程设计 (操作系统) 题目:可变分区分配与回收—采用最坏算法 班级:计算机科学与技术学院计算机系10-8班姓名:张兢1004010813 指导教师:高雪瑶 系主任:林克正 2013年03月01日

哈尔滨理工大学课程设计报告 一、课程设计目的 1、背景 主存是CPU可直接访问的信息空间,合理而有效的使用贮存将在很大程度上影响整个计算机系统的性能。 本课题要求模拟实现分区式主存管理机制。模拟实现各种分区管理方法以及相应的主存分配以及回收算法。 2、目的 通过该课题进一步加深对可变分区存储机制的理解。加深对存储器动态分区分配算法的认识。掌握“首次适应算法”、“下次适应算法”、“最佳适应算法发”、“最坏适应算法”的内存分配过程。掌握内存的回收策略。 二、课题任务描述 1、设计可用的内存空闲空间,并能动态输入用户作业所需的内存大小。 2、编程模拟各种分配算法的实施过程,允许自行选择如“首次适应算法”、“下次适应算法”、“最佳适应算法发”、“最坏适应算法”等常用算法,要求实现不少于三种算法。 3、实现内存的回收。要求考虑回收时的内存合并问题。 三、课题研发相关知识(包含所用库函数的介绍) 1、首次适应算法(first fit) FF算法要求空闲分区链以地址递增的次序链接。在分配内存时,从链首开始顺序查找,直至找到一个大小能男足要求的空闲分区位置;然后再按照作业的大小,从该分区中划出一块内存空间分配给请求者,余下的空闲分区仍留在空闲链中。若从链首直至链尾都

哈尔滨理工大学课程设计报告 不能找到一个能满足要求的分区,则此次内存分配失败,返回。但是,低址部分不断被划分,会留下许多难以利用的很小的空闲分区。 2、最佳适应算法(best fit) 所谓“最佳”是指每次为作业分配内存时,总是把能满足要求、又是最小的空闲分区分配给作业,避免“大材小用”。为了加速寻找,该算法要求将所有的空闲分区按其容量以从小到大的顺序形成一空闲分区链。这样,第一次找到的能满足要求的空闲区,必然是最佳的。这样,在存储器中会留下许多难以利用的小空闲区。 3、最坏适应算法(worst fit) 要扫描整个空闲分区表或链表,总是挑选一个最大的空闲区分割给作业使用,其优点是可使剩下的空闲区不至于太小,产生碎片的几率最小,对中小作业有力,查找效率很高。但是它会使存储器中缺乏大的空闲分区。 4、回收内存 当进程运行完毕释放内存时,系统根据会收取的首址,从空闲区链中找到相应的插入点,并考虑回收区前后是否有空闲分区,如果有,则把两个分区合并成一个大的空闲分区。 5、库函数的介绍 1)stdio 就是指“standard buffered input&output" 意思就是说带缓冲的标准输入输出!所以了,用到标准输入输出函数时,就要调用这个头文件! 2)Stdlib.h即standard library 标准库文件。Stdlib头文件里包含了C,C++语言的最常用的系统函数。Stdlib.h里面定义了五中类型,一些宏和通用工具函数。类型例如:size_t ,wchar_t, div_t, ldiv_t,lldiv_t; 宏例如:EXIT_FALIRE,EXIT_SUCCESS,RAND_MAX和MB_CUR_MAX。 以下是一些常用的函数:dec 置基数为10 相当于"%d";hex 置基数为16 相当于"%X";oct 置基数为8 相当于"%o";setw(n) 设域宽为n个字符

动态分区分配存储管理系统

动态分区分配存储管理系统 一、设计目的与内容 用高级语言编写和调试一个动态分区内存分配程序,演示实现下列两种动态分区分配算 法 1)首次适应算法 2)循环首次适应算法 1. 内存中有0-100M 的空间为用户程序空间,最开始用户空间是空闲的。 2. 作业数量、作业大小、进入内存时间、运行时间需要通过界面进行输入。 3. 可读取样例数据(要求存放在外部文件中)进行作业数量、作业大小、进入内存时间、 运行时间的初始化。 4. 根据作业进入内存的时间,采用简单的先进先出原则进行从外存到内存的调度,作业具 有等待(从外存进入内存执行)、装入(在内存可执行)、结束(运行结束,退出内存)三种状态。 5. 能够自动进行内存分配与回收,可根据需要自动进行紧凑与拼接操作。 二、算法的基本思想 1、定义基本结构: 1作业结构: typedef struct JOB { int num; //作业号 int size; //作业大小 int ctime; //作业进入时间 int rtime; //作业运行时间 int state; //作业状态 }Job ; 2)分区结构: typedef struct DuLNode { int ID; //分区号 int start; //开始地址 int size; //大小 int state; //0=尚未使用1=使用2=释放 struct DuLNode *prior;//前驱指针 struct DuLNode *next; //后即指针 }DuLNode, * DuLinkList;

2、基本操作: int Firstfit(int);//首次适应算法 int Next_fit(int); //循环首次适应算法 void showJob(int); //显示作业表 void showPartiton(DuLinkList);//显示分区表 DuLinkList InitpartitionList(DuLinkList &p);//初始化 void huishou(DuLinkList pl3,DuLinkList &pl);//回收函数 int Putin(int &n);//输入函数,输入作业相关信息 3、首次适应算法 空闲分区链以地址递增的次序链接,分配内存时,从链首开始顺序查找,直至找到一个大小能满足要求的空闲分区为止;然后再按照作业的大小,从该分区中划出一块内存空间分配给请求者,取消的空闲分区仍留在空闲链中。若从链首直至链尾都不能找到一个能满足要求的分区,则此次内存分配失败,返回。 4、循环首次适应算法 在为进程分配内存空间时,不再是每次都从链首开始查找,而是从上次找到的空闲分区的下一个空闲分区开始查找,直至找到一个能满足要求的空闲分区,从中划出一块与请求大小相等的内存空间分配给作业。

相关文档
相关文档 最新文档