+ -
当前位置:首页 → 问答吧 → 存储器的分配与回收算法实现

存储器的分配与回收算法实现

时间:2009-06-14

来源:互联网

1.本实验是模拟操作系统的主存分配,运用可变分区的存储管理算法设计主存分配和回收程序,并不实际启动装入作业。
2. 采用最先适应法、最佳适应法、最坏适应法分配主存空间。
3. 当一个新作业要求装入主存时,必须查空闲区表,从中找出一个足够大的空闲区。若找到的空闲区大于作业需要量,这是应把它分成二部分,一部分为占用区,加一部分又成为一个空闲区。
4. 当一个作业撤离时,归还的区域如果与其他空闲区相邻,则应合并成一个较大的空闲区,登在空闲区表中。
5. 运行所设计的程序,输出有关数据结构表项的变化和内存的当前状态。

#include<iostream.h>
  int work[10][2]; //作业名字 大小
int kongxian[10][2]; //空闲区大小 地址
int fenpei[10][3]; //已分配区域的名字 地址 大小
int num=0,b=1,d,ch1,ch2;
  void init(){
kongxian[0][0]=1;kongxian[0][1]=100;

  fenpei[0][0]=0;fenpei[1][1]=0;fenpei[1][2]=0;

  work[0][0]=0;work[0][1]=0;

  for(int i=1;i<=9;i++){ //初始化数组

  kongxian[i][0]=0;kongxian[i][1]=0;

  fenpei[i][0]=0;fenpei[i][1]=0;fenpei[i][2]=0;

  work[i][0]=0;work[i][1]=0;

  }
}
void jishu(){
for(int i=0;i<9;i++) //求空闲单元数
if(kongxian[i][1]!=0)
num++;
}
void jishu1(){
for(int i=0;i<9;i++) //求作业数
if(work[i][1]!=0)
b++;
}
 
void zuixian(){ //最先适应法
jishu();
for(int i=0;i<num;i++){
for(int j=i;j<num-i-1;j++){
if(kongxian[j][0]>kongxian[j+1][0]){
int temp=kongxian[j][0];
kongxian[j][0]=kongxian[j+1][0];
kongxian[j+1][0]=temp;
temp=kongxian[j][1];
kongxian[j][1]=kongxian[j+1][1];
kongxian[j+1][1]=temp;
}
}
}
}

void zuijia(){ //最佳适应法
  num=0;
jishu();
for(int i=0;i<num;i++){
for(int j=i;j<num-i-1;j++){
if(kongxian[j][1]>kongxian[j+1][1]){
int temp=kongxian[j][0];
kongxian[j][0]=kongxian[j+1][0];
kongxian[j+1][0]=temp;
temp=kongxian[j][1];
kongxian[j][1]=kongxian[j+1][1];
kongxian[j+1][1]=temp;
}
}
}
}

