操作系统实验四(内存管理之固定分区分配)

 

/*
实验四-内存管理之固定分区分配
算法思想:
  预先将内存空间划分成若干个空闲分区,
  分配过程根据用户需求将某一个满足条件的分区直接分配
  (不进行分割),作业完成后回收对应内存。
  整个分配过程分区大小和个数不发生变化。 
*/ 
#include <bits/stdc++.h>
#include <iostream>
#include <stdio.h>
using namespace std;
#define getpch(type) (type*)malloc(sizeof(type))
int SIZE;//内存的大小
struct node//内存分区使用说明表
{
   int id;//内存块的id;
   int size;//内存块的大小
   int begin_adress;//内存块的起始地址
   char status;////F-已分配,T-未分配
   struct node *next;
}*p,*ready=NULL;
typedef struct node SIF;
void InitMemory();//初始化固定内存的设置
void showinfo();//打印分配的情况 
void recover();//作业完成后回收资源
void allocation();//给作业分配空间
int allocate(int size);//分配内存,返回0代表分配成功
int main()
{
    int command;
    InitMemory();//初始化内存说明表
    printf("\n 请输入命令,给作业分配资源输入1,释放资源输入2,退出请输入任意键:\n");
    scanf("%d",&command);
    while(1){
       if(command==1)
          allocation();
       else if(command==2)
          recover();
       else
          break;
        printf("\n 请继续输入命令 \n");
        scanf("%d",&command);
    }
    return 0;
}
void showinfo()//打印内存分配情况
{
    printf("\n 当前内存分配情况如下:\n");
    printf("\n===id===size===begin_adress===status \n");
    p=ready;
    while(p!=NULL)
    {
        printf("\n    %d      %d      %d            %c\n",p->id,p->size,p->begin_adress,p->status);
        p=p->next;
    }
}
void InitMemory()//初始化内存表 
{
    int num,i,j,d=0,id=0;
    SIF *last=ready;
    printf("\n 请输入现有内存的大小:  (起始地址从0开始) \n");
    scanf("%d",&SIZE);
    //初始化内存信息
    printf("\n 请输入固定分区内存块的个数: ");
    scanf("%d",&num);
    for(i=0; i<num; i++)
    {
        int n;
        printf("\n 请输入内存块%d的大小(KB):",i);
        scanf("%d",&n);
        for(j=0; j<n; j++)
        {
            p=getpch(SIF);//#define getpch(type) (type*)malloc(sizeof(type)) 
            p->id=id++;
            p->size=(int)(pow(2,4+i));//size是按照2的指数递增的
            p->begin_adress=d;
            if(p->status==NULL)//是否被分配初始化
                p->status='T';
            else
                p->status='F';
            p->next=NULL;
            d+=p->size;
            if(d>=SIZE)
            {
              printf("\n 已超出系统总内存量,%d号分配失败 \n",p->id);
              break;
            }
            if(ready==NULL)
            {
                ready=p;
                last=ready;
            }
            else
            {
                last->next=p;
                last=last->next;
            }
        }
    }
    showinfo(); 
}
void allocation()//给作业分配空间 
{
    int num1;
    int i,s;
    //给作业分配内存空间
    printf("\n 请输入待分配内存的作业个数:");
    scanf("%d",&num1);
    for(i=0; i<num1; i++){
       printf("\n 请输入第%d个作业的大小: ",i);
       scanf("%d",&s);
       if(allocate(s)==1){
          printf("\n 已为该作业分配内存空间\n");
          printf("\n 存储该作业内存空间的详细信息如下:\n");
          printf("\n 内存块号:%d, 内存大小:%d \n",p->id,p->size);
       }
       else
           printf("\n 未能该该作业分配内存 \n");
   }
   showinfo();
}
void recover()//作业完成后回收资源
{
     int i,k,num;
     printf("\n 请输入需要释放的作业个数: ");
     scanf("%d",&num);
     for(i=0; i<num; i++){
        printf("\n 请输入存储该作业的内存分区说明表的ID \n");
        scanf("%d",&k);
        p=ready;
        while(p!=NULL){
            if(p->id==k){
                p->status='T';
                printf("\n 已释放该作业所占用的资源 \n");
                break;
            }
            p=p->next;
        }
    }
    showinfo();//完成作业后回收内存空间 
}
int allocate(int size)//分配内存,返回0代表分配成功
{
    p=ready;
    while(p!=NULL)
    {
        if((p->status=='T')&&(p->size>=size))
        {
            p->status='F';
            return 1;
        }
        p=p->next;
    }
    return 0;
}

 

 

posted @ 2020-04-23 13:48  薄眠抛却陈年事。  阅读(1755)  评论(0编辑  收藏  举报