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


    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;

    第一步:(第13周完成)

    完成程序数据结构的创建,初始化内存分配情况,创建空闲分区表和已分配分区表。

    源代码:

      1 #include <stdio.h> 
      2 #include <stdlib.h> 
      3 #include<string.h>
      4 #include <conio.h> 
      5 #define getpart(type) (type*)malloc(sizeof(type)) 
      6 #define MAX 24
      7 #define RAM 512
      8 #define SYSTEM 100
      9 struct partition { 
     10        char pn[10]; 
     11        char status; 
     12        int begin; 
     13        int size; 
     14        int end; 
     15 }; 
     16 
     17 typedef struct partition PART; 
     18 
     19 PART ram[MAX];
     20 menu2()
     21 {
     22     printf("
    		**************************");
     23     printf("
    		1.首次适应算法");                    
     24     printf("
    		2.最佳适应算法");
     25     printf("
    		3.最坏适应算法");
     26     printf("
    		4.循环首次适应算法
    ");
     27     printf("
    		**************************
    ");
     28 
     29 }
     30 void InputPart()
     31 {
     32     int flag ;
     33     char name[10];
     34     int size;
     35     int j = MAX-1;
     36     menu2();
     37 
     38     printf("请选择: ");
     39     scanf("%d",&flag);
     40     printf("
    
    请输入任务名:");
     41     scanf("%s",&name);
     42     printf("
    
    请输入需要空间:");
     43     scanf("%d",&size);
     44     if(flag == 1)//首次适应算法
     45     {
     46         int i=0;
     47         while(i<MAX)
     48         {
     49             if(ram[i].status == 'f' && ram[i].size >= size)
     50             {
     51                 
     52                 while(j>=i)
     53                 {
     54                     ram[j] = ram[j-1];
     55                     j--;
     56                 }
     57                 strcpy(ram[i].pn, name);
     58                 ram[i].begin = ram[i-1].end;
     59                 ram[i].size = size;
     60                 ram[i].end = ram[i].begin + ram[i].size;
     61                 ram[i].status = 'u';
     62 
     63                 ram[i+1].begin = ram[i].end;
     64                 ram[i+1].size = ram[i+1].size - ram[i].size;
     65                 break;
     66 
     67             }
     68             i++;
     69         }
     70     }
     71 
     72     else if(flag == 2)//最佳适应算法
     73     {
     74         j = MAX;
     75         int best = 512;
     76         int bi = 0;
     77         int i=0;
     78         while(i<MAX)
     79         {
     80             if(ram[i].status == 'f')
     81             {
     82                 if(best > ram[i].size)
     83                 {
     84                     best = ram[i].size;
     85                     bi = i;
     86                 }
     87             }
     88             i++;
     89         }
     90         if(ram[bi].status == 'f' && ram[bi].size >= size)
     91         {
     92             
     93             while(j>=bi)
     94             {
     95                 ram[j] = ram[j-1];
     96                 j--;
     97             }
     98             strcpy(ram[bi].pn, name);
     99             ram[bi].begin = ram[bi-1].end;
    100             ram[bi].size = size;
    101             ram[bi].end = ram[bi].begin + ram[bi].size;
    102             ram[bi].status = 'u';
    103 
    104             ram[bi+1].begin = ram[bi].end;
    105             ram[bi+1].size = ram[bi+1].size - ram[bi].size;
    106         }
    107 
    108 
    109 
    110 
    111     }
    112     else if(flag==4)//循环首次适应算法
    113     {
    114         int bi;
    115         int xh=0;
    116         int p=xh;
    117         int i=0;
    118         printf("从第%d项开始查找",xh);
    119         while(i<MAX)
    120         {
    121             if(ram[i].status == 'f' && ram[i].size >= size)
    122             {
    123                 //剩下公式!
    124                 while(j>=i)
    125                 {
    126                     ram[j] = ram[j-1];
    127                     j--;
    128                 }
    129                 strcpy(ram[i].pn, name);
    130                 ram[i].begin = ram[i-1].end;
    131                 ram[i].size = size;
    132                 ram[i].end = ram[i].begin + ram[i].size;
    133                 ram[i].status = 'u';
    134 
    135                 ram[i+1].begin = ram[i].end;
    136                 ram[i+1].size = ram[i+1].size - ram[i].size;
    137                 break;
    138                 xh=i;
    139                 printf("下次循环首次适应从第%d开始查找",xh);
    140                 
    141 
    142             }
    143             else
    144             {
    145                i++;
    146                if(i>MAX)
    147                {
    148                    i=0;
    149                }
    150             }
    151         }
    152 
    153 
    154 
    155     }
    156     else if(flag == 3)//最坏适应算法
    157     {
    158         j = MAX;
    159         int bad = 0;
    160         int bi = 0;
    161         int i=0;
    162         while(i<MAX)
    163         {
    164             if(ram[i].status == 'f')
    165             { 
    166                 if(bad < ram[i].size)
    167                 {
    168                     bad = ram[i].size;
    169                     bi = i;
    170                 }
    171             }
    172             i++;
    173         }
    174         if(ram[bi].status == 'f' && ram[bi].size >= size)
    175         {
    176             //剩下公式!
    177             while(j>=bi)
    178             {
    179                 ram[j] = ram[j-1];
    180                 j--;
    181             }
    182             strcpy(ram[bi].pn, name);
    183             ram[bi].begin = ram[bi-1].end;
    184             ram[bi].size = size;
    185             ram[bi].end = ram[bi].begin + ram[bi].size;
    186             ram[bi].status = 'u';
    187 
    188             ram[bi+1].begin = ram[bi].end;
    189             ram[bi+1].size = ram[bi+1].size - ram[bi].size;
    190         }
    191 
    192 
    193     
    194 
    195 
    196     }
    197 
    198 
    199 
    200 
    201 
    202 
    203 
    204 }
    205 
    206 void OutputPart()
    207 {
    208     int i = 0;
    209     printf("空闲区表FREE:
    ");
    210     while(i<MAX)
    211     {
    212         if(ram[i].status == 'f')
    213         {
    214             printf("No.%d	%s	%d	%d	%d	%c
    ",i+1,ram[i].pn,ram[i].begin,ram[i].size,ram[i].end,ram[i].status);
    215         }
    216         i++;
    217 
    218     }
    219     i = 0;
    220     printf("
    
    
    已分配区表USED:
    ");
    221     while(i<24)
    222     {
    223         if(ram[i].status == 'u')
    224         {
    225             printf("No.%d	%s	%d	%d	%d	%c
    ",i+1,ram[i].pn,ram[i].begin,ram[i].size,ram[i].end,ram[i].status);
    226         }
    227         i++;
    228     }
    229     printf("
    
    ");
    230 }
    231 
    232 
    233 
    234 void RecycleRAM()
    235 {
    236     //回收内存的时候要先判断在空间当中前后是否有空闲区间。
    237     char name[10];
    238     int i = 0;
    239 
    240     //当空闲表单中,作业前面有空闲区间时
    241     printf("
    请输入要回收的作业的ID:");
    242     scanf("%s",&name);
    243     while(i < MAX)
    244     {
    245         if(strcmp(name,ram[i].pn)==0)
    246         {
    247             printf("找到任务%d!!!
    ",i);
    248             if(i != 0 && i<MAX)
    249             {
    250                 if(ram[i-1].status == 'f' && ram[i+1].status == 'f')
    251                 {
    252                                 printf("
    1!!!
    ",i);
    253                     
    254                     //合并前后两个分区
    255                     ram[i-1].end = ram[i+1].end;
    256                     ram[i-1].size = ram[i-1].size + ram[i].size + ram[i+1].size;
    257                     ram[i-1].status = 'f';
    258                     for(int j = i ; j<MAX ; j++)   //
    259                     {
    260                         if(j+2 < MAX)
    261                             ram[j] = ram[j+2];
    262                     }
    263                 }
    264 
    265             }
    266             if(ram[i-1].status == 'f' && ram[i+1].status != 'f')
    267             {
    268                                                 printf("
    2!!!
    ",i);
    269                 ram[i-1].end = ram[i].end;
    270                 ram[i-1].size = ram[i-1].size + ram[i].size;
    271                 ram[i-1].status = 'f';
    272                 for(int j = i ; j<MAX ; j++)
    273                 {
    274                     if(j+1 <MAX)
    275                     {
    276                         ram[j] = ram[j+1];
    277                     }
    278                 }
    279             }
    280             else if(ram[i-1].status != 'f' && ram[i+1].status == 'f')
    281             {
    282                                                 printf("
    !!!
    ",i);
    283                 ram[i].end = ram[i+1].end;
    284                 ram[i].size = ram[i].size + ram[i+1].size;
    285                 ram[i].status = 'f';
    286                 for(int j = i+1 ; j<MAX ; j++)
    287                 {
    288                     if(j+1 < MAX)
    289                     {
    290                         ram[j] = ram[j+1];
    291                     }
    292                 }
    293             }
    294             else if(ram[i-1].status != 'f' && ram[i+1].status != 'f')
    295             {
    296                                                 printf("
    4!!!
    ",i);
    297                                                 
    298                 strcpy(ram[1].pn, "------");
    299                 ram[i].status = 'f';
    300 
    301             }
    302         }
    303         i++;
    304     }
    305 }
    306 menu()
    307 {
    308     printf("		****************************");
    309     printf("
    		1.添加任务");
    310     printf("
    		2.收回内存");
    311     printf("
    		3.显示任务
    ");
    312     printf("		****************************
    ");
    313 
    314 }
    315 
    316 
    317 void main()
    318 {
    319     int flag;
    320 
    321     strcpy(ram[0].pn, "SYSTEM");
    322     ram[0].begin = 0;
    323     ram[0].size = SYSTEM;
    324     ram[0].end = ram[0].begin + ram[0].size;
    325     ram[0].status = 'u';
    326 
    327     strcpy(ram[1].pn, "-----");
    328     ram[1].begin = ram[0].end;
    329     ram[1].size = RAM - ram[0].size;
    330     ram[1].end = RAM;
    331     ram[1].status = 'f';
    332 
    333     printf("初始化,设内存总量为512K
    ");
    334     printf("系统从低地址部分开始使用,占用100K
    
    ");
    335 
    336     OutputPart();
    337     while(1)
    338     {
    339         menu();
    340         scanf("%d",&flag);
    341             if(flag == 1)
    342                 InputPart();
    343             else if(flag == 2)
    344                 RecycleRAM();
    345             else if(flag == 3)
    346                 OutputPart();
    347     }
    348     
    349 
    350 
    351 
    352 
    353 }
  • 相关阅读:
    【随手记录】关于mysql的SSL证书登录
    【随手记录】关于ES安装的一些问题记录
    【随手记录】关于yml环境变量未配置,导致项目启动报NPE错误
    【随手记录】关于oracle修改最大连接
    【随手记录】关于 dockercompose.yml version 3里面deploy资源约束告警问题
    【随手记录】关于docker挂载路径必须为绝对路径
    【随手记录】关于浏览器调用摄像头样例
    【随手记录】关于idea调试时提示源码不匹配(source code does not match the bytecode)
    浅析报表的测试
    2022中级会计分录
  • 原文地址:https://www.cnblogs.com/caicaihong/p/5535163.html
Copyright © 2020-2023  润新知