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


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

    专业:网络工程  姓名:唐凤婵  学号201306114127

    一、实验目的

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

    二、实验内容和要求

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

                 

     

    四、实验总结

    实验难度很大,一开始不知要干什么,通过百度和问同学才能编写出来。

  • 相关阅读:
    RabbitMQ一:消息队列的认识
    RabbitMQ二:AMQP协议
    SVN中如何去除版本控制器
    Asp.net:MVC认识
    时间连接查询展示
    C#string类型总结
    JavaScript01天学习笔记分享
    UML中的类图及类图之间的关系
    23 种设计模式的分类和功能
    WCF入门
  • 原文地址:https://www.cnblogs.com/Dawn----123/p/4605239.html
Copyright © 2020-2023  润新知