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

📄 cpp1.cpp

📁 操作系统课程设计 模拟实现可变分区存储管理
💻 CPP
字号:
 

#include<stdio.h> 
#include<iostream.h> 
#include<string.h> 
//#include<iomanip.h> 
#include<stdlib.h>

const int MAXJOB=100;//定义表最大记录数 

typedef struct node{ 
int adr; 
int length; 
char tag[20]; 
}job; 

job frees[MAXJOB];//定义空闲区表 
int free_num=0; 

job used[MAXJOB];//定义已分配区表 
int used_num; 

//初始化函数 
void ready() 
{ 
int i; 

for(i=0;i<MAXJOB;i++){ 
frees[i].adr=-1; 
frees[i].length=0; 
strcpy(frees[i].tag,"free"); 

used[i].adr=-1; 
used[i].length=0; 
strcpy(used[i].tag,""); 
} 
free_num=0; 
used_num=0; 
} 
///////////////////////////////////////////////////////////////////////////////////////////////

int create_free()   //申请空间
{ int j=0;
int k=32767;
frees[free_num].adr=j;
frees[free_num].length=k;
free_num++; 
return 1; 
 
} 

/////////////////////////////////////////////////////////////////////////////////////////////
//order 
void order()   //按首地址从小到大排序
{ 
int i,k,j,p,h,m,n; 

for(k=0;k<free_num-1;k++)
{ 
   p=k; 
   for(j=k+1;j<free_num;j++)
   { 
   if(frees[j].adr<frees[p].adr) {   p=j; } 
   }   
   if(p!=k)
   { 
    frees[free_num]=frees[k]; 
    frees[k]=frees[p]; 
    frees[p]=frees[free_num]; 
   } 
} 

}
//////////////////////////////////////////////////////////////////////////////////////////

//显示函数 
void print() 
{ 
int i; 

cout<<"***********************************************************"<<endl; 
cout<<"当前空闲表:"<<endl; 
cout<<"序号    起始地址     长度    终止地址    状态"<<endl; 
for(i=0;i<free_num;i++){ 
cout.setf(2); 
cout.width(12);
cout<<i+1;
cout.width(10); 
cout<<frees[i].adr; 
cout.width(10); 
cout<<frees[i].length; 
cout.width(9); 
cout<<frees[i].adr+frees[i].length-1; 
cout.width(8); 
cout<<frees[i].tag<<endl; 
} 

cout<<"***********************************************************"<<endl; 
cout<<"当前已分配表:"<<endl; 
cout<<"序号   起始地址     长度    终止地址    占用作业名"<<endl; 
for(i=0;i<used_num;i++){ 
cout.setf(2); 
cout.width(10); 
cout<<i+1;
cout.width(12);
cout<<used[i].adr; 
cout.width(8); 
cout<<used[i].length; 
cout.width(15); 
cout<<used[i].adr+used[i].length-1; 
cout.width(8); 
cout<<used[i].tag<<endl; 
} 
} 

///////////////////////////////////////////////////////////////////////////////////////////
//最先适应分配算法 
int first_fit() 
{ 
char job_name[20]; 
int job_length; 
int i,j,flag,t; 

cout<<"请输入新申请内存空间的作业名 :  "; 
cin>>job_name; 
cout<<"请输入新申请内存空间的大小   :  "; 
cin>>job_length; 


flag=0; 
for(i=0;i<free_num;i++)
{ 
	if(frees[i].length>=job_length){ flag=1; }   //判断是否能够满足申请
} 


if(flag==0)
{ 
cout<<endl<<"申请失败,请稍候再试!"<<endl; 
return 1;
} 


else
{ 
t=0; 
i=0; 
while(t==0)  //按顺序寻找满足条件的分区
{ 
   if(frees[i].length>=job_length){ t=1; } 
i++; 
} 
i--;       //分配
used[used_num].adr=frees[i].adr; 
strcpy(used[used_num].tag,job_name); 
used[used_num].length=job_length; 
used_num++;     

if(frees[i].length>job_length)   //判断空闲区的长度是否大于申请
{ 
  frees[i].adr+=job_length; 
  frees[i].length-=job_length; 
} 
else    
{ 
   for(j=i;j<free_num-1;j++)
   { frees[j]=frees[j+1]; } 
free_num--; 
} 
cout<<"内存空间分配成功!"<<endl;
}  
return 0;
} 
/////////////////////////////////////////////////////////////////////////////////////////////
//最优适应分配算法 
int best_fit() 
{ 
char job_name[20]; 
int job_length; 
int i,j,flag,t; 

cout<<"请输入新申请内存空间的作业名 :  "; 
cin>>job_name; 
cout<<"请输入新申请内存空间的大小   :  "; 
cin>>job_length; 

flag=0; 
for(i=0;i<free_num;i++)  //判断是否能够满足申请
{ 
	if(frees[i].length>=job_length){    flag=1; } 
} 


if(flag==0){ 
cout<<endl<<"申请失败,请稍候再试!"<<endl; 
return 1;} 


else{ 
t=0; 
i=0; 

while(t==0){ 
if(frees[i].length>=job_length){ t=1; } 
i++; 
} 

i--; 
for(j=0;j<free_num;j++)  //找出最小满足申请的空闲分区
{ 
if((frees[j].length>=job_length)&&(frees[j].length<frees[i].length)){ 
i=j; 
} 
} 
//分配
used[used_num].adr=frees[i].adr; 
strcpy(used[used_num].tag,job_name); 
used[used_num].length=job_length; 
used_num++; 

//判断空闲分区的长度是否大于申请
if(frees[i].length>job_length){ 
frees[i].adr+=job_length; 
frees[i].length-=job_length; 
} 
else{ 
for(j=i;j<free_num-1;j++){ 
frees[j]=frees[j+1]; 
} 
free_num--; 

} 
cout<<"内存空间分配成功!"<<endl;  
}

return 0;} 


