⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 可变分区存储管理的内存分配和回收.txt

📁 操作系统各个方面的编程
💻 TXT
字号:
#include "stdafx.h"
#include<stdio.h>
#include<iostream.h>
#include<string.h>
#include<iomanip.h>
const int MAXJOB=100;//定义表最大记录数
typedef struct node
{
 int front;
 int length;
 char data[20];
}job;
job frees[MAXJOB];//定义空闲区表
int free_quantity;
job occupys[MAXJOB];//定义已分配区表
int occupy_quantity;
//初始化函数
void initial()
{
 int i;
 for(i=0;i<MAXJOB;i++)
 {
  frees[i].front=-1;
  frees[i].length=0;
  strcpy(frees[i].data,"free");
  occupys[i].front=-1;
  occupys[i].length=0;
  strcpy(occupys[i].data," ");
 }
 free_quantity=0;
 occupy_quantity=0;
}
//创建空闲分区表
int creatfree()
{
 FILE *fp;
 char fname[20];
 cout<<"请输入空闲区数据文件来源的文件名:";
 cin>>fname;
 if((fp=fopen(fname,"r"))==NULL){
  cout<<"错误,文件打不开,请检查文件名"<<endl;
 }
 else{
  while(!feof(fp))
  {
   fscanf(fp,"%d\t%d\n",&frees[free_quantity].front,&frees[free_quantity].length);
   free_quantity++;
  }
        cout<<"空闲的分区表已建立!\n";
  return 1;
 }
 return 0;

}
void sort()//将free空间安首地址从小到大的顺序排列
{
 int i,j,p;
 for(i=0;i<free_quantity-1;i++)
 {
  p=i;
  for(j=i+1;j<free_quantity;j++)
  {
   if(frees[j].front<frees[p].front)
   {
    p=j;
   }
  }
  if(p!=i)
  {
   frees[free_quantity]=frees[i];
   frees[i]=frees[p];
   frees[p]=frees[free_quantity];
  }
 }
}
//显示函数
void show()
{
 int i;
 cout<<endl<<"----------------------------------------------------------"<<endl;
 cout<<"当前空闲表:"<<endl;
 cout<<"起始地址    长度      状态"<<endl;
 for(i=0;i<free_quantity;i++){
  cout.setf(2);
  cout.width(12);
  cout<<frees[i].front;
  cout.width(10);
  cout<<frees[i].length;
  cout.width(8);
  cout<<frees[i].data<<endl;
 }
 cout<<endl<<"----------------------------------------------------------"<<endl;
 cout<<"当前已分配表:"<<endl;
 cout<<"起始地址    长度   占用作业名"<<endl;
 for(i=0;i<occupy_quantity;i++)
 {
  cout.setf(2);
  cout.width(12);
  cout<<occupys[i].front;
  cout.width(10);
  cout<<occupys[i].length;
  cout.width(8);
  cout<<occupys[i].data<<endl;
 }
 cout<<endl<<"----------------------------------------------------------"<<endl;
}
//最先适应分配算法
void assign()
{
 char job_name[20];
 int job_length;
 int i,j,flag,t;
 cout<<"请输入新申请内存空间的作业名和空间大小:";
 cin>>job_name;
 cin>>job_length;
 flag=0;
 for(i=0;i<free_quantity;i++)
 {
  if(frees[i].length>=job_length)//如果空闲空间I的长度〉作业长度
  {
   flag=1;     //空闲标志位就置1
  }
 }
 if(flag==0)
 {
  cout<<endl<<"对不起,当前没有能满足你申请长度的空闲内存,请稍候再试!"<<endl;
 }
 else{
  t=0;
  i=0;
  while(t==0)//为空闲区间的时候
  {
   if(frees[i].length>=job_length)
   {
    t=1;
   }
   i++;//如果空闲空间I的长度不大于作业长度,I加一,判断下一个空间
  }
  i--;
  occupys[occupy_quantity].front=frees[i].front;//把已用的空闲空间的首地址负给已用空间的首地址
  strcpy(occupys[occupy_quantity].data,job_name);//已用空间的内容为作业名
  occupys[occupy_quantity].length=job_length;//已用空间的长度为作业的长度
  occupy_quantity++;     //已用空间数量加一
  if(frees[i].length>job_length)//如果空间的长度大于作业的长度,
  {
   frees[i].front+=job_length;//空闲空间的起始首地址=原空闲区间的起始长度加作业长度
   frees[i].length-=job_length;//空闲区间的长度=原空闲区间的长度-作业的长度
  }
  else//如果空间的长度=作业的长度
&nbsp; {
   for(j=i;j<free_quantity-1;j++)
   {
    frees[j]=frees[j+1];//空闲区间前移一位
   }
   free_quantity--;//空闲区间的数量减一
   cout<<"内存空间成功:)"<<endl;
  }
 }
}

