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

    专业网络工程  姓名胡洁如  学号201306114125

    一、        实验目的

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

    二、        实验内容和要求

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

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

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

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

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

    三、        实验方法、步骤及结果测试

    源程序名:主存分配.cpp

    1. 1.      主要程序段及其解释:

    看提交的代码

      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("请选择算法\n1.首次适应算法\n2.循环首次适应算法");
     42     scanf("%d",&suanfa);
     43     
     44     if(suanfa==1)
     45     {
     46         while(1)
     47         {
     48             printf("请选择操作\n1.分配\n2.回收");
     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("请选择操作\n1.分配\n2.回收");
     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("输出空闲区表:\n起始地址 分区长度 标志\n");
     89     
     90     for(i=0;i<10;i++)
     91     {
     92         printf("%6.0f%9.0f%6d\n",free_table[i].address,free_table[i].length, free_table[i].flag);
     93     }
     94     printf(" 按任意键,输出已分配区表\n");
     95     getchar();
     96     printf(" 输出已分配区表:\n起始地址 分区长度 标志\n");
     97     for(i=0;i<10;i++)
     98     {
     99         
    100         if(used_table[i].flag!=0)
    101             printf("%6.0f%9.0f%6c\n",used_table[i].address,used_table[i].length, used_table[i].flag);
    102         else
    103             printf("%6.0f%9.0f%6d\n",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("没有满足条件的空闲区\n");
    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("没有满足条件的空闲区\n");
    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("\n找不到该进程!\n");
    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("\n已回收!\n");
    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("\n已回收!\n");
    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("\n已回收!\n");
    250         }
    251     }
    252 }
    1. 2.      运行结果及分析

       

      结果符合预期

       

      四、        实验总结

      编程一直是一个很费脑力的事,但是只要认真研究就可以写出来,需要一定的耐心跟细心,有时为了找一个错误可能会找上半天,但是当解决了所有的错误之后就会有成就感。

       

  • 相关阅读:
    ubuntu16.04截图工具Shutter安装,设置快捷键
    cd命令和roscd命令的区别,并解决环境变量问题
    ubuntu16.04+kinetic 环境下进行turtlebot2安装+gazebo7.16
    【转载】windows 下TexLive的安装和配置
    Linux 环境变量 /etc/profile 和 ~/.bashrc的区别和使用
    rotors无人机仿真(古月居)——问题记录
    操作select
    #if DEBUG
    (网上看的)asp.net使用uploadify上传出现的IO Error问题
    sqlserver2008附加sqlserver2005数据库目录出错,需要设置mdf后缀文件夹“管理员取得所有权”,并用windows管理权限登录数据库不要用sa
  • 原文地址:https://www.cnblogs.com/jieru/p/4553658.html
Copyright © 2011-2022 走看看