/////////////////////////////////////////////////////////////////////////////////////////
//最优回收算法 
int best_back() 
{ 
char job_name[20]; 
int i,j,flag,p=0; 
int adr; 
int length; 

cout<<"请输入要撤消的作业名:"; 
cin>>job_name; 

flag=-1; 
for(i=0;i<used_num;i++)  //寻找是否有此作业名
{ 
  if(!strcmp(used[i].tag,job_name))
  { 
    flag=i; 
    adr=used[i].adr; 
   length=used[i].length; 
  } 
} 

if(flag==-1){ cout<<"没有这个作业名"<<endl;return 1; } 

else
{ 
//加入空闲表 
for(i=0;i<free_num;i++)
{ 
if((frees[i].adr+frees[i].length)==adr)  //上下相邻
{ 
     if(((i+1)<free_num)&&(frees[i+1].adr==adr+length))  
	 { 
     frees[i].length=frees[i].length+frees[i+1].length+length; 
      for(j=i+1;j<free_num;j++)
	  { 
       frees[j]=frees[j+1]; 
	  } 
       free_num--; 
     p=1;
	 } 
     else
	 { 
      frees[i].length+=length; //下相邻
       p=1;
	 } 
} 
if(frees[i].adr==(adr+length)){   //上相邻
frees[i].adr=adr; 
frees[i].length+=length; 
     p=1;
} 
} 

}
//无相邻
if(p==0){
frees[free_num].adr=adr; 
frees[free_num].length=length; 
free_num++; 
}

//删除分配表中的该作业 

for(i=flag;i<used_num;i++){ 
used[i]=used[i+1]; 
} 
used_num--; 

return 0;} 



//显示函数 
void start() 
{ 
cout<<"\n ************************************************"<<endl; 
cout<<" *     可变分区存储管理模拟系统        *"<<endl; 
cout<<" ************************************************"<<endl; 
cout<<" *         姓名: 蔡得怀                      *"<<endl; 
cout<<" *      学号: 20064440222         *"<<endl; 
cout<<" *      班级: 计算机0602            *"<<endl; 
cout<<" ************************************************"<<endl; 
} 


void main() 
{ 
int k=0;
int flag=0; 
int t=1; 
char chioce='0',ch1='0',ch2;
start(); 
ready(); 

flag=create_free(); 
print();
while(flag==1){ 
	k=0;
cout<<"***********************************************************"<<endl; 
cout<<" 1.申请空间 2.回收空间    0.退出"<<endl; 
cout<<"***********************************************************"<<endl; 
cout<<"请选择:"; 
cin>>chioce; 
switch(chioce){ 
case '1': 
	
		cout<<"1.最先适应分配算法  2.最优适应分配算法  ch1: ";
		cin>>ch1;
     	switch(ch1)
		{
     	case '1':k=first_fit();  if(k==0) order(), print();  break; 
	     case '2':k=best_fit();  if(k==0) order() ,print(); break; 
	    default:k=first_fit();  if(k==0) order(),print(); //默认为最先适应分配算法
		}
break; 
case '2': 	   
          k=best_back();  if(k==0) order(),print(); break; 
case '0': 
flag=0; 
break; 
default: 
cout<<"选择错误!"<<endl; 
} 
} 
} 

⌨️ 快捷键说明

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