//撤消作业   
void cancel()
{
 char job_name[20];
 int i,j,flag,p=0;
 int front;
 int length;
 cout<<"请输入要撤消的作业名:";
 cin>>job_name;
 flag=-1;
 for(i=0;i<occupy_quantity;i++)
 {
  if(!strcmp(occupys[i].data,job_name))//当输入作业名匹配时
  {
   flag=i;//把i的值赋给flag;
   front=occupys[i].front;//把已用空间的首地址赋给start
   length=occupys[i].length;//把已用空间的长度赋给length
  }
 }
 if(flag==-1)
 {
  cout<<"没有这个作业名"<<endl;
 }
 else
 {//加入空闲表
  for(i=0;i<free_quantity;i++)
  {
   if((frees[i].front+frees[i].length)==front)//上空
   {
    if(((i+1)<free_quantity)&&(frees[i+1].front==front+length))//下空
    {
     frees[i].length=frees[i].length+frees[i+1].length+length;//第i个空闲区间的长度=第i个空闲区间的长度+第i+1个空闲区间的长度(下空闲区)+length
     for(j=i+1;j<free_quantity;j++)
     {
      frees[j]=frees[j+1];//后移一位
     }
     free_quantity--;//空闲区的数量渐少了一个
     p=1;
    }
    else{
     frees[i].length+=length;//(上空下不空)第i个空闲区间的长度=第i个空闲区间的长度+length,空闲区个数不变
     p=1;
    }
   }
   if(frees[i].front==(front+length))//下空上不空
   {
    frees[i].front=front;//起始地址等于待回收地址
    frees[i].length+=length;//第i个空闲区间的长度=第i个空闲区间的长度+length
    p=1;
   }
  }
  if(p==0)//上下空闲区都不空(直接在空闲区表中找一个空表目,将其内容插入)
  {
   frees[free_quantity].front=front;
   frees[free_quantity].length=length;
   free_quantity++;//空闲区的数量加一
  }
  //删除分配表中的该作业
  for(i=flag;i<occupy_quantity;i++)
  {
   occupys[i]=occupys[i+1];
  }
  occupy_quantity--;//已用的区的数量
 }
}
void main()
{
 int flag=0;
 int t=1;
 int chioce=0;
 initial();
 flag=creatfree();
 while(flag==1)
 {
  sort();
  cout<<"           可变分区存储管理模拟系统"<<endl;
     cout<<"   1.申请空间  "<<endl;
        cout<<"   2.撤消作业  "<<endl;
        cout<<"   3.显示空闲表和分配表  "<<endl; 
        cout<<"   0.退出"<<endl;
  cout<<"请选择:";
  cin>>chioce;
  switch(chioce)
  {
  case 1:
   assign();
   break;
  case 2:
   cancel();
   break;
  case 3:
   show();
   break;
  case 0:
   flag=0;
   break;
  default:
   cout<<"选择错误!"<<endl;
  }
 }
}




⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -