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

5 … … … 2.1.2 空闲分区链 用链头指针将系统中的空闲分区链接起来,构成空闲分区链。每个空闲分区的起始部分存放相应的控制信息(如大小,指向下一空闲分区的指针等).

2.2 模块说明

2.12.1 分区说明表 struct PST

{//partition specification table

int id;//分区号

int addr;//起始地址

int size;//分区长度 Status state;//状态

};

2.2.2 双向链表 struct Node

{//双向链表结点 PST data;

Node *back;//前驱

Node *next;//后继 Node() {

back=NULL; next=NULL; }

Node(int id,int size) {

data.ID=id; data.size=size; back=NULL; next=NULL; } };

2.2.3 最先适应算法

空闲分区(链)按地址递增的次序排列。在进行内存分配时,从空闲分区表/链首开始顺序查找,直到找到第一个满足其大小要求的空闲分区为止。然后再按照作业大小,从该分区中划出一块内存空间分配给请求者,余下的空闲分区仍留在空闲

分区表(链)中。

算法特点:优先利用内存低地址部分的空闲分区,从而保留了高地址部分的大空闲区。但由于低地址部分不断被划分,致使低地址端留下许多难以利用的很小的空闲分区(碎片或零头),而每次查找又都是从低地址部分开始,这无疑增加了查找可用空闲分区的开销。

Status FFA(int id,int size) {//head fit algorithm

Node *temp=new Node(id,size); temp->data.state=BUSY; Node *cur=head->next; while(cur) {

if(cur->data.state==FREE&&cur->data.size==size) {//如果空闲块大小刚好与请求大小相等,直接分配 cur->data.ID=id;

cur->data.state=BUSY; return OK; break; }

if(cur->data.state==FREE&&cur->data.size>size) {//如果大于

temp->back=cur->back; temp->next=cur;

cur->back->next=temp;

temp->data.addr=cur->data.addr; cur->back=temp;

cur->data.addr=cur->data.addr+size; cur->data.size=cur->data.size-size; return OK; break; }

cur=cur->next; }

return ERROR; }

2.2.4 最佳适应算法

空闲分区表/链按容量大小递增的次序排列。在进行内存分配时,从空闲分区表/链的首开始顺序查找,直到找到第一个满足其大小要求的空闲分区为止。按这种方式为作业分配内存,就能把既满足作业要求又与作业大小最接近的空闲分区分配给作业。如果该空闲分区大于作业的大小,则与首次适应算法相同,将剩余空闲分区仍留在空闲分区表/链中。

算法特点:若存在与作业大小一致的空闲分区,则它必然被选中,若不存在与作业大小一致的空闲分区,则只划分比作业稍大的空闲分区,,从而保留了大的空

闲分区,但空闲区一般不可能正好和它申请的内存空间大小一样,因而将其分割成两部分时,往往使剩下的空闲区非常小,从而在存储器中留下许多难以利用的小空闲区(碎片或零头)。

Status BFA(int id,int size) {//best fit algorithm

Node *temp=new Node(id,size); temp->data.state=BUSY;

int min;//记录符合满足请求的最小空闲块大小 Node *fit;//指向采用最佳适应算法的插入位置 Node *cur=head->next; while(cur)

{//取得第一个可以分配的位置(不一定是最佳位置) if(cur->data.state==FREE&&cur->data.size>=size) {

fit=cur;

min=cur->data.size-size; break; }

cur=cur->next; }

while(cur) {

if(cur->data.state==FREE&&cur->data.size==size) {//如果相等直接分配

cur->data.state=BUSY; cur->data.ID=id; return OK; break; }

if(cur->data.state==FREE&&cur->data.size>size) {//获取最佳位置

if(cur->data.size-size

min=cur->data.size-size; fit=cur; } }

cur=cur->next; } if(fit)

{//若最佳,插入

temp->back=fit->back; temp->next=fit;

fit->back->next=temp;

temp->data.addr=fit->data.addr; fit->back=temp;

fit->data.addr=fit->data.addr+size; fit->data.size=fit->data.size-size; return OK; } else

return ERROR;

}

2.2.5 最坏适应算法

空闲分区表/链按容量大小递减的次序排列。在进行内存分配时,从空闲分区表的首开始顺序查找,直到找到第一个比之大的空闲分区为止。剩下的空闲仍留在空闲分区表/链中。

算法特点:总是挑选满足作业要求的最大的分区分配给作业。这样使分给作业后剩下的空闲分区也较大,可装下其它作业。但由于最大的空闲分区总是因首先分配而划分,当有大作业到来时,其存储空间的申请往往会得不到满足。

Status WFA(int id,int size) {//worst fit algorithm

Node *temp=new Node(id,size); temp->data.state=BUSY;

int max;//记录符合满足请求的最小空闲块大小 Node *fit;//指向采用最坏适应算法的插入位置 Node *cur=head->next; while(cur)

{//取得第一个可以分配的位置(不一定是最佳位置) if(cur->data.state==FREE&&cur->data.size>=size) {

fit=cur;

max=cur->data.size-size; break; }

cur=cur->next; }

while(cur) {/*

if(cur->data.state==FREE&&cur->data.size==size) {//如果相等直接分配

cur->data.state=BUSY; cur->data.ID=id; return OK; break; }