📄 源代码.txt
字号:
#include<stdlib.h>
#include<iomanip.h>
#define n 10 //假定系统允许的最大进程数为n
#define m 2 //假定系统允许的空闲表最大为m
#define min 100 //空闲表被分配时,如果分配后剩余的空间小于min,则将该空闲表全部分配,若大于min,则切割分配
struct
{
float address; //空闲表起始地址
float length; //空闲表长度,单位为字节
int sign; //空闲表登记栏标志,用"0"表示空栏目,用"1"表示未分配
}free_table[m]; //空闲表
struct
{
float address; //分配表起始地址
float length; //分配表长度,单位为字节
int sign; //分配表登记栏标志,用"0"表示空栏目
}used_table[n]; //分配表
void allocate(char task,float size) //给进程(task),采用最佳分配算法分配(size)大小的空间
{
int i,k;
float ad;
k=-1;
for(i=0;i<m;i++)
if(free_table[i].length>=size&&free_table[i].sign==1)
if(k==-1||free_table[i].length<free_table[k].length)
k=i;
if(k==-1)
{
cout<<"无可用空闲区,请重新输入!"<<endl;
return;
}
if(free_table[k].length-size<=min)
{
free_table[k].sign=0;
ad=free_table[k].address;
size=free_table[k].length;
}
else
{
free_table[k].length=free_table[k].length-size;
ad=free_table[k].address+free_table[k].length;
}
//修改分配表
i=0;
while(used_table[i].sign!=0&&i<n) //寻找空表目
i++;
if(i>=n)
{
cout<<"无表目填写已分分区,错误"<<endl;
//修正空闲表
if(free_table[k].sign==0)
free_table[k].sign=1;
else
{
free_table[k].length=free_table[k].length+size;
return;
}
}
else
{//修改分配表
used_table[i].address=ad;
used_table[i].length=size;
used_table[i].sign=task;
}
return;
}//内存分配函数结束
void reclaim(char task)
//释放进程名为task的进程所占内存空间
{
int i,k,j,s,t;
float S,L;
s=0;
while((used_table[s].sign!=task||used_table[s].sign==0)&&s<n)
s++;
if(s>=n)
{
cout<<"找不到该进程,重新输入!"<<endl;
return;
}
//修改分配表
used_table[s].sign=0;
//取得归还分区的起始地址S和长度L
S=used_table[s].address;
L=used_table[s].length;
j=-1;k=-1;i=0;
while(i<m&&(j==-1||k==-1))
{
if(free_table[i].sign==1)
{
if(free_table[i].address+free_table[i].length==S)k=i;//找到上邻
if(free_table[i].address==S+L)j=i;//找到下邻
}
i++;
}
if(k!=-1)
if(j!=-1)
{
free_table[k].length=free_table[j].length+free_table[k].length+L;
free_table[j].sign=0;
}
else
free_table[k].length=free_table[k].length+L;
else
if(j!=-1)
{
free_table[j].address=S;
free_table[j].length=free_table[j].length+L;
}
else
{
t=0;
while(free_table[t].sign==1&&t<m)
t++;
if(t>=m)//空闲表已满,释放内存失败,将分配表复原
{
cout<<"内存空闲表没有空间,释放内存失败"<<endl;
used_table[s].sign=task;
return;
}
free_table[t].address=S;
free_table[t].length=L;
free_table[t].sign=1;
}
return;
}//释放内存函数结束
int main( )
{
int i,select;
float SIZE;
char task;
//空闲分配表初始化:
free_table[0].address=10240; //起始地址假定为10240
free_table[0].length=10240; //长度假定为10240
free_table[0].sign=1; //初始空闲表为一个整体空闲表
for(i=1;i<m;i++)
free_table[i].sign=0; //其余空闲表项未被使用
for(i=0;i<n;i++)
used_table[i].sign=0; //初始时均未分配
while(true)
{
cout<<"★★★★★★★★★★★★★★ 验证实现存储器管理 ★★★★★★★★★★★★★"<<endl;
cout<<endl;
cout<<" 1、申请内存"<<endl;
cout<<" 2、释放内存"<<endl;
cout<<" 3、显示主存"<<endl;
cout<<" 4、退出程序"<<endl;
cout<<endl;
cout<<"根据以上的提示,请选择(1—4): ";
cin>>select;
switch(select)
{
case 1:
cout<<endl;
cout<<"申请内存空间的进程名task= ";
cin>>task;
cout<<endl;
cout<<"需要为该进程申请的空间size= ";
cin>>SIZE;
cout<<endl;
allocate(task,SIZE);
break;
case 2:
cout<<endl;
cout<<"输入要释放内存的进程名task= ";
cin>>task;
reclaim(task);
break;
case 3:
//输出内存空闲表和内存分配表
cout<<endl;
cout<<" ★内存空闲表情况★"<<endl;
cout<<" 起始地址 空间长度 标志"<<endl;
for(i=0;i<m;i++)
cout<<setw(10)<<free_table[i].address<<setw(10)<<free_table[i].length<<setw(7)<<free_table[i].sign<<endl;
cout<<" ★内存分配表情况★:"<<endl;
cout<<" 起始地址 申请长度 标志"<<endl;
for(i=0;i<n;i++)
if(used_table[i].sign!=0)
cout<<setw(10)<<used_table[i].address<<setw(10)<<used_table[i].length<<setw(7)<<(char) used_table[i].sign<<endl;
else
cout<<setw(10)<<used_table[i].address<<setw(10)<<used_table[i].length<<setw(7)<<used_table[i].sign<<endl;
break;
case 4: exit(0);
break;
default:cout<<"没有该选项,请重新输入"<<endl;
}/*case*/
}/*while*/
return 1;
}//主函数结束
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -