操作系统实验五(内存管理之动态分区分配(首次适应))

 

 

 

 

 

 

 

 

#include<stdio.h>
#include<stdlib.h>
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
int SIZE=0;
struct linkk//内存空闲分区 
{
    int size;//内存块的大小 
    int addr;//起始地址 
    struct linkk *next;
};
struct jobtab//作业分区 
{
    int jno;//作业的编号 
    int size;//作业的大小 
    int addr;//作业的起始地址 
    int flag;
};
struct  linkk *head,*p,*q;
struct jobtab tab[20];
void printlink()
{
    int i;
    if(head!=NULL)
    {
        printf("\n  分区号  分区地址 分区大小\n");
        printf("========================\n");
    }
  q=head; 
  i=1;
  while(q!=NULL) 
  {
      printf("   %d\t   %d\t   %d\t\n",i,q->addr,q->size);
      q=q->next;
      i++;
  }
  printf("===============================\n");
  return;
}
void printtab()
{
    int i,flag;
    flag=0;
    for(i=0;i<20&&flag==0;i++)
        if(tab[i].flag==1)  flag=1;
        if(flag==0)
        {
            printf("\n no job");
            return;
        }
        printf("\n  作业号  作业地址 作业长度\n");
        printf("\n===========================\n");
        for(i=0;i<20;i++)
            if(tab[i].flag==1)
                printf("  %d\t   %d\t    %d\n",i,tab[i].addr,tab[i].size);
            printf("\n=================================\n");
            return;

}
void allocm()
{   
    int n,l;
    struct linkk  *p1;
    printf("\n Input job n(0<=n<20):");//输入第n个作业
    scanf("%d",&n);
    printf("\nInput joblength:");
    scanf("%d",&l);//输入第n个作业的长度
    if(tab[n].flag==1)  
    {    
        printf("\n The job  has  create!\n");//tab[n].flag==1说明作业已被创建;否则创建作业
        return;
    }
    else
    {
        tab[n].flag=1; //置创建标志位和作业大小
        tab[n].size=l;
        q=head;p=head;
    }
    while(q!=NULL)//注意理解
    {
        if(q->size==l)
        {
            tab[n].addr=q->addr;
            p1=q;
            if(p1==head) head=q->next;//释放第一个分区块
            else
                p->next=q->next;
            free(p1);
            SIZE=0;
            return;
        }
        if(q->size>l)
        {
            tab[n].addr=q->addr;
            q->size=q->size-l;
            q->addr=q->addr+l;
            SIZE-=l;
            cout<<SIZE<<endl;
            return;
        }
        p=q;q=q->next;
    }
    tab[n].flag=0;
    printf("\n no  memory!!\n");
    return;
}
void freem()
{  /*完成回收代码,学生编写*/
   int n; 
   printf("\n Input job n(0<=n<20):");//输入需要回收的作业编号 
   scanf("%d",&n);
   int addr=tab[n].addr;//获得需要释放内存的起始地址;
   int size=tab[n].size;//获得需要释放内存的大小;
   tab[n].flag=0;
   struct linkk  *te;//设置一个节点
   te=(struct linkk *)malloc(sizeof(struct linkk)); 
   q=head;
   te->addr=addr;
   te->size=size;
   if(SIZE<=0){
        //考虑一下内存分配完之后回收的情况。
     te->next=NULL;
     q=te;
     head=q; 
     SIZE+=te->size;
   }else{
         if((te->addr+te->size==q->addr)||(te->addr-te->size==q->addr)){
          //此时代表区间地址相连
            if(te->addr+te->size==q->addr){
               //后相连
             q->addr=te->addr;
             q->size+=te->size;
            }else if(te->addr-te->size==q->addr){
               //前相连
                 q->size+=te->size;
            }
      }else{//此时代表释放的空间不相连 
            if(te->addr<q->addr){
               //如果新节点的地址小于已经存在的,那么插在前面
               te->next=q;
           q=te; 
         }else{
              //否则插在后面 
            te->next=NULL;
            q->next=te; 
         }
        head=q;
      } 
   }
}
int main()
{
    int i,m,t,n;
    head=(struct linkk *)malloc(sizeof(struct linkk));
    head->addr=0;//初始化地址为0 
    head->next=NULL;
    printf("\n  Input memory size:");
    scanf("%d",&n);//输入内存的长度 
    head->size=n;
    SIZE=n;
    for(i=0;i<20;i++){//初始化作业的编号和状态,0代表为完成作业 
        tab[n].jno=i;
        tab[n].flag=0;
    }
    t=0;
    do{
      printf("\n=================================================\n"); 
      printf("\t1--alloc memory   2--free memory\n");
      printf("\t3--print_LINK   4--print_TAB\n");
      printf("\t5--Quit\n");
      printf("==================================================\n");
      printf("            Select[]\\b\b");
      scanf("%d",&m);
      switch(m){
        case 1:allocm() ;break;
        case 2:freem();break;
        case 3:printlink();break;
        case 4:printtab();break;
        case 5: t=1;
        }
    }
    while(!t);
    return 0;
}

 

posted @ 2020-04-24 21:31  薄眠抛却陈年事。  阅读(1728)  评论(0编辑  收藏  举报