xtu-操作系统实验3-内存动态分区分配

一、实验内容
设计模拟实现内存动态分区分配和回收的c语言程序。
1、建立一个长度为1024的一维数组,用以模拟内存。
2、建立空闲分区表或空闲分区链,用来记录内存的使用情况。
3、为请求进入内存的作业分配内存,回收运行完成的作业所占内存。
4、键盘输入:表示一个请求进入内存的作业的三元组: (作业号(0–9),作业大小(1—1024),作业运行时间)
5、程序接受键盘输入,进行内存分配,返回分配或其它信息(在屏幕显示)

二、代码

#include<stdio.h>
struct storage{//
    int state;
    int size;
    int add;
    int No; 
    
}table[1024];
struct task{//
    int No; 
    int size;
    int time;
}T[100];
//int num=3;
int num=1;
//storage table[1024];
//task T[100];
void recover(int n);
void allocation(int n); 
int main()
{
 int n,i,j,k;
/* for(i=0,j=0;i<3;i++,j+=300)
 {
  table[0].No=i;
  table[0].add=j; 
  table[0]=10;
 }*/
 for(i=0;i<1024;i++)
 {
  table[i].add=0;
  table[i].No=-1;
  table[i].size=1024;
  table[i].state=0;
 }
 //printf("%d",table[10].No);
 printf("请输入作业数:");
 scanf("%d",&n);
 printf("请依次输入各作业信息:作业号(0--9)、作业大小(1--1024)、运行时间(秒)\n");
 for(i=0;i<n;i++)
 {
  scanf("%d %d %d",&T[i].No,&T[i].size,&T[i].time);
 }
 allocation(n);
 printf("此时内存信息如下:\n\n") ;
 printf("分区号  起始地址  大小  状态\n") ;
 for(k=0;k<num;k++)
 {
  printf(" %d      %d       %d      %d\n",k,table[k].add,table[k].size,table[k].state) ;
 }
 printf("\n");
 recover(n);
 return 0; 
}
void allocation(int n) 
{
 int i,j,k,temp;
 for(i=0;i<n;i++)
 {
  for(j=0;j<num;j++)
  {
   if(table[j].state==0&&table[j].size>=T[i].size)
   {
    table[j].No=T[i].No;
    table[j].state=1;
    if((table[j].size-T[i].size)>1)
    {
     temp=table[j].size;
     table[j].size=T[i].size;
     for(k=num;k>j+1;k--)
     {
      table[k].No=table[k-1].No;
      table[k].add=table[k-1].add;
      table[k].size= table[k-1].size;
      table[k].state=table[k-1].state;
     }
     table[j+1].add=table[j].add+T[i].size;
     table[j+1].size=temp-T[i].size;
     table[j+1].state=0; 
     num++;
    }
    printf("作业 %d 内存分配地址为:%d--%d\n",T[i].No,table[j].add,table[j+1].add-1);
    break;
   }
  }
  if(j==num) printf("错误!作业%d没有足够大空间加载进内存\n",T[i].No);
  
 }
 printf("\n");
 
}
void recover(int n) 
{
 int i,j,k,temp;
 for(i=0;i<n;i++)
 {
  for(j=i+1;j<n;j++)
  {
   if(T[i].time>T[j].time)
   {
    temp=T[i].time;
    T[i].time=T[j].time;
    T[j].time=temp;
    
    temp=T[i].No;
    T[i].No=T[j].No;
    T[j].No=temp;
    
    temp=T[i].size;
    T[i].size=T[j].size;
    T[j].size=temp;
    
   }
  }
 }
 
 for(i=0;i<n;i++)
 {
  for(j=0;j<num;j++)
  {
   if(table[j].No==T[i].No)
   {
    if((j>=1&&table[j-1].state==0)||(j<num-1&&table[j+1].state==0))
    {
     if((j>=1&&table[j-1].state==0)&&(j>=num-1||table[j+1].state==1)) 
     {
      table[j-1].size+=table[j].size;
      for(k=j;k+1<num;k++)
      {
       table[k].add=table[k+1].add;
       table[k].No=table[k+1].No;
       table[k].size=table[k+1].size;
       table[k].state=table[k+1].state;
      }
      num--;
     }
     else if((j<1||table[j-1].state==1)&&(j<num-1&&table[j+1].state==0))
     {
      table[j].size+=table[j+1].size;
      table[j].state=0;
      table[j].No=-1; 
      for(k=j+1;k+1<num;k++)
      {
       table[k].add=table[k+1].add;
       table[k].No=table[k+1].No;
       table[k].size=table[k+1].size;
       table[k].state=table[k+1].state;
      }
      num--;
     }
     else
     {
      table[j-1].size=table[j-1].size+table[j].size+table[j+1].size;
      for(k=j;k+1<num;k++)
      {
       table[k].add=table[k+2].add;
       table[k].No=table[k+2].No;
       table[k].size=table[k+2].size;
       table[k].state=table[k+2].state;
      }
      num-=2;
     }
     
    }
    else
    {
     table[j].No=-1;
     table[j].state=0;
    }
    break; 
   }
 
  }
  printf("作业 %d 已回收\n\n",T[i].No) ;
  printf("此时内存信息如下:\n\n") ;
  printf("分区号  起始地址  大小  状态\n") ;
  for(k=0;k<num;k++)
  {
   printf(" %d      %d       %d      %d\n",k,table[k].add,table[k].size,table[k].state) ;
  }
 }
}
/*
3
1 100 20
2 200 10
3 10 100
*/
  • 5
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值