zoukankan      html  css  js  c++  java
  • 0617 操作系统实验4 主存空间的分配和回收

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

                                                                     专业:商业软件2班   姓名:列志华  学号:201406114254

    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;

    5、源代码

      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 
     21 int current = 0;
     22 
     23 void InputPart()
     24 {
     25     int flag ;
     26     char name[10];
     27     int size;
     28     int j = MAX-1;
     29     printf("
    1.首次适应算法");
     30     printf("
    2.最佳适应算法");
     31     printf("
    3.最坏适应算法");
     32     printf("
    4.循环首次适应算法
    ");
     33 
     34     printf("请选择: ");
     35     scanf("%d",&flag);
     36     printf("
    
    请输入任务名:");
     37     scanf("%s",&name);
     38     printf("
    
    请输入需要空间:");
     39     scanf("%d",&size);
     40     if(flag == 1)
     41     {
     42         int i=0;
     43         while(i<MAX)
     44         {
     45             if(ram[i].status == 'f' && ram[i].size >= size)
     46             {
     47                 //剩下公式!
     48                 while(j>=i)
     49                 {
     50                     ram[j] = ram[j-1];
     51                     j--;
     52                 }
     53                 strcpy(ram[i].pn, name);
     54                 ram[i].begin = ram[i-1].end;
     55                 ram[i].size = size;
     56                 ram[i].end = ram[i].begin + ram[i].size;
     57                 ram[i].status = 'u';
     58 
     59                 ram[i+1].begin = ram[i].end;
     60                 ram[i+1].size = ram[i+1].size - ram[i].size;
     61                 break;
     62 
     63             }
     64             i++;
     65         }
     66     }
     67     else if(flag == 2)
     68     {
     69         j = MAX;
     70         int best = 512;
     71         int bi = 0;
     72         int i=0;
     73         while(i<MAX)
     74         {
     75             if(ram[i].status == 'f')
     76             {
     77                 if(best > ram[i].size)
     78                 {
     79                     best = ram[i].size;
     80                     bi = i;
     81                 }
     82             }
     83             i++;
     84         }
     85         if(ram[bi].status == 'f' && ram[bi].size >= size)
     86         {
     87             //剩下公式!
     88             while(j>=bi)
     89             {
     90                 ram[j] = ram[j-1];
     91                 j--;
     92             }
     93             strcpy(ram[bi].pn, name);
     94             ram[bi].begin = ram[bi-1].end;
     95             ram[bi].size = size;
     96             ram[bi].end = ram[bi].begin + ram[bi].size;
     97             ram[bi].status = 'u';
     98 
     99             ram[bi+1].begin = ram[bi].end;
    100             ram[bi+1].size = ram[bi+1].size - ram[bi].size;
    101         }
    102     }
    103     else if(flag == 3)
    104     {
    105         j = MAX;
    106         int bad = 0;
    107         int bi = 0;
    108         int i=0;
    109         while(i<MAX)
    110         {
    111             if(ram[i].status == 'f')
    112             {
    113                 if(bad < ram[i].size)
    114                 {
    115                     bad = ram[i].size;
    116                     bi = i;
    117                 }
    118             }
    119             i++;
    120         }
    121         if(ram[bi].status == 'f' && ram[bi].size >= size)
    122         {
    123             //剩下公式!
    124             while(j>=bi)
    125             {
    126                 ram[j] = ram[j-1];
    127                 j--;
    128             }
    129             strcpy(ram[bi].pn, name);
    130             ram[bi].begin = ram[bi-1].end;
    131             ram[bi].size = size;
    132             ram[bi].end = ram[bi].begin + ram[bi].size;
    133             ram[bi].status = 'u';
    134 
    135             ram[bi+1].begin = ram[bi].end;
    136             ram[bi+1].size = ram[bi+1].size - ram[bi].size;
    137         }
    138     }
    139     else if(flag == 4)
    140     {
    141         int i=current;
    142         while(i<MAX)
    143         {
    144             if(ram[i].status == 'f' && ram[i].size >= size)
    145             {
    146                 //剩下公式!
    147                 while(j>=i)
    148                 {
    149                     ram[j] = ram[j-1];
    150                     j--;
    151                 }
    152                 strcpy(ram[i].pn, name);
    153                 ram[i].begin = ram[i-1].end;
    154                 ram[i].size = size;
    155                 ram[i].end = ram[i].begin + ram[i].size;
    156                 ram[i].status = 'u';
    157 
    158                 ram[i+1].begin = ram[i].end;
    159                 ram[i+1].size = ram[i+1].size - ram[i].size;
    160 
    161                 current = i;
    162                 break;
    163 
    164             }
    165             i++;
    166         }
    167         
    168 
    169     }
    170 }
    171 
    172 void OutputPart()
    173 {
    174     int i = 0;
    175     printf("空闲区表FREE:
    ");
    176     while(i<MAX)
    177     {
    178         if(ram[i].status == 'f')
    179         {
    180             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);
    181         }
    182         i++;
    183 
    184     }
    185     i = 0;
    186     printf("
    
    
    已分配区表USED:
    ");
    187     while(i<24)
    188     {
    189         if(ram[i].status == 'u')
    190         {
    191             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);
    192         }
    193         i++;
    194     }
    195     printf("
    
    ");
    196 }
    197 
    198 
    199 
    200 void RecycleRAM()
    201 {
    202     //回收内存的时候要先判断在空间当中前后是否有空闲区间。
    203     char name[10];
    204     int i = 0;
    205 
    206     //当空闲表单中,作业前面有空闲区间时
    207     printf("
    请输入要回收的作业的ID:");
    208     scanf("%s",&name);
    209     while(i < MAX)
    210     {
    211         if(strcmp(name,ram[i].pn)==0)
    212         {
    213             printf("找到任务%d!!!
    ",i);
    214             if(i != 0 && i<MAX)
    215             {
    216                 if(ram[i-1].status == 'f' && ram[i+1].status == 'f')   //
    217                 {
    218                                 printf("
    @@@1!!!
    ",i);
    219                     
    220                     //合并前后两个分区
    221                     ram[i-1].end = ram[i+1].end;
    222                     ram[i-1].size = ram[i-1].size + ram[i].size + ram[i+1].size;
    223                     ram[i-1].status = 'f';
    224                     strcpy(ram[i-1].pn, "------");
    225                     for(int j = i ; j<MAX ; j++)   //
    226                     {
    227                         if(j+2 < MAX)
    228                             ram[j] = ram[j+2];
    229                     }
    230                 }
    231 
    232             }
    233             if(ram[i-1].status == 'f' && ram[i+1].status != 'f')
    234             {
    235                                                 printf("
    @@@2!!!
    ",i);
    236                 ram[i-1].end = ram[i].end;
    237                 ram[i-1].size = ram[i-1].size + ram[i].size;
    238                 ram[i-1].status = 'f';
    239                 strcpy(ram[i-1].pn, "------");
    240                 for(int j = i ; j<MAX ; j++)
    241                 {
    242                     if(j+1 <MAX)
    243                     {
    244                         ram[j] = ram[j+1];
    245                     }
    246                 }
    247             }
    248             else if(ram[i-1].status != 'f' && ram[i+1].status == 'f')
    249             {
    250                                                 printf("
    @@@3!!!
    ",i);
    251                 ram[i].end = ram[i+1].end;
    252                 ram[i].size = ram[i].size + ram[i+1].size;
    253                 ram[i].status = 'f';
    254                 strcpy(ram[i].pn, "------");
    255                 for(int j = i+1 ; j<MAX ; j++)
    256                 {
    257                     if(j+1 < MAX)
    258                     {
    259                         ram[j] = ram[j+1];
    260                     }
    261                 }
    262             }
    263             else if(ram[i-1].status != 'f' && ram[i+1].status != 'f')
    264             {
    265                                                 printf("
    @@@4!!!
    ",i);
    266                 strcpy(ram[i].pn, "------");
    267                 ram[i].status = 'f';
    268 
    269             }
    270         }
    271         i++;
    272     }
    273 }
    274 
    275 
    276 
    277 void main()
    278 {
    279     int flag;
    280 
    281     strcpy(ram[0].pn, "SYSTEM");
    282     ram[0].begin = 0;
    283     ram[0].size = SYSTEM;
    284     ram[0].end = ram[0].begin + ram[0].size;
    285     ram[0].status = 'u';
    286 
    287     strcpy(ram[1].pn, "-----");
    288     ram[1].begin = ram[0].end;
    289     ram[1].size = RAM - ram[0].size;
    290     ram[1].end = RAM;
    291     ram[1].status = 'f';
    292 
    293     printf("初始化,设内存总量为512K
    ");
    294     printf("系统从低地址部分开始使用,占用100K
    
    ");
    295 
    296     OutputPart();
    297     while(1)
    298     {
    299         printf("
    1.添加任务");
    300         printf("
    2.收回内存");
    301         printf("
    3.显示任务
    ");
    302         scanf("%d",&flag);
    303             if(flag == 1)
    304                 InputPart();
    305             else if(flag == 2)
    306             //    printf("建设中,暂时未对外开放!!
    
    ");
    307                 RecycleRAM();
    308             else if(flag == 3)
    309                 OutputPart();
    310     }
    311 }

    结果截图:

    6、总结

         今次实验主要是了解和区分首次适应算法、循环首次适应算法、和最坏适应算法3种算法,

    虽然代码有点繁琐,但是只要掌握了原理和理清楚思路,那么做起来时也就没有那么复杂了。

    最重要的是三种算法的运用,还有就是回收的时候要分情况来回收。

  • 相关阅读:
    单片机数字滤波的算法!
    Python中列表的兄弟
    史上最全的Python程序员面试必备常用问题
    新人在学习web前端的容易踩哪些坑?
    linux+arm系统学习与基础学习
    C和C++笔记:动态内存管理
    Python 爬虫干货之urllib库
    单片机、ARM、MUC、DSP、FPGA、嵌入式错综复杂的关系!
    单片机死机了怎么办?
    单片机各种复位电路原理
  • 原文地址:https://www.cnblogs.com/liezhihua/p/5593794.html
Copyright © 2011-2022 走看看