java动态分区分配_操作系统:存储管理动态分区分配及回收算法

这篇博客详细介绍了如何使用C语言实现Java动态分区分配的内存管理,包括首次适应和最佳适应算法,并提供了内存分配、回收及查看主存分配情况的函数。通过示例代码展示了如何创建内存空间链表,以及进行内存分配和回收的操作。
摘要由CSDN通过智能技术生成

#include

#include

#define Free 0 //空闲状态

#define Busy 1 //已用状态

#define OK 1 //完成

#define ERROR 0 //出错

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

typedef int Status;

int n=0;

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;

DuLinkList block_first; //头结点

DuLinkList block_last; //尾结点

Status alloc(int);//内存分配

Status free(int); //内存回收

Status First_fit(int,int);//首次适应算法

Status Best_fit(int,int); //最佳适应算法

void show();//查看分配

Status Initblock();//开创空间表

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

{

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

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

block_first->prior=NULL;

block_first->next=block_last;

block_last->prior=block_first;

block_last->next=NULL;

block_last->data.address=0;

block_last->data.size=MAX_length;

block_last->data.ID=0;

block_last->data.state=Free;

return OK;

}

//----------------------- 分 配 主 存 -------------------------

Status alloc(int ch)

{

int ID,request;

cout<

cin>>ID;

cout<

cin>>request;

if(request<0 ||request==0)

{

cout<

return ERROR;

}

if(ch==2) //选择最佳适应算法

{

if(Best_fit(ID,request)==OK) cout<

else cout<

return OK;

}

else //默认首次适应算法

{

if(First_fit(ID,request)==OK) cout<

else cout<

return OK;

}

}

//------------------ 首次适应算法 -----------------------

Status First_fit(int ID,int request)//传入作业名及申请量

{

//为申请作业开辟新空间且初始化

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

temp->data.ID=ID;

temp->data.size=request;

temp->data.state=Busy;

DuLNode *p=block_first->next;

while(p)

{

if(p->data.state==Free && p->data.size==request)

{//有大小恰好合适的空闲块

p->data.state=Busy;

p->data.ID=ID;

return OK;

break;

}

if(p->data.state==Free && p->data.size>request)

{//有空闲块能满足需求且有剩余"

temp->prior=p->prior;

temp->next=p;

temp->data.address=p->data.address;

p->prior->next=temp;

p->prior=temp;

p->data.address=temp->data.address+temp->data.size;

p->data.size-=request;

return OK;

break;

}

p=p->next;

}

return ERROR;

}

//-------------------- 最佳适应算法 ------------------------

Status Best_fit(int ID,int request)

{

int ch; //记录最小剩余空间

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

temp->data.ID=ID;

temp->data.size=request;

temp->data.state=Busy;

DuLNode *p=block_first->next;

DuLNode *q=NULL; //记录最佳插入位置

while(p) //初始化最小空间和最佳位置

{

if(p->data.state==Free &&

(p->data.size>request || p->data.size==request) )

{

q=p;

ch=p->data.size-request;

break;

}

p=p->next;

}

while(p)

{

if(p->data.state==Free && p->data.size==request)

{//空闲块大小恰好合适

p->data.ID=ID;

p->data.state=Busy;

return OK;

break;

}

if(p->data.state==Free && p->data.size>request)

{//空闲块大于分配需求

if(p->data.size-request

{

ch=p->data.size-request;//更新剩余最小值

q=p;//更新最佳位置指向

}

}

p=p->next;

}

if(q==NULL) return ERROR;//没有找到空闲块

else

{//找到了最佳位置并实现分配

temp->prior=q->prior;

temp->next=q;

temp->data.address=q->data.address;

q->prior->next=temp;

q->prior=temp;

q->data.address+=request;

q->data.size=ch;

return OK;

}

}

//----------------------- 主 存 回 收 --------------------

Status free(int ID)

{

DuLNode *p=block_first;

while(p)

{

if(p->data.ID==ID)

{

p->data.state=Free;

p->data.ID=Free;

if(p->prior->data.state==Free)//与前面的空闲块相连

{

p->prior->data.size+=p->data.size;

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

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

}

if(p->next->data.state==Free)//与后面的空闲块相连

{

p->data.size+=p->next->data.size;

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

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

}

break;

}

p=p->next;

}

return OK;

}

//--------------- 显示主存分配情况 ------------------

void show()

{

cout<

cout<

cout<

DuLNode *p=block_first->next;

while(p)

{

cout<

if(p->data.ID==Free) cout<

else cout<data.ID<

cout<data.address<

cout<data.size<

cout<

if(p->data.state==Free) cout<

else cout<

cout<

p=p->next;

}

}

//----------------------- 主 函 数---------------------------

void main()

{

int ch,d=0;//算法选择标记

cout<

cout<

cin>>ch;

if(ch==0||ch==1||ch==2) d++;

while(d==0)

{

cout<

cin>>ch;

if(ch==0||ch==1||ch==2) d++;

}

if(ch==0) exit(0);

if(n==0) Initblock(); //开创空间表

int choice; //操作选择标记

while(1)

{

cout<

cout<

cout<

cout<

cout<

cin>>choice;

if(choice==1)

{

alloc(ch); // 分配内存

n++;

}

else if(choice==2) // 内存回收

{

int ID;

cout<

cin>>ID;

free(ID);

n++;

}

else if(choice==3)

{

show();//显示主存

n++;

}

else if(choice==0)

{

main(); //退出

n++;

}

else //输入操作有误

{

cout<

continue;

}

}

}

13:42:472010-04-202010-04-2013:42:392010-04-20

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值