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;

 

第一步:(第13周完成)

完成程序数据结构的创建,初始化内存分配情况,创建空闲分区表和已分配分区表。

 

源代码:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

#define n 10 //系统允许的最大作业
#define m 10 //系统允许的空闲区表最大为m
#define Memory 1280  //总内存
#define system 256   //系统内存

typedef struct partition
{
    char name[10];
    float address; 
    float length; 
    int flag; 
}PV;

PV Used[m],Free[m];
float minisize=100;

//初始化
void init()
{
    int i;
    strcpy(Free[0].name,"");
    Free[0].address=system;
    Free[0].length=Memory-system;
    Free[0].flag=0;

    strcpy(Used[0].name,"系统");
    Used[0].address=0;
    Used[0].length=system;
    Used[0].flag=1;

    for(i=1;i<m;i++)
    {
        strcpy(Free[i].name,"null");
        Free[i].flag=0;
    }
    for(i=1;i<n;i++)
    {
        strcpy(Used[i].name,"null");
        Used[i].flag=0;
    }
}

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[i].flag==0 && Free[i].length>=leg)
        {
            fflag=0;
            break;
        }
    
    }

    if(fflag==1 || Free[i].length<leg)
        printf("没有满足条件的空闲区\n");
    else
    {
        ressize=Free[i].length-leg;
        for(k=0;k<n;k++)
        {
            if(Used[k].flag==0)
            {
                if(ressize<minisize)//剩余块过小
                {
                    strcpy(Used[k].name,str);
                    Used[k].address=Free[i].address+ressize;
                    Used[k].flag=1;
                    Used[k].length=leg;

                    Free[i].length=ressize;
                    break;
                }
                else
                {
                    strcpy(Used[k].name,str);
                    Used[k].length=leg;
                    Used[k].address=Free[i].address;
                    Used[k].flag=1;

                    strcpy(Free[k].name,"");
                    Free[k].address=Used[k].address+leg;
                    Free[k].length=ressize;
                    Free[i].length=0;
                    Free[i].flag=0;
                    break;
                }
            }
        
        }
        printf("分配成功!\n");
    }
}

//回收
void reclaim(char str[])
{
    uflag=0;
    fflag=0;
    int k,i;
    for(k=0;k<n;k++)
    {
        if(strcmp(Used[k].name,str)==0)
        {
            uflag=1;
            break;
        }
    }

    if(uflag==0)
        printf("\n找不到该作业!\n");
    else
    {
        for(i=0;i<m;i++)
        {
            uend_address=Used[k].address+Used[k].length;
            fend_address=Free[i].address+Free[i].length;
            if(Used[k].address==fend_address)//上邻
            {
                fflag=1;
                Free[i].length=Free[i].length+Used[k].length;
                Free[i].flag=0;
                Used[k].flag=1;
                Used[k].length=0;
                Used[k].address=0;
                printf("\n已回收!\n");
                break;
            }
            else
            {
                if(Free[i].address==uend_address)//下邻
                {
                    fflag=1;
                    Free[i].address=Used[k].address;
                    Free[i].length=Free[i].length+Used[k].length;
                    Free[i].flag=0;
                    Used[k].flag=1;
                    Used[k].length=0;
                    Used[k].address=0;
                    printf("\n已回收!\n");
                    break;
                }
            }
        }
        if(fflag==0)
        {
            i=0;
            for(i=0;i<m;i++)
            {
                if(Free[i].flag==0)
                {
                    Free[k].address=Used[k].address;
                    Free[k].length=Used[k].length;
                    Free[k].flag=0;
                    Used[k].length=0;
                    Used[k].flag=1;
                    Used[k].address=0;
                    break;
                }
            }
            printf("\n已回收!\n");
        }
    }
}

void main( )
{
     int i,a;
     float xk;
     char J[10];
     init();//初始化
     while(1)
     {
         printf("\n选择功能项(0-退出,1-分配主存,2-回收主存,3-显示主存)\n");
         printf("选择功项(0~3) :");
         scanf("%d",&a);
         switch(a)
         {
              case 0: exit(0); 
              case 1:
                  printf("\n作业名: ");
                  scanf("%s",J);
                  printf("作业所需长度: ");
                  scanf("%f",&xk);
                  allocate(J,xk);/*分配主存空间*/
                  break;

              case 2: 
                  printf("\n输入要回收分区的作业名: ");
                  scanf("%s",J);reclaim(J);
                  break;
  
              case 3: 
                  printf("\n输出空闲表:\n");
                  printf("==================================================================\n");
                  printf("    作业名        起始地址    分区长度    标志\n");
                  for(i=0;i<m;i++)
                      if(strcmp(Free[i].name,"null")!=0)
                          printf("\t  %s\t\t %.0f\t\t%.0f\t\t%d\n",Free[i].name,Free[i].address,Free[i].length, Free[i].flag);
                  printf("\n==================================================================\n");

                  printf("\n\n输出已分配表:\n");
                  printf("==================================================================\n");
                  printf("    作业名        起始地址    分区长度    标志\n");
                  for(i=0;i<n;i++)
                      if(Used[i].flag!=0 || strcmp(Used[i].name,"null")!=0)
                          printf("\t  %s\t\t %.0f\t\t%.0f\t\t%d\n",Used[i].name,Used[i].address,Used[i].length, Used[i].flag);
                  printf("\n==================================================================\n");
                  break;
              
              default:printf("没有该选项\n");
         }
     }
}

 运行结果:

(1)分配空间:

 

 

(2)回收空间:

实验总结:对内存的分配以及回收有了一定的了解,实验不算很难,重点在于把握好算法的计算就可以了。

posted on 2016-05-27 17:47  bububulan  阅读(1453)  评论(0编辑  收藏  举报