动态多分区存储管理模拟系统

编写程序,由必要的数据结构、主函数、主存分配函数和主存回收函数构成,实现在
动态多分区管理方式下对主存分配与回收的模拟。要求程序运行时:
(1)显示一个主菜单:初始化、显示主存使用情况、模拟分配、模拟回收、退出。
(2)模拟分配:输入进程名、容量;进入二级菜单选择使用 First_Fit 还是 Best_Fit。
在主存分配函数中,要求实现的基本功能操作:寻找空闲分区,空闲分区表的修改,
已分配分区表的修改。
(3)模拟回收:输入进程名,回收时合并相邻空闲区。
在主存回收函数中,要求实现的基本功能操作:回收作业释放的分区、修改已分配分
区表、修改空闲分区表。其中,若回收的分区有上邻空闲分区或(和)下邻空闲分区的,
要合并成为一个空闲分区,登记在空闲分区表的一个表项里。
(4)显示主存使用情况的功能随时可调用

程序用链表实现

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <string>
#include <pthread.h>
#include <malloc.h>
#include <semaphore.h>
using namespace std;
struct node
{
    string name;
    int address;
    int length;
    struct node* next;
};
struct node* free_list;
struct node* used_list;
struct node* built(struct node* p,int address=0,int length=0,string name="")
{
    p->next=new(node);
    struct node* q=p->next;
    q->name=name;
    q->address=address;
    q->length=length;
    q->next=NULL;
    return q;
}
void delete_node(node* p,node* q)
{
    p->next=q->next;
    free(q);
}
void insert_node(node* p)
{
    p->next=used_list->next;
    used_list->next=p;
}
void init()
{
    free_list=new(node);
    free_list->address=free_list->length=0;
    free_list->next=NULL;
    used_list=new(node);
    used_list->address=used_list->length=0;
    used_list->next=NULL;
    printf("请输入主存容量: ");
    int x;scanf("%d",&x);
    built(free_list,0,x);
    printf("初始化成功!\n");
}
void show()
{
    struct node *p=free_list->next;
    printf("未分配:\n");
    if(p==NULL)
        printf("无\n");
    else
    {
        while(p!=NULL)
        {
            printf("起始位置:%d 容量:%d\n",p->address,p->length);
            p=p->next;
        }
    }
    p=used_list->next;
    printf("已分配:\n");
    if(p==NULL)
        printf("无\n");
    else
    {
        while(p!=NULL)
        {
            printf("进程名:");
            cout<<p->name;
            printf(" 起始位置:%d 容量:%d\n",p->address,p->length);
            p=p->next;
        }
    }
}
void First_Fit(node* p)
{
    node* now=free_list->next;
    node* pre=free_list;
    bool flag=false;
    while(now!=NULL)
    {
        if(now->length>=p->length)
        {
            flag=true;
            now->length-=p->length;
            p->address=now->address;
            now->address+=p->length;
            if(now->length==0)
            delete_node(pre,now);
            insert_node(p);
            break;
        }
        now=now->next;
        pre=pre->next;
    }
    if(flag)
    printf("分配成功 地址为:%d\n",p->address);
    else
    printf("内存不足 分配失败\n");
}
void Best_Fist(node* p)
{
    node* now=free_list->next;
    node* pre=free_list;
    node* bestnow=now;
    node* bestpre=pre;
    bool flag=false;
    while(now!=NULL)
    {
        if(now->length>=bestnow->length&&now->length>=p->length)
        {
            flag=true;
            bestnow=now;
            bestpre=pre;
        }
        now=now->next;
        pre=pre->next;
    }
    if(!flag)
    {
        printf("内存不足 分配失败\n");
        return;
    }
    bestnow->length-=p->length;
    p->address=bestnow->address;
    bestnow->address+=p->length;
    if(bestnow->length==0)
    delete_node(bestpre,bestnow);
    insert_node(p);
    printf("分配成功 地址为:%d\n",p->address);
}
void allocate()
{
    struct node* p=new(node);
    p->next=NULL;
    printf("请输入进程名: ");
    cin>>p->name;
    printf("请输入进程容量: ");
    cin>>p->length;
    printf("1.First_Fit\n");
    printf("2.Best_Fist\n");
    printf("请选择需要使用的分配算法: ");
    int ti;
    cin>>ti;
    if(ti==1)
    First_Fit(p);
    else
    Best_Fist(p);
}
void fixpre(node* pre,node* p,node* now)
{
    pre->length+=p->length;
    if(pre->address+pre->length==now->address)
    {
        pre->length+=now->length;
        delete_node(pre,now);
    }
}
void fixback(node* p,node* now)
{
    now->address=p->address;
    now->length+=p->length;
}
void fixmid(node* pre,node* p,node* now)
{
    p->next=now;
    pre->next=p;
}
void recovery_find(node* p)
{
    node* now=free_list->next;
    node* pre=free_list;
    if(p->address+p->length<=now->address)
    {
        p->next=pre->next;
        pre->next=p;
        return;
    }
    while(now!=NULL)
    {
        if((pre->address+pre->length<=p->address)&&(p->address+p->length<=now->address))
        {
            if(pre->address+pre->length==p->address)
            fixpre(pre,p,now);
            else if(p->address+p->length==now->address)
            fixback(p,now);
            else
            fixmid(pre,p,now);
            return;
        }
        now=now->next;
        pre=pre->next;
    }
    if(pre->address+pre->length<p->address)
    {
        pre->next=p;
        p->next=NULL;
    }
}
void recovery()
{
    string process_name;
    printf("请输入进程名: ");
    cin>>process_name;
    node* now=used_list->next;
    node* pre=used_list;
    bool flag=false;
    while(now!=NULL)
    {
        if(now->name==process_name)
        {
            flag=true;
            pre->next=now->next;
            // show();
            recovery_find(now);
            break;
        }
        now=now->next;
        pre=pre->next;
    }
    if(flag)
    printf("回收成功\n");
    else
    printf("回收失败 未查找到\n");
}
int main(int argc, char const *argv[]) {
    printf("\033c");
    printf("----------------------------------------\n");
    printf("-        动态多分区存储管理模拟系统    -\n");
    printf("-                                      -\n");
    printf("-                                      -\n");
    printf("-             1.初始化                 -\n");
    printf("-             2.显示主存使用情况       -\n");
    printf("-             3.模拟分配               -\n");
    printf("-             4.模拟回收               -\n");
    printf("-             0.退出                   -\n");
    printf("-                                      -\n");
    printf("----------------------------------------\n");
    int ti;
    while(1)
    {
        printf("--请选择功能选项:  ");
        scanf("%d",&ti);
        if(ti==1)
        init();
        else if(ti==2)
        show();
        else if(ti==3)
        allocate();
        else if(ti==4)
        recovery();
        else if(ti==0)
        {
            delete(free_list),delete(used_list);
            break;
        }
    }
    return 0;
}

 

  • 1
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值