void zuihuai(){ //最坏适应法
num=0;
jishu();
for(int i=0;i<num;i++){
for(int j=i;j<num-i-1;j++){
if(kongxian[j][1]<kongxian[j+1][1]){
int temp=kongxian[j][0];
kongxian[j][0]=kongxian[j+1][0];
kongxian[j+1][0]=temp;
temp=kongxian[j][1];
kongxian[j][1]=kongxian[j+1][1];
kongxian[j+1][1]=temp;
}
}
}
}
void huishou(int name){ //回收用
num=0;
b=0;
jishu();
jishu1();
int c=-1;
for(int k=0;k<=b;k++){

if(fenpei[k][0]==name){
c=k;
break;
}

}
if(c==-1)cout<<"要回收的作业不存在!"<<endl;
else{

for(int i=0;i<num;i++){ //将空闲单元排序{不包括新回收的}
for(int j=i;j<num-i-1;j++){
if(kongxian[j][0]>kongxian[j+1][0]){
int temp=kongxian[j][0];
kongxian[j][0]=kongxian[j+1][0];
kongxian[j+1][0]=temp;
temp=kongxian[j][1];
kongxian[j][1]=kongxian[j+1][1];
kongxian[j+1][1]=temp;
}
}
}
for(int q=0;q<num;q++){ //将空单元排序{包括新回收的}
if(fenpei[c][1]<=kongxian[q][0]){
for(int j=num;j>=q;j--){

kongxian[j+1][0]=kongxian[j][0];
kongxian[j+1][1]=kongxian[j][1];
}
kongxian[j][0]=fenpei[c][1];
kongxian[j][1]=fenpei[c][2];
b++;
if(kongxian[j+1][0]==kongxian[j][0]+kongxian[j][1]){ //下相邻为空时
kongxian[j][1]=kongxian[j][1]+kongxian[j+1][1];
for(int m=j+1;m<=num;m++){ //元素后移
kongxian[m][0]=kongxian[m+1][0];
kongxian[m][1]=kongxian[m+1][1];
}
kongxian[m][0]=0;
kongxian[m][1]=0;
b--;
}

if(kongxian[j-1][0]==kongxian[j][0]){ //上相邻为空时
kongxian[j-1][1]=kongxian[j-1][1]+kongxian[j][1];
for(int n=j;j<=num;j++){
kongxian[n][0]=kongxian[n+1][0];
kongxian[n][1]=kongxian[n+1][1];
}
kongxian[n][0]=0;
kongxian[n][1]=0;
b--;
}
break;
}
}
if(ch2==1)zuixian();
if(ch2==2)zuijia();
if(ch2==3)zuihuai();
for(int p=c;c<b-1;c++){
fenpei[c][0]=fenpei[c+1][0];
fenpei[c][1]=fenpei[c+1][1];
fenpei[c][2]=fenpei[c+1][2];
work[c][0]=work[c+1][0];
work[c][1]=work[c+1][1];
}
}
}
void fp(){ 
int tag=0; //判断空闲区与请求区大小
num=0;
b=0;
jishu();
jishu1();
for(int j=0;j<num;j++){

  if(work[b][1]<kongxian[j][1]){  
fenpei[b][0]=work[b][0];
fenpei[b][1]=kongxian[j][0];
fenpei[b][2]=work[b][1];
kongxian[j][0]=kongxian[j][0]+work[b][1];
kongxian[j][1]=kongxian[j][1]-work[b][1];
tag=1;
break;
}
else if(work[b][1]==kongxian[j][1]){
fenpei[b][0]=work[b][0];
fenpei[b][1]=kongxian[j][0];
fenpei[b][2]=work[b][1];
tag=1;
for(int i=j;i<=num-1;i++){

kongxian[i][0]=kongxian[i+1][0];
kongxian[i][1]=kongxian[i+1][1];
}
break;
}
else tag=0;
}
if(tag==0)cout<<"作业过大没有足够存储空间!"<<endl;
}

void print(){
num=0;
b=1;
jishu();
jishu1();
cout<<"已分配表为:"<<endl;
for(int i=0;i<=b;i++)
if(fenpei[i][2]!=0)
cout<<"作业名:"<<fenpei[i][0]<<" 内存起始地址:"<<fenpei[i][1]<<" 占用内存空间:"<<fenpei[i][2]<<endl;
cout<<endl;
cout<<"空闲区表为:"<<endl;
for(int j=0;j<num;j++)
if(kongxian[j][1]!=0)
cout<<"起始地址:"<<kongxian[j][0]<<" 连续内存空间:"<<kongxian[j][1]<<endl;
cout<<endl;
}

void main(){
init();
int n,x; //是否推出系统
do{
cout<<"1.分配空间;2.回收空间;"<<endl;
cin>>ch1;
cout<<endl;
cout<<"1.最先适应法;2.最佳适应法;3.最坏适应法;"<<endl;
cin>>ch2;
cout<<endl;
if(ch1==1){
cout<<"请输入要分配内存的作业名及占用内存大小:";
cin>>work[b][0]>>work[b][1];
cout<<endl;
if(ch2==1){
zuixian();
fp();
}
else if(ch2==2){
zuijia();
fp();
}
else if(ch2==3){
zuihuai();
fp();
}
print();
}
if(ch1==2){
cout<<"输入要回收的作业名:"<<endl;
cin>>n;
huishou(n);
print();
}
cout<<"1.继续;0.推出;"<<endl;
cin>>x;
}while(x);
}

为什么最先适应算法时 分配空间不行 回收时也不对

作者: xianyangjie   发布时间: 2009-06-14

……
顶吧……

作者: hikaliv   发布时间: 2009-06-14

还没结贴?操作系统的实验吧?

作者: seaeast1992   发布时间: 2011-12-14