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


    一、        实验目的

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

    二、        实验内容和要求

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

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

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

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

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

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

    #include"stdio.h"
    #include"stdlib.h"
    #define n 10 /*假定系统允许的最大作业为n,假定模拟实验中n值为10*/
    #define m 10 /*假定系统允许的空闲区表最大为m,假定模拟实验中m值为10*/
    #define minisize 100
    struct{
     float address; /*已分分区起始地址*/
        float length; /*已分分区长度,单位为字节*/
        int flag; /*已分配区表登记栏标志,用"0"表示空栏目*/
    }used_table[n]; /*已分配区表*/
    
    struct{
     float address; /*空闲区起始地址*/
     float length; /*空闲区长度,单位为字节*/
     int flag; /*空闲区表登记栏标志,用"0"表示空栏目,用"1"表示未分配*/
    }free_table[m]; /*空闲区表*/
    
    void main( )
    {
     int i,a;
     void allocate(char str,float leg);//分配主存空间函数
     void reclaim(char str);//回收主存函数
     float xk;
     char J;/*空闲分区表初始化:*/
     free_table[0].address=10240;
     free_table[0].length=102400;
     free_table[0].flag=1;
     for(i=1;i<m;i++)
      free_table[i].flag=0;/*已分配表初始化:*/
        for(i=0;i<n;i++)
      used_table[i].flag=0;
     while(1)
     {
      printf("
    选择功能项(0-退出,1-分配主存,2-回收主存,3-显示主存)
    ");
      printf("选择功项(0~3) :");
      scanf("%d",&a);
      switch(a)
      {
      case 0: exit(0); /*a=0程序结束*/
      case 1: /*a=1分配主存空间*/printf("输入作业名J和作业所需长度xk: ");
       scanf("%*c%c%f",&J,&xk);
       allocate(J,xk);/*分配主存空间*/
       break;
      case 2: /*a=2回收主存空间*/printf("输入要回收分区的作业名");
       scanf("%*c%c",&J);reclaim(J);/*回收主存空间*/
       break;
      case 3: /*a=3显示主存情况*//*输出空闲区表和已分配表的内容*/
       printf("输出空闲区表:
    起始地址 分区长度 标志
    ");
       for(i=0;i<m;i++)
        printf("%6.0f%9.0f%6d
    ",free_table[i].address,free_table[i].length, free_table[i].flag);
       printf(" 按任意键,输出已分配区表
    ");
       getchar();
           printf(" 输出已分配区表:
    起始地址 分区长度 标志
    ");
       for(i=0;i<n;i++)
    
        if(used_table[i].flag!=0)
         printf("%6.0f%9.0f%6c
    ",used_table[i].address,used_table[i].length, used_table[i].flag);
        else
         printf("%6.0f%9.0f%6d
    ",used_table[i].address,used_table[i].length, used_table[i].flag);
        break;
       default:printf("没有该选项
    ");
      }/*case*/
     }/*while*/
    }/*主函数结束*/ 
    int uflag;//分配表标志
    int fflag;//空闲表标志
    float uend_address;
    float fend_address;
    void allocate(char str,float leg)
    {
     uflag=0;fflag=0;
     int k,i;float ressize;
    
     for(i=0;i<m;i++)
     {
      if(free_table[i].flag==1 && free_table[i].length>=leg)
      {
       fflag=1;break;
      }
        
     }
     if(fflag==0)
      printf("没有满足条件的空闲区
    ");
     else
     {
      ressize=free_table[i].length-leg;
      for(k=0;k<n;k++)
      {
       if(used_table[k].flag==0)
       {
        if(ressize<minisize)//剩余块过小
        {
         used_table[k].length=free_table[i].length;
         used_table[k].address=free_table[i].address;
         used_table[k].flag=str;
         free_table[i].length=0;
         free_table[i].flag=0;
         break;
        }
        else
        {
         used_table[k].address=free_table[i].address+ressize;
         used_table[k].flag=str;
         used_table[k].length=leg;
         free_table[i].length=ressize;
         break;
        }
       }
      }//for结束
     }
    }
    void reclaim(char str)
    {
     uflag=0;fflag=0;
     int k,i;
     for(k=0;k<n;k++)
     {
      if(used_table[k].flag==str)
      {
       uflag=1;break;
      }
     }
     if(uflag==0)
      printf("
    找不到该作业!
    ");
     else
     {
      for(i=0;i<m;i++)
      {
       uend_address=used_table[k].address+used_table[k].length;
       fend_address=free_table[i].address+free_table[i].length;
       if(used_table[k].address==fend_address)//上邻
       {
        fflag=1;
        free_table[i].length=free_table[i].length+used_table[k].length;
        free_table[i].flag=1;
        used_table[k].flag=0;
        used_table[k].length=0;
        used_table[k].address=0;
        printf("
    已回收!
    ");
        break;
       }
       else
       {
        if(free_table[i].address==uend_address)//下邻
        {
         fflag=1;
         free_table[i].address=used_table[k].address;
         free_table[i].length=free_table[i].length+used_table[k].length;
         free_table[i].flag=1;
         used_table[k].flag=0;
         used_table[k].length=0;
         used_table[k].address=0;
         printf("
    已回收!
    ");
         break;
        }
       }
      }//for结束
      if(fflag==0)
      {
       i=0;
       for(i=0;i<m;i++)
       {
        if(free_table[i].flag==0)
        {
         free_table[i].address=used_table[k].address;
         free_table[i].length=used_table[k].length;
         free_table[i].flag=1;
         used_table[k].length=0;
         used_table[k].flag=0;
         used_table[k].address=0;
         break;
        }
       }
       printf("
    已回收!
    ");
      }
     }
    }

    四,实验总结

    参考书本做,觉得实验做起来比较难,不太懂。

  • 相关阅读:
    CentOS升级参考
    CentOS下配置VNC
    CentOS SSH安全和配置无密码登录
    kubernetes使用本地仓库
    IdentityServer4入门五:错误处理
    IdentityServer4入门四:应用Implicit模式保护网站(下)
    IdentityServer4入门四:应用Implicit模式保护网站(上)
    IdentityServer4入门三:授权模式
    浅谈欧几里得算法求最大公约数(GCD)的原理及简单应用
    [CodePlus 2017 11月赛]晨跑 题解(辗转相除法求GCD)
  • 原文地址:https://www.cnblogs.com/lijiahui/p/4599159.html
Copyright © 2020-2023  润新知