zoukankan      html  css  js  c++  java
  • 实验四

    一、实验目的

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

    二、实验内容和要求

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

    (1)**设计一个作业申请队列以及作业完成后的释放顺序,实现主存的分配和回收。采用分区说明表进行。(2)或在程序运行过程,由用户指定申请与释放。

    (3)设计一个空闲区说明表,以保存某时刻主存空间占用情况。把空闲区说明表的变化情况以及各作业的申请、释放情况显示。

    代码:

     1 #include"stdio.h"
      2 #include"stdlib.h"
      3 struct{
      4     float address; /*已分分区起始地址*/
      5     float length; /*已分分区长度,*/
      6     int flag; /*已分配区表登记栏标志,用"0"表示空栏目*/
      7 }used_table[10]; /*已分配区表*/
      8
      9 struct{
    10     float address; /*空闲区起始地址*/
    11     float length; /*空闲区长度*/
    12     int flag; /*空闲区表登记栏标志,用"0"表示空栏目,用"1"表示未分配*/
    13 }free_table[10]; /*空闲区表*/
    14
    15
    16
    17 void allocate(char str,float leg);//分配主存空间函数首次适应
    18
    19 int allocate1(char str,float leg,int pre);//分配主存空间函数循环适应
    20 void reclaim(char str);//回收主存函数
    21 void input();
    22 int main()
    23 {
    24    
    25     int i;
    26    
    27     float length;
    28     char name;/*空闲分区表初始化:*/
    29     int suanfa;
    30     int caozuo;
    31     int pre=0;//循环首次适应算法的前一次扫描空闲表处,初始为0
    32     free_table[0].address=10240;
    33     free_table[0].length=102400;
    34     free_table[0].flag=1;
    35     for(i=1;i<10;i++)
    36         free_table[i].flag=0;/*已分配表初始化:*/
    37     for(i=0;i<10;i++)
    38         used_table[i].flag=0;
    39    
    40     input();
    41     printf("请选择算法 1.首次适应算法 2.循环首次适应算法");
    42     scanf("%d",&suanfa);
    43    
    44     if(suanfa==1)
    45     {
    46         while(1)
    47         {
    48             printf("请选择操作 1.分配 2.回收");
    49             scanf("%d",&caozuo);
    50             if(caozuo==1)
    51             {
    52                 /*a=1分配主存空间*/printf("输入进程名和作业所需长度: ");
    53                 scanf("%*c%c%f",&name,&length);
    54                 allocate(name,length);/*分配主存空间*/
    55             }else{
    56                 /*a=2回收主存空间*/printf("输入要回收分区的进程名");
    57                 scanf("%*c%c",&name);reclaim(name);/*回收主存空间*/
    58                
    59             }
    60             input();
    61         }
    62     }else{
    63         while(1)
    64         {
    65             printf("请选择操作 1.分配 2.回收");
    66             scanf("%d",&caozuo);
    67             if(caozuo==1)
    68             {
    69                 /*a=1分配主存空间*/printf("输入进程名和作业所需长度: ");
    70                 scanf("%*c%c%f",&name,&length);
    71                 pre=allocate1(name,length,pre);/*分配主存空间*/
    72             }else{
    73                 /*a=2回收主存空间*/printf("输入要回收分区的进程名");
    74                 scanf("%*c%c",&name);reclaim(name);/*回收主存空间*/
    75                
    76             }
    77             input();
    78         }
    79        
    80        
    81     }
    82     return 0;
    83 }
    84 void input()
    85 {
    86     int i;
    87    
    88     printf("输出空闲区表: 起始地址 分区长度 标志 ");
    89    
    90     for(i=0;i<10;i++)
    91     {
    92         printf("%6.0f%9.0f%6d ",free_table[i].address,free_table[i].length, free_table[i].flag);
    93     }
    94     printf(" 按任意键,输出已分配区表 ");
    95     getchar();
    96     printf(" 输出已分配区表: 起始地址 分区长度 标志 ");
    97     for(i=0;i<10;i++)
    98     {
    99        
    100         if(used_table[i].flag!=0)
    101             printf("%6.0f%9.0f%6c ",used_table[i].address,used_table[i].length, used_table[i].flag);
    102         else
    103             printf("%6.0f%9.0f%6d ",used_table[i].address,used_table[i].length, used_table[i].flag);
    104        
    105        
    106     }
    107 }
    108 int uflag;//分配表标志
    109 int fflag;//空闲表标志
    110 int allocate1(char str,float leg,int pre)
    111 {
    112    
    113     fflag=0;
    114     int k,i;
    115    
    116     for(i=pre;i<10;i++)
    117     {
    118         if(free_table[i].flag==1 && free_table[i].length>=leg)
    119         {
    120             fflag=1;break;
    121         }
    122        
    123     }
    124     if(fflag==0)
    125         printf("没有满足条件的空闲区 ");
    126     else
    127     {
    128        
    129         for(k=0;k<10;k++)
    130         {
    131             if(used_table[k].flag==0)
    132             {
    133                
    134                
    135                 used_table[k].length=leg;
    136                 used_table[k].address=free_table[i].address;
    137                 used_table[k].flag=str;
    138                 free_table[i].address=free_table[i].address+leg;
    139                 free_table[i].length=free_table[i].length-leg;
    140                 free_table[i].flag=1;
    141                 break;
    142             }
    143         }
    144     }
    145     return i;
    146    
    147 }
    148 void allocate(char str,float leg)
    149 {
    150    
    151     fflag=0;
    152     int k,i;
    153    
    154     for(i=0;i<10;i++)
    155     {
    156         if(free_table[i].flag==1 && free_table[i].length>=leg)
    157         {
    158             fflag=1;break;
    159         }
    160        
    161     }
    162     if(fflag==0)
    163         printf("没有满足条件的空闲区 ");
    164     else
    165     {
    166        
    167         for(k=0;k<10;k++)
    168         {
    169             if(used_table[k].flag==0)
    170             {
    171                
    172                
    173                 used_table[k].length=leg;
    174                 used_table[k].address=free_table[i].address;
    175                 used_table[k].flag=str;
    176                 free_table[i].address=free_table[i].address+leg;
    177                 free_table[i].length=free_table[i].length-leg;
    178                 free_table[i].flag=1;
    179                 break;
    180             }
    181         }
    182     }
    183    
    184 }
    185 void reclaim(char str)
    186 {
    187     float uend_address;
    188     float fend_address;
    189     uflag=0;fflag=0;
    190     int k,i;
    191     for(k=0;k<10;k++)
    192     {
    193         if(used_table[k].flag==str)
    194         {
    195             uflag=1;break;
    196         }
    197     }
    198     if(uflag==0)
    199         printf(" 找不到该进程! ");
    200     else
    201     {
    202         for(i=0;i<10;i++)
    203         {
    204             uend_address=used_table[k].address+used_table[k].length;
    205             fend_address=free_table[i].address+free_table[i].length;
    206             if(used_table[k].address==fend_address)//上邻
    207             {
    208                 fflag=1;
    209                 free_table[i].length=free_table[i].length+used_table[k].length;
    210                 free_table[i].flag=1;
    211                 used_table[k].flag=0;
    212                 used_table[k].length=0;
    213                 used_table[k].address=0;
    214                 printf(" 已回收! ");
    215                 break;
    216             }
    217             else
    218             {
    219                 if(free_table[i].address==uend_address)//下邻
    220                 {
    221                     fflag=1;
    222                     free_table[i].address=used_table[k].address;
    223                     free_table[i].length=free_table[i].length+used_table[k].length;
    224                     free_table[i].flag=1;
    225                     used_table[k].flag=0;
    226                     used_table[k].length=0;
    227                     used_table[k].address=0;
    228                     printf(" 已回收! ");
    229                     break;
    230                 }
    231             }
    232         }
    233         if(fflag==0)//上下领都没有空闲
    234         {
    235             i=0;
    236             for(i=0;i<10;i++)
    237             {
    238                 if(free_table[i].flag==0)
    239                 {
    240                     free_table[i].address=used_table[k].address;
    241                     free_table[i].length=used_table[k].length;
    242                     free_table[i].flag=1;
    243                     used_table[k].length=0;
    244                     used_table[k].flag=0;
    245                     used_table[k].address=0;
    246                     break;
    247                 }
    248             }
    249             printf(" 已回收! ");
    250         }
    251     }
    252 }

  • 相关阅读:
    高斯消元学习
    HDU 4596 Yet another end of the world(解一阶不定方程)
    Codeforces Round #318 div2
    HDU 4463 Outlets(一条边固定的最小生成树)
    HDU 4458 Shoot the Airplane(计算几何 判断点是否在n边形内)
    HDU 4112 Break the Chocolate(简单的数学推导)
    HDU 4111 Alice and Bob (博弈)
    POJ 2481 Cows(线段树单点更新)
    HDU 4288 Coder(STL水过)
    zoj 2563 Long Dominoes
  • 原文地址:https://www.cnblogs.com/44ZBW/p/4600919.html
Copyright © 2011-2022 走看看