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

实验目的

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

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。

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

//首次适应算法
Status First_fit(int request)
{
    //为申请作业开辟新空间且初始化
    DuLinkList temp=(DuLinkList)malloc(sizeof(DuLNode));
    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.number = number;//显示作业号 
             return OK;
        }
        if(p->data.state==Free && p->data.size>request)
        {//有空闲块能满足需求且有剩余

            //待补全
            p->data.size = p->data.size-temp->data.size;
            temp->prior=p->prior;
            p->prior=temp;
            temp->next = p;
            temp->prior->next = temp;
            temp->data.address = p->data.address;
            p->data.address = temp->data.address+temp->data.size;
            temp->data.number = number;//显示作业号 
            return OK;

        }
        p=p->next;
    }
    return ERROR;
}

//最佳适应算法
Status Best_fit(int request)
{
    int ch; //记录最小剩余空间
    DuLinkList temp=(DuLinkList)malloc(sizeof(DuLNode));
    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) )
        {
            if(q==NULL)
            {
                //待补全
                q = p;

            }
            else if(q->data.size > p->data.size)
            {
                //待补全
                q = p;
            }
        }
        p=p->next;
    }

    if(q==NULL) return ERROR;//没有找到空闲块
    else if(q->data.size==request)
    {
        //待补全
        q->data.state = Busy;
        q->data.number = number;//显示作业号 
    }
    else
    {
        //待补全
        q->data.size = q->data.size - temp->data.size;
        temp->prior=q->prior;
        q->prior=temp;
        temp->next = q;
        temp->prior->next = temp;
        temp->data.address = q->data.address;
        q->data.address = temp->data.address+temp->data.size;
		temp->data.number = number;//显示作业号 
    }
    return OK;
}

//最差适应算法
Status Worst_fit(int request)
{
    int ch; //记录最大剩余空间
    DuLinkList temp=(DuLinkList)malloc(sizeof(DuLNode));
    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) )
        {
            if(q==NULL)
            {
                //待补全
                q = p;
            }
            else if(q->data.size < p->data.size)
            {
                //待补全
                q = p;
            }
        }
        p=p->next;
    }

    if(q==NULL) return ERROR;//没有找到空闲块
    else if(q->data.size==request)
    {
        //待补全
        q->data.state = Busy;
        q->data.number = number;//显示作业号 
    }
    else
    {
        //待补全
        q->data.size = q->data.size - temp->data.size;
        temp->prior=q->prior;
        q->prior=temp;
        temp->next = q;
        temp->prior->next = temp;
        temp->data.address = q->data.address;
        q->data.address = temp->data.address+temp->data.size;
        temp->data.number = number;//显示作业号 
    }
    return OK;
}
//显示主存分配情况
void show()
{
    int flag = 0;
    cout<<"\n主存分配情况:\n";
    cout<<"++++++++++++++++++++++++++++++++++++++++++++++\n\n";
    DuLNode *p=block_first->next;
    cout<<"分区号\t起始地址\t分区大小\t状态\n\n";
    while(p)
    {
        cout<<"  "<<flag++<<"\t";
        cout<<"  "<<p->data.address<<"\t\t";
        cout<<" "<<p->data.size<<"KB\t\t";
        if(p->data.state==Free) cout<<"空闲\n\n";
        else cout<<p->data.number<<"已分配\n\n";
        p=p->next;
    }
    cout<<"++++++++++++++++++++++++++++++++++++++++++++++\n\n";

首次适应算法

最佳适应算法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值