zoukankan      html  css  js  c++  java
  • 实验四 主存空间的分配和回收模拟

    1. 实验目的
    为了合理地分配和使用这些存储空间,当用户提出申请主存储器空间时,存储管理必须根据申请者的要求,按一定的策略分析主存空间和使用情况,找出足够的空闲区域给申请者。当作业撤离归还主存资源时,则存储管理要收回占用的主存空间。主存的分配和回收的实现是与主存储器的管理方式有关的,通过本实验帮助我们理解在不同的存储管理方式下应怎样实现主存空间的分配和回收。

    用高级语言完成一个主存空间的分配和回收模拟程序,以加深对内存分配方式及其算法的理解。

    2. 实验内容
    2.1 模拟包括3部分:

    1)实现特定的内存分配算法

    2)实现内存回收模拟

    3)每种内存分配策略对应的碎片数统计

    2.2 固定分区存储管理

    假设内存容量为120KB,并且分别划分成8,16,32,64KB大小的块各一块。

    一个进程所需要的内存为0到100个KB。同时假设一个进程在运行过程中所需内存的大小不变。

    模拟五个进程到达请求分配与运行完回收情况,输出主存分配表.

    2.3 动态分区分配存储管理

    采用连续分配方式之动态分区分配存储管理,使用首次适应算法、下次适应算法、最佳适应算法和最坏适应算法4种算法完成设计(任选两种算法)。

    (1)在程序运行过程,由用户指定申请与释放。

    (2)设计一个已占用分区表,以保存某时刻主存空间占用情况。

    (3)设计一个空闲分区表,以保存某时刻主存空间剩余情况。

    (4)用两个表的变化情况,反应各进程所需内存的申请与释放情况。

    3. 实验环境
    根据指定的实验课题,完成设计、编码和调试工作,完成实验报告。

    可以选用Turbo C作为开发环境。也可以选用Windows下的VB,CB或其他可视化环境,利用各种控件较为方便。自主选择实验环境。

    3. 源代码

    #include<stdio.h>

    #include<iostream.h>

    #include<iomanip.h>

    #include<malloc.h>

    #include<string.h>

    #include<stdlib.h>


    int bitmap[8][8]={

    {1,1,0,0,1,1,1,0},

    {0,1,0,1,0,1,0,0},

    {0,0,0,0,0,0,0,0},

    {1,0,0,0,0,0,0,1},

    {0,0,0,0,0,0,0,0},

    {0,0,0,0,0,0,0,0},

    {0,0,0,0,0,0,0,0},

    {0,0,0,0,0,0,0,0}

    };

    int freecount=54;


    typedef struct yebiao

    {

    int yehao; // 页号

    int kuaihao; //块号

    struct yebiao *next;

    }YEBIAO;


    typedef struct progress

    {

    char name[30];

    int size;

    struct progress *next;

    struct yebiao *yb;

    }PROGRESS;


    /*分配内存函数,为进程分配所需要的内存并建立页表*/

    YEBIAO *allocation(int size)

    {

    YEBIAO *head;

    YEBIAO *tem;

    int n=0;

    tem=(YEBIAO *)malloc(sizeof(YEBIAO));

    head=tem;

    for(int i=0;;i++) {

    if(bitmap[i/8][i%8]==1) continue;

    if(bitmap[i/8][i%8]==0)

    {

    bitmap[i/8][i%8]=1; tem->yehao=n; tem->kuaihao=i;

    tem->next=NULL;

    n++;

    }

    if(n==size) break;

    else

    {

    tem->next=(YEBIAO *)malloc(sizeof(YEBIAO));

    tem=tem->next;

    }

    }

    return head;

    }


    /*回收内存*/

    void recovery(YEBIAO *a)

    {

    YEBIAO *b;

    while(a->next!=NULL)

    {

    bitmap[a->kuaihao/8][a->kuaihao%8]=0; b=a->next;

    free(a);

    a=b;

    }

    bitmap[a->kuaihao/8][a->kuaihao%8]=0;

    free(a);


    }

    void outputyebiao(YEBIAO *a)

    {

    cout<<"-------------------------"<<endl;

    do

    {

    cout<<a->yehao<<setw(4)<<a->kuaihao<<setw(4)<<endl;

    a=a->next;

    }while(a!=NULL); cout<<"-------------------------"<<endl;

    }


    void outputbit()

    {

    cout<<"主存分配位视图如下:"<<endl;

    cout<<"------------------------------"<<endl;

    for(int i=0;i<8;i++)

    {

    for(int j=0;j<8;j++)

    {

    cout<<bitmap[i][j]<<setw(4); }

    cout<<endl;

    }

    cout<<"------------------------------"<<endl;

    }


    PROGRESS *insert(PROGRESS *head,PROGRESS *b)

    {

    PROGRESS *tem;

    if(head==NULL)

    {

    head=b;

    b->next=NULL;

    }

    else
    {

    tem=head;

    while(tem->next!=NULL)

    {

    tem=tem->next;

    }

    tem->next=b;

    }

    return head;

    }


    PROGRESS *getprosess(PROGRESS *head)

    {

    PROGRESS *a;

    char na[30];

    int size;

    cout<<"请输入进程名:";

    cout<<"请输入进程所;cin>>size;;if(size>freecount)//如;cout<<"进程所需内存;returnhead;;a=(PROGRESS*)malloc(size;a->size=size;;freecount-=size;


    cout<<"请输入进程所占内存大小:";

    cin>>size;

    if(size>freecount)

    {

    cout<<"进程所需内存的大小大于空闲的内存,无法添加进程。"<<endl;

    return head;

    }

    a=(PROGRESS *)malloc(sizeof(PROGRESS)); strcpy(a->name,na);

    a->size=size;

    freecount-=size;

    a->yb=allocation(size);

    cout<<"进程创建成功!"<<endl;

    a->next=NULL;

    return insert(head,a);

    }


    void outputprosess(PROGRESS *head)

    {

    if(head==NULL)

    {

    cout<<"当前没有进程!"<<endl;

    return;

    }

    do

    {

    cout<<"进程名为:"<<head->name<<" 进程所占内存的大小为:"<<head->size<<"页"<<endl;

    cout<<"进程的页表如下:"<<endl;

    outputyebiao(head->yb);

    head=head->next;

    }while(head!=NULL);

    }


    PROGRESS * delecteprosess(PROGRESS *head)

    {

    char na[30];

    PROGRESS *a,*b;

    cout<<"请输入要删除的进程名:";

    if(head==NULL) {

    cout<<"进程链表为空,没有进程可删除。"<<endl;

    return NULL;

    }

    if(strcmp(head->name,na)==0)

    {

    recovery(head->yb); freecount+=head->size;

    a=head->next;

    free(head); cout<<"进程"<<na<<"删除成功!"<<endl;

    return a;

    }

    a=head->next;

    b=head;

    while(a!=NULL) {

    if(strcmp(a->name,na)==0)

    {

    recovery(a->yb);

    freecount+=a->size;

    b->next=a->next;

    free(a);

    cout<<"进程"<<na<<"删除成功!"<<endl;

    return head;

    }

    b=a;

    a=a->next;

    }

    cout<<"您输入的进程名不对,删除进程失败。"<<endl;

    return head;

    }


    void outbiaoti()

    {

    cout<<" 主存空间的分配与回收模拟"<<endl;

    cout<<"您可进行如下操作: 1.查看内存分配情况; 2.查看进程; 3.添加进程 4.删除进程"<<endl;

    cout<<" 可用内存为"<<freecount<<endl;

    }


    void main()

    {

    int n;

    PROGRESS *head; head=NULL;

    system("color 2f");

    outbiaoti();

    for(;;)

    {

    cin>>n;

    switch(n)

    {

    case 1: outputbit();outbiaoti();break;

    case 2: system("cls");outputprosess(head);outbiaoti();break; case 3: system("cls");head=getprosess(head); outbiaoti();break; case 4: system("cls");head=delecteprosess(head); outbiaoti();break; default: break;

    }

    }

    }

  • 相关阅读:
    CentOS 7源码安装zabbix
    CentOS 7 yum安装Zabbix
    Centos 7配置LAMP
    Oracle 12c RMAN备份文档
    Oracle 12c: RMAN restore/recover pluggable database
    Oracle 12c利用数据泵DataPump进行Oracle数据库备份
    EBS测试环境DataGuard配置
    oracle数据库将一列的值拼接成一行,并且各个值之间用逗号隔开
    ORA-19602: cannot backup or copy active file in NOARCHIVELOG mode
    rman输出日志的几种方法(转)
  • 原文地址:https://www.cnblogs.com/georgechou666/p/5090436.html
Copyright © 2011-2022 走看看