操作系統實驗四(內存管理之固定分區分配)


 

/*
實驗四-內存管理之固定分區分配
算法思想:
  預先將內存空間划分成若干個空閑分區,
  分配過程根據用戶需求將某一個滿足條件的分區直接分配
  (不進行分割),作業完成后回收對應內存。
  整個分配過程分區大小和個數不發生變化。 
*/ 
#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;
}

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM