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

    实验四、主存空间的分配和回收

    1.    目的和要求

    1.1.           实验目的

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

    1.2.           实验要求

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

    (1)**设计一个作业申请队列以及作业完成后的释放顺序,实现主存的分配和回收。采用分区说明表进行。

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

    (3)设计一个空闲区说明表,以保存某时刻主存空间占用情况。

    把空闲区说明表的变化情况以及各作业的申请、释放情况显示。

    2.    实验内容

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

    3.    实验环境

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

    4.    参考数据结构:

    #include<stdio.h>

    #include<conio.h>

    #include<string.h>

    #define MAX 24

    struct partition{

         

          char pn[10];

          int begin;

          int size;

          int end;   ////////

          char status;  //////////

          };

    typedef struct partition PART;

     
    1 #include<stdio.h>
      2 #include<conio.h>
      3 #include<string.h>
      4 #define MAX 24
      5 #define Memory 512
      6 struct partition{
      7 
      8     char pn[10];
      9     int begin;
     10     int size;
     11     int end;
     12     char status;
     13 };
     14 typedef struct partition PART;
     15 PART Free[MAX],User[MAX],addresses[MAX];
     16 int sumFree,sumUsed,sumaddresses;
     17 
     18 void addFree(int i,int j)
     19 {
     20     strcpy(addresses[i].pn,Free[j].pn);
     21     addresses[i].begin=Free[j].begin;
     22     addresses[i].size=Free[j].size;
     23     addresses[i].status=Free[j].status;
     24 }
     25 void addUsed(int i,int j)
     26 {
     27     strcpy(addresses[i].pn,Used[j].pn);
     28     addresses[i].begin=Used[j].begin;
     29     addresses[i].size=Used[j].size;
     30 
     31     addresses[i].status=Used[j].status;
     32 }
     33 void init()
     34 {
     35     sumFree=0,sumUsed=0,sumaddresses=0;
     36     strcpy(Used[1].pn,"SYSTEM");
     37     Used[1].begin=0;
     38     Used[1].size=100;
     39     Used[1].status='u';
     40     sumUsed++;
     41 
     42     sumaddresses++;
     43     addUsed(sumaddresses,sumUsed);
     44     printf("初始化,设内存总容量为512k
    ");
     45     printf("系统从低地址部分开始使用,占用100k
    
    ");
     46 
     47     strcpy(Free[1].pn,"----");
     48     Free[1].begin=100;
     49     Free[1].size=Memory-Free[1].begin;
     50     Free[1].status='f';
     51     sumFree++;
     52 
     53     sumaddresses++;
     54     addFree(sumaddresses,sumFree);
     55 }
     56 
     57 void PT()
     58 {
     59     int i;
     60     printf("空闲区表Free
    ");
     61     printf("			No.	rproname	begin	size	status
    ");
     62     for(i=1;i<=sumFree;i++)
     63     printf("			No.%d	%s	%d	%d	%c
    ",i,Free[i].pn,Free[i].begin,Free[i].size,Free[i].status);
     64 
     65 
     66     printf("已分配分区表Used
    ");
     67     printf("			No.	rproname	begin	size	status
    ");
     68     for(i=1;i<=sumUsed;i++)
     69     printf("			No.%d	%s	%d	%d	%c
    ",i,Used[i].pn,Used[i].begin,Used[i].size,Used[i].status);
     70 
     71     printf("内存使用情况,按起始址增长的排:
    ");
     72     printf("			No.	rproname	begin	size	status
    ");
     73     for(i=1;i<=sumaddresses;i++)
     74     printf("			No.%d	%s	%d	%d	%c
    ",i,addresses[i].pn,addresses[i].begin,addresses[i].size,addresses[i].status);
     75 
     76 }
     77 int main()
     78 {
     79     init();
     80     PT();
     81     return 0;
     82 }
     83 
     84 
     85 
     86 
     87 
     88 
     89 #include "string.h"
     90 #include "iostream"
     91 using namespace std;
     92 #define FALSE 0
     93 #define TRUE 1
     94 #define W 10
     95 #define R 20
     96 int M=100;//进程的最大数为100
     97 int N=100;//资源的最大数为100
     98 int ALL_RESOURCE[W];//各种资源的数目总和
     99 int MAX[W][R]; //M个进程对N类资源最大资源需求量
    100 int AVAILABLE[R]; //系统可用资源数
    101 int ALLOCATION[W][R]; //M个进程已经得到N类资源的资源量
    102 int NEED[W][R]; //M个进程还需要N类资源的资源量
    103 int Request[R]; //请求资源个数
    104 
    105 
    106 void showdata() //函数showdata,输出资源分配情况
    107 {
    108    int i,j;
    109    cout<<"各种资源的总数量(all):"<<endl;
    110    cout<<" ";
    111    for (j=0;j<N;j++)cout<<" 资源"<<j<<": "<<ALL_RESOURCE[j];
    112    cout<<endl<<endl;
    113    cout<<"系统目前各种资源可用的数为(available):"<<endl;
    114    cout<<" ";
    115    for (j=0;j<N;j++)cout<<" 资源"<<j<<": "<<AVAILABLE[j];
    116    cout<<endl<<endl;
    117    cout<<" 各进程还需要的资源量(need):"<<endl<<endl;
    118    cout<<"       资源0"<<"     资源1"<<"    资源2"<<endl;
    119    for (i=0;i<M;i++)
    120    for (i=0;i<M;i++)
    121    {
    122      cout<<"进程p"<<i<<":   ";
    123      for (j=0;j<N;j++)cout<<NEED[i][j]<<"        ";;
    124      cout<<endl;
    125    }
    126    cout<<endl;
    127    cout<<" 各进程已经得到的资源量(allocation): "<<endl<<endl;
    128    cout<<"       资源0"<<"     资源1"<<"     资源2"<<endl;
    129    for (i=0;i<M;i++)
    130    {
    131      cout<<"进程p"<<i<<":    ";
    132      for (j=0;j<N;j++)cout<<ALLOCATION[i][j]<<"       ";
    133      cout<<endl;
    134    }
    135    cout<<endl;
    136 }
    137 void changdata(int k) //函数changdata,改变可用资源和已经拿到资源和还需要的资源的值
    138 {
    139    int j;
    140    for (j=0;j<N;j++)
    141    {
    142      AVAILABLE[j]=AVAILABLE[j]-Request[j];
    143      ALLOCATION[k][j]=ALLOCATION[k][j]+Request[j];
    144      NEED[k][j]=NEED[k][j]-Request[j];}}
    145 void rstordata(int k) //函数rstordata,恢复可用资源和已经拿到资源和还需要的资源的值
    146 {int j;
    147    for (j=0;j<N;j++)
    148    { AVAILABLE[j]=AVAILABLE[j]+Request[j];
    149      ALLOCATION[k][j]=ALLOCATION[k][j]-Request[j];
    150      NEED[k][j]=NEED[k][j]+Request[j];}}
    151 int chkerr(int s) //函数chkerr,检查是否安全
    152 { int WORK,FINISH[W];
    153     int i,j,k=0;
    154     for(i=0;i<M;i++)FINISH[i]=FALSE;
    155     for(j=0;j<N;j++)
    156      {
    157             WORK=AVAILABLE[j];
    158         i=s;
    159         do
    160             {
    161           if(FINISH[i]==FALSE&&NEED[i][j]<=WORK)
    162             {
    163                    WORK=WORK+ALLOCATION[i][j];
    164               FINISH[i]=TRUE;
    165               i=0;
    166             }
    167           else
    168             { i++;
    169             }
    170             }while(i<M);
    171         for(i=0;i<M;i++)
    172         if(FINISH[i]==FALSE)
    173             {
    174             cout<<endl;
    175            cout<<" 系统不安全!!! 本次资源申请不成功!!!"<<endl;
    176            cout<<endl;
    177            return 1;
    178             }
    179      }
    180     cout<<endl;
    181     cout<<" 经安全性检查,系统安全,本次分配成功。"<<endl;
    182     cout<<endl;
    183     return 0;
    184 }
    185 void bank()   //银行家算法
    186 {
    187      int i=0,j=0;
    188      char flag='Y';
    189     
    190      while(flag=='Y'||flag=='y')
    191      {
    192        i=-1;
    193        while(i<0||i>=M)
    194         {
    195          cout<<" 请输入需申请资源的进程号(从P0到P"<<M-1<<",否则重输入!):";
    196          cout<<"p";cin>>i;
    197          if(i<0||i>=M)cout<<" 输入的进程号不存在,重新输入!"<<endl;
    198         }
    199       cout<<" 请输入进程P"<<i<<"申请的资源数:"<<endl;
    200      for (j=0;j<N;j++)
    201      {
    202         cout<<" 资源"<<j<<": ";
    203         cin>>Request[j];
    204       if(Request[j]>NEED[i][j]) //若请求的资源数大于进程还需要i类资源的资源量j
    205      {
    206          cout<<" 进程P"<<i<<"申请的资源数大于进程P"<<i<<"还需要"<<j<<"类资源的资源量!";
    207          cout<<"申请不合理,出错!请重新选择!"<<endl<<endl;
    208          flag='N';
    209          break;
    210      }
    211     else
    212      {
    213      if(Request[j]>AVAILABLE[j]) //若请求的资源数大于可用资源数
    214      {
    215       cout<<" 进程P"<<i<<"申请的资源数大于系统可用"<<j<<"类资源的资源量!";
    216       cout<<"申请不合理,出错!请重新选择!"<<endl<<endl;
    217      flag='N';
    218       break;
    219             }
    220      }
    221      }
    222      if(flag=='Y'||flag=='y')
    223      {
    224       changdata(i); //调用changdata(i)函数,改变资源数
    225       if(chkerr(i)) //若系统安全
    226      {
    227          rstordata(i); //调用rstordata(i)函数,恢复资源数
    228          showdata();   //输出资源分配情况
    229      }
    230       else       //若系统不安全
    231       showdata(); //输出资源分配情况
    232      }
    233       else      //若flag=N||flag=n
    234       showdata();
    235       cout<<endl;
    236       cout<<" 是否继续银行家算法演示,按'Y'或'y'键继续,按'N'或'n'键退出演示: ";
    237       cin>>flag;
    238      }
    239 }
    240 void main() //主函数
    241 {
    242    int i=0,j=0,p;
    243    cout<<"请输入总进程数:"<<endl;
    244    cin>>M;
    245    cout<<"请输入总资源种类:"<<endl;
    246    cin>>N;
    247    cout<<"请输入总资源数:"<<endl;
    248    for(i=0;i<N;i++)
    249    cin>>ALL_RESOURCE[i];
    250    cout<<"依次输入各进程所需要的最大资源数量:"<<endl;
    251    for (i=0;i<M;i++)
    252    {
    253       for (j=0;j<N;j++)
    254      {
    255         do
    256          {
    257           cin>>MAX[i][j];
    258           if (MAX[i][j]>ALL_RESOURCE[j])
    259           cout<<endl<<"占有资源超过了声明的该资源总数,请重新输入"<<endl;
    260           }while (MAX[i][j]>ALL_RESOURCE[j]);
    261       }
    262 }
    263 cout<<"依次输入各进程已经占据的资源数量(allocation):"<<endl;
    264 for (i=0;i<M;i++)
    265 {
    266     for (j=0;j<N;j++)
    267      {
    268        do
    269          {
    270           cin>>ALLOCATION[i][j];
    271           if (ALLOCATION[i][j]>MAX[i][j])
    272           cout<<endl<<"占有资源超过了声明的最大资源,请重新输入"<<endl;
    273           }while (ALLOCATION[i][j]>MAX[i][j]);
    274          }
    275      }
    276      //初始化资源数量
    277       for (j=0;j<N;j++)
    278       { p=ALL_RESOURCE[j];
    279          for (i=0;i<M;i++)
    280           {
    281            p=p-ALLOCATION[i][j];//减去已经被占据的资源
    282            AVAILABLE[j]=p;
    283            if(AVAILABLE[j]<0)
    284            AVAILABLE[j]=0;
    285            }
    286      }
    287       for (i=0;i<M;i++)
    288       for(j=0;j<N;j++)
    289          NEED[i][j]=MAX[i][j]-ALLOCATION[i][j];
    290       showdata();
    291       bank();
    292 }
    

      实验结果与预期相符

     

  • 相关阅读:
    [bzoj1096][ZJOI2007]仓库建设
    [bzoj1010][HNOI2008]玩具装箱
    [bzoj2301][HAOI2011]Problem b
    [HDU1695]GCD
    [SDOI2006] 保安站岗
    [TJOI2007] 调整队形
    Luogu_1944 最长括号匹配
    [USACO07NOV] Milking Time
    [USACO13FEB] Tractor
    [模板] 一些要复习的模板
  • 原文地址:https://www.cnblogs.com/wqma/p/5628265.html
Copyright © 2011-2022 走看看