• 实验四


    一、实验目的

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

    二、实验内容和要求

    采用连续分配方式之动态分区分配存储管理,使用首次适应算法、循环首次适应算法、最佳适应算法和最坏适应算法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 }

  • 相关阅读:
    A CIRCULAR PROGRESSBAR STYLE USING AN ATTACHED VIEWMODEL
    First MarkDown Blog
    Folder Recursion with C#
    39. Volume Rendering Techniques
    Service Station
    WPF Wonders: Transformations (and Robots!)
    Flipping elements with WPF
    FoLlow 的技术博客
    利用索引降低并发事务引起的锁【转】
    企业级应用架构模型-并发,事务,锁
  • 原文地址:https://www.cnblogs.com/44ZBW/p/4600919.html
Copyright © 2020-2023  润新知