视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
首次适应算法和循环首次适应算法
2025-10-02 12:39:10 责编:小OO
文档
首次适应算法和循环首次适应算法

一、实验目的

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

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

二、实验要求

1.在分配时,须按照一定的分配算法,从空闲分区表或空闲分区链中选取一分区分配给该作业

2.上机时完成编辑,调试程序。

三、实验任务

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

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

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

n 回收功能:

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

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

四、      实验指导

1.基本思想

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

2.数据结构

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

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

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

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

(2)、不申请存储区,自己定义一块虚拟的存储区,对这块存储区进行模拟的分配和回收活动,分配和回收仅仅是对数据结构的修改而已。

    程序代码:

#include

using namespace std;

int FreePartition[100];//空闲分区块数组

int FirstPartition[100];//首次适应算法数组

int CycleFirstPartition[100];//循环首次适应算法数组

int ProcessNeed[100];//每个作业的大小

int PartitionNum,ProcessNum;//分区块数,作业数

//首次适应算法

void First()

{

int i,j;

char str;

for(i=0;i{

FirstPartition[i]=FreePartition[i];

}

for(i=0;ifor(j=0;j{

if(ProcessNeed[i]>FirstPartition[j])

continue;

else

{

FirstPartition[j]-=ProcessNeed[i];//找到后把分区大小减去作业的大小

 ? ? ? ? ? ? ?str='A'+i;

cout<<"作业"<break;

}

}

cout<cout<<"分配之后剩余情况:"< ?for(i=0;icout<cout<}

//循环首次适应算法

void CycleFirst()

{

int i,j=1;

char str;

for(i=0;i{

CycleFirstPartition[i]=FreePartition[i];

}

for(i=0;i//for(j=0;j{

j=j-1;

while(j{

if(ProcessNeed[i]>CycleFirstPartition[j])

//continue;

j++;

else

{

CycleFirstPartition[j]-=ProcessNeed[i];

str='A'+i;

cout<<"作业"<break;

}

//j++;

//cout<if(j==PartitionNum && i!=ProcessNum)

{

i=-1;

}

}

}

cout<cout<<"分配之后剩余情况:"<for(i=0;icout<cout<}

void main()

{

int i;

cout<<"输入分区块数:"<cin>>PartitionNum;

cout<<"输入每个分区的大小:"<for(i=0;icin>>FreePartition[i];

cout<<"输入作业数:"<cin>>ProcessNum;

cout<<"输入每个作业的大小:"<for(i=0;icin>>ProcessNeed[i];

cout<<"------------首次适应算法-----------------"<First();

cout<<"------------循环首次适应算法-------------"< ?CycleFirst();

}

六、 实验总结  在一开始老师布置这次的实验题目时,自己根本不知道要干什么,因为在上课时对动态分区分配这节内容不是太了解,所以在上机时不知道如何下手,后来,将本章内容反复的看了几遍之后,终于有了自己的思路。  在程序的编写过程中,我并没有按照书上所说的定义了双向链表来实现各种算法的执行,我只简单的运用了结构体数组,通过这种方法比较容易理解与编写,在这几个算法中,只有循环首次适应算法编写起来有点困难,因为涉及到了循环,而其他的算法只运行一遍就能够得出所要的效果,因此在程序中,我使用了一个全局变量来掌控循环以及记录上次运行到的地方,只要理解了算法的主要思想,编写程序就比较容易了。  另外,还有一点是在本实验中还有一个算法没有编写,即快速适应算法,这个算法必须要求使用链表,因为要根据其容量大小进行分类,将其单独设立一个空闲的分区链表。这是程序需要改进的地方,由于这次临近考试,暂时没有编写,在以后的时间中,一定会将此算法编写出来。  下载本文

显示全文
专题