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


     

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

    专业:计算机科学与技术(网络工程) 姓名:陈玉婷  学号:201306114132

    一、        实验目的

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

    二、        实验内容和要求

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

    (1)**设计一个作业申请队列以及作业完成后的释放顺序,实现主存的分配和回收。采用分区说明表进行。(2)或在程序运行过程,由用户指定申请与释放。

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

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

    1. 1.      源程序名:压缩包文件(rarzip)中源程序名 four.c

    可执行程序名:four.exe

    1. 2.      原理分析及流程图

    存储结构:用结构体存储已分分区表 空闲分区表

    关键函数的实现:

    #include<stdio.h>
    #define n 3    //假设系统允许的最大作业为n
    #define m 10    //假设系统允许的空闲区表最大为m
    #define min 100
    
    void allocate(char name,int length);
    void reclaim(char name);
    
    
    struct 
    {
        int address;    //已分分区起始地址
        int length;     //已分分区长度
        int flag;       //已分分区标志("0"表示空栏目)
        char name[10];   //作业名
    }usedtable[10];
    
    struct 
    {
        int address;       //空闲分区起始地址
        int length;        //空闲分区长度
        int flag;         //空闲分区标志("0"表示空栏目,"1"表示未分配)
        char name[10];    //作业名
    }freetable[10];
    
    void allocate(char name,int length)
    {
        int useflag=0;     //分配表标志
        int freeflag=0;    //空闲表标志
        int i,k,resize;
        for(i=0;i<m;i++)
        {
            if(freetable[i].flag==1&&freetable[i].length>=length)
            {
               freeflag=1; break;
            }
            if(freeflag==0) 
                printf("没有满足条件的空闲区
    ");
            else
            {
                resize=freetable[i].length-length;
                for(k=0;k<n;k++)
                {
                   if(usedtable[k].flag==0)
                   {
                     if(resize<min)   //剩余块过少
                     {
                         usedtable[k].length=freetable[i].length;
                         usedtable[k].address=freetable[i].address;
                         usedtable[k].flag=name;
                         freetable[i].length=0;
                         freetable[i].flag=0;
                         break;
                     }
                     else
                     {
                         usedtable[k].address=freetable[i].address+resize;
                         usedtable[k].flag=name;
                         usedtable[k].length=length;
                         freetable[i].length=resize;
                         break;
                     }
                   }
                }
            }
        }
    }
    
    void reclaim(char name)
    {
        int useflag=0;     //分配表标志
        int freeflag=0; //空闲表标志
        int u_endaddress;
        int f_endaddress;
        int k,i;
        for(k=0;k<n;k++)
        {
            if(usedtable[k].flag==name)
            {
               useflag=1; 
               break;
            }
        }
        if(useflag==0)
            printf("找不到该作业
    ");
        else
        {
            for(i=0;i<m;i++)
            {
                u_endaddress=usedtable[k].address+usedtable[k].length;
                f_endaddress=freetable[i].address+freetable[i].length;
                 if(usedtable[k].address==f_endaddress)//上邻
                 {
                      freeflag=1;
                      freetable[i].length=freetable[i].length+usedtable[k].length;
                      freetable[i].flag=1;
                      usedtable[k].flag=0;
                      usedtable[k].length=0;
                      usedtable[k].address=0;
                      printf("已回收
    ");
                      break;
                 }
                  else
                  {
                     if(freetable[i].address==u_endaddress)//下邻
                     {
                        freeflag=1;
                        freetable[i].address=usedtable[k].address;
                        freetable[i].length=freetable[i].length+usedtable[k].length;
                        freetable[i].flag=1;
                        usedtable[k].flag=0;
                        usedtable[k].length=0;
                        usedtable[k].address=0;
                        printf("已回收
    ");
                        break;
                     }
                  }
            }
            if(freeflag==0)
            {
               i=0;
               for(i=0;i<m;i++)
               {
                   if(freetable[i].flag==0)
                   {
                      freetable[i].address=usedtable[k].address;
                      freetable[i].length=usedtable[k].length;
                      freetable[i].flag=1;
                      usedtable[k].length=0;
                      usedtable[k].flag=0;
                      usedtable[k].address=0;
                      break;
                   }
               }
               printf("
    已回收!
    ");
            }
        }
    }
    
    void main()
    {
         int i,a,length;
         char name;
         
        //空闲分区表初始化 
         freetable[0].address=10240;
         freetable[0].length=102400;
         freetable[0].flag=1;
         for(i=1;i<m;i++)
         {
             freetable[i].flag=0; 
         }
         for(i=0;i<n;i++)
         {
             usedtable[i].flag=0; //已分配区表初始化
         }
    
         allocate(name,length);
         reclaim(name);
    
         while(1)
         {
            printf("选择功能项(0-退出,1-分配主存,2-回收主存,3-显示主存)
    ");
            printf("选择功能项:");
            scanf("%d",&a);
            switch(a)
            {
              case 0: exit(0);   
              case 1: 
                  printf("输入作业名和作业所需长度: ");
                  scanf("%c %d",&name,&length);
                  allocate(name,length);
                  break;
              case 2: 
                  printf("输入要回收分区的作业名");
                  scanf("%c",&name);
                  reclaim(name);
                  break;
              case 3:
                  printf("输出空闲区表:
    起始地址 分区长度 标志
    ");  
                  for(i=0;i<m;i++) 
                  {
                      printf("%6d%6d%6d
    ",freetable[i].address,freetable[i].length, freetable[i].flag);  
                  }
                   printf("按任意键输出已分配区表
    ");
                   getchar(); 
                   printf(" 输出已分配区表:
    起始地址 分区长度 标志
    "); 
                   for(i=0;i<n;i++)
                   {
                      if(usedtable[i].flag!=0) 
                          printf("%6d%6d%6d
    ",usedtable[i].address,usedtable[i].length, usedtable[i].flag); 
                      else    
                          printf("%6d%6d%6d
    ",usedtable[i].address,usedtable[i].length, usedtable[i].flag);
                      break; 
                   }
              default:
                  printf("没有该选项
    ");
            }
         }
    }

       4 运行结果及分析

    四、 实验总结

    心得体会:算法仍然存在很大的不足,主要是对算法的理论知识理解不透彻,对C语言中存储结构基础掌握不深,导致自己写代码写不出,在网上参考代码看不懂的情况,网上的代码多数使用指针,自己对指针掌握少,所以理解起来很吃力。对算法的理论知识理解不透彻,还需要多看书理解理解。

  • 相关阅读:
    我的大厂面试经历(附100+面试题干货)
    大厂面试题:集群部署时的分布式 session 如何实现?
    【转载】Android数据库(SqlLite)操作和db文件查看
    【转载】android ListView详解
    C#根据经纬度获取物理地址
    C#计算两个经纬度的距离
    EXT编写日志文件
    动态数组
    System.Windows.Forms.Timer和System.Timers.Timer的区别 [转]
    SQL Prompt 3 优秀的SQL查询工具 收藏
  • 原文地址:https://www.cnblogs.com/family6/p/4552119.html
Copyright © 2020-2023  润新知