📄 test.cpp
字号:
#include<stdio.h>
#include<stdlib.h>
#include<conio.h> //getch()
#include<iostream.h>
#include<string.h>
#include<iomanip.h>
const int MAXJOB=20; //定义最大作业数
typedef struct node
{ //结构体
int start;
int length;
char tag[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].start=0;
frees[i].length=1024;
strcpy(frees[i].tag,"free"); //标识空闲区"free"
occupys[i].start=0;
occupys[i].length=0;
strcpy(occupys[i].tag,""); //标识已分配区
}
free_quantity++;
//occupy_quantity=0;
}
//显示
void print()
{
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].start;
cout.width(10);
cout<<frees[i].length;
cout.width(8);
cout<<frees[i].tag<<endl;
}
cout<<endl<<"----------------------------------------------------------"<<endl;
cout<<"当前已分配表:"<<endl;
cout<<"起始地址 长度 作业名"<<endl;
for(i=0;i<occupy_quantity;i++)
{
cout.setf(2);
cout.width(12);
cout<<occupys[i].start;
cout.width(10);
cout<<occupys[i].length;
cout.width(8);
cout<<occupys[i].tag<<endl;
}
}
void excellent() //分配内存,给定作业采用最佳分配算法分配xk大小的空间(OPT)
{
char job_name[20];
int job_length;
int i,flag;
cout<<"请输入新申请内存空间的作业名和空间大小:";
cin>>job_name>>job_length;
flag=0; //标记申请空间是否成功,"0"成功,"1"失败
for(i=0;i<free_quantity;i++)
{
if(frees[i].length>=job_length)
{ //如果要申请的内存空间小于当前空闲区大小,则标记flag=1表示申请空间成功
flag=1;
}
}
if(flag==0)//标记是否满足申请要求
{
cout<<endl<<"对不起,当前没有能满足你申请长度的空闲内存,请稍候再试"<<endl;
}
else
{
i--;
for(int j=0;j<free_quantity;j++)
{
if((frees[j].length>=job_length)&&(frees[j].length<frees[i].length))
//寻找最合适空闲区,即找到满足申请条件的最小快
{
i=j; //j为局部变量;
}
}
occupys[occupy_quantity].start=frees[i].start; //分配内存,起始地址
strcpy(occupys[occupy_quantity].tag,job_name); //复制作业号
occupys[occupy_quantity].length=job_length; //占有的内存大小(长度)
occupy_quantity++;
if(frees[i].length>job_length)//空闲区大于要分配的空间大小
{
frees[i].start+=job_length; //修改空闲区的起始地址、长度
frees[i].length-=job_length;
}
else //相等
{
for(j=i;j<free_quantity-1;j++)
{
frees[j]=frees[j+1];
}
free_quantity--;
}
cout<<"恭喜你!内存空间成功:)"<<endl<<endl;
}
}
//撤消作业
void mfree()
{
char job_name[20];
int i,j,flag,p=0;
int start;
int length;
cout<<"请输入要撤消的作业名:";
cin>>job_name;
flag=-1; //标识是否存在要撤消的作业名,"-1"表示没有
for(i=0;i<occupy_quantity;i++)
{
if(!strcmp(occupys[i].tag,job_name))//找到要撤消的作业(匹配)
{
flag=i; //找到匹配作业的下标
start=occupys[i].start;
length=occupys[i].length;
}
}
if(flag==-1){
cout<<"没有这个作业名"<<endl;
}
else
{ //找到作业名;
//加入空闲表
for(i=0;i<free_quantity;i++)
{
if((frees[i].start+frees[i].length)==start) // 寻找回收分区,上邻空闲区,下邻空闲区,三项合并(0 1 0)
{
if(((i+1)<free_quantity)&&(frees[i+1].start==start+length))
{
frees[i].length=frees[i].length+frees[i+1].length+length;
for(j=i+1;j<free_quantity;j++)
{
frees[j]=frees[j+1];
}
free_quantity--;
p=1;
}
else //上邻空闲区,下邻非空闲区,与上邻合并(0 1 1)
{
frees[i].length+=length;
p=1;
}
}
if(frees[i].start==(start+length)){ // 上邻非空闲区,下邻为空闲区,与下邻合并(1 1 0) or 1 0 1
frees[i].start=start;
frees[i].length+=length;
p=1;
}
}
if(p==0)
{
frees[free_quantity].start=start;
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();
while(1)
{
cout<<"========================================================="<<endl;
cout<<"= 存储管理模拟系统 ="<<endl;
cout<<"========================================================="<<endl;
cout<<"= 1.申请空间(最优适配法) ="<<endl;
cout<<"= 2.撤消作业 ="<<endl;
cout<<"= 3.显示空闲表和分配表 ="<<endl;
cout<<"= 0.退出 ="<<endl;
cout<<"========================================================="<<endl;
cout<<"====请你选择操作(0~3):";
cin>>chioce;
switch(chioce)
{
case 1:
excellent(); //采用最优算法分配内存
break;
case 2:
mfree(); //释放作业占有的内存
break;
case 3:
print(); //显示内存分配情况
break;
case 0:
exit(0);
default:
cout<<"你选择的操作有误,请重输!"<<endl;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -