实验三 存储器的分配与回收算法实现(二维数组)

2024-10-08

实验三 存储器的分配与回收算法实现(二维数组)

实验三 存储器的分配与回收算法实现(二维数组) 篇1

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

◆实验名称:存储器的分配与回收算法实验 ◆仪器、设备:计算机

◆参考资料:操作系统实验指导书 ◆实验目的:

设计一个存储器的分配与回收算法管理方案,并编写模拟程序实现。◆实验内容:

1.模拟操作系统的主存分配,运用可变分区的存储管理算法设计主存分配和回收程序,并不实际启动装入作业。

2.采用最先适应法、最佳适应法、最坏适应法分配主存空间。

3.当一个新作业要求装入主存时,必须查空闲区表,从中找出一个足够大的空闲区。若找到的空闲区大于作业需要量,这是应把它分成二部分,一部分为占用区,加一部分又成为一个空闲区。

4.当一个作业撤离时,归还的区域如果与其他空闲区相邻,则应合并成一个较大的空闲区,登在空闲区表中。

5.运行所设计的程序,输出有关数据结构表项的变化和内存的当前状态。◆实验要求:

1. 详细描述实验设计思想、程序结构及各模块设计思路; 2. 详细描述程序所用数据结构及算法; 3. 明确给出测试用例和实验结果;

4. 为增加程序可读性,在程序中进行适当注释说明;

5. 认真进行实验总结,包括:设计中遇到的问题、解决方法与收获等; 6. 实验报告撰写要求结构清晰、描述准确逻辑性强;

实验过程中,同学之间可以进行讨论互相提高,但绝对禁止抄袭。◆实验过程记录(源程序、测试用例、测试结果及心得体会等

实验代码如下:

#include

int work[10][2];

//作业名字 大小

int idle[10][2];

//空闲区大小 地址

int free[10][3];

//已分配区域的名字 地址 大小

int num=0,b=1,d,ch1,ch2;void init(){

idle[0][0]=1;idle[0][1]=100;

free[0][0]=0;free[1][1]=0;free[1][2]=0;

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

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

idle[i][0]=0;idle[i][1]=0;

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

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

} }

void jishu(){ //求空闲单元数

for(int i=0;i <9;i++)

if(idle[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

for(int j=i;j

if(idle[j][0]>idle[j+1][0]){

int temp=idle[j][0];

idle[j][0]=idle[j+1][0];

idle[j+1][0]=temp;

temp=idle[j][1];

idle[j][1]=idle[j+1][1];

idle[j+1][1]=temp;

}

}

} }

void zuijia(){ //最佳适应法

num=0;

jishu();

for(int i=0;i

for(int j=i;j

if(idle[j][1]>idle[j+1][1]){

int temp=idle[j][0];

idle[j][0]=idle[j+1][0];

idle[j+1][0]=temp;

temp=idle[j][1];

idle[j][1]=idle[j+1][1];

idle[j+1][1]=temp;

}

}

} }

void zuihuai(){ //最坏适应法

num=0;

jishu();

for(int i=0;i

for(int j=i;j

if(idle[j][1]

int temp=idle[j][0];

idle[j][0]=idle[j+1][0];

idle[j+1][0]=temp;

temp=idle[j][1];

idle[j][1]=idle[j+1][1];

idle[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(free[k][0]==name){

c=k;

break;

}

}

if(c==-1)cout <<“要回收的作业不存在!” <

else{

for(int i=0;i

//将空闲单元排序{不包括新回收的}

for(int j=i;j

if(idle[j][0]>idle[j+1][0]){

int temp=idle[j][0];

idle[j][0]=idle[j+1][0];

idle[j+1][0]=temp;

temp=idle[j][1];

idle[j][1]=idle[j+1][1];

idle[j+1][1]=temp;

}

}

}

for(int q=0;q

if(free[c][1] <=idle[q][0]){

for(int j=num;j>=q;j--){

idle[j+1][0]=idle[j][0];

idle[j+1][1]=idle[j][1];

}

idle[j][0]=free[c][1];

idle[j][1]=free[c][2];

b++;

if(idle[j+1][0]==idle[j][0]+idle[j][1]){

idle[j][1]=idle[j][1]+idle[j+1][1];

for(int m=j+1;m <=num;m++){

idle[m][0]=idle[m+1][0];

idle[m][1]=idle[m+1][1];

}

idle[m][0]=0;

idle[m][1]=0;

b--;

}

if(idle[j-1][0]==idle[j][0]){

idle[j-1][1]=idle[j-1][1]+idle[j][1];

for(int n=j;j <=num;j++){

idle[n][0]=idle[n+1][0];

idle[n][1]=idle[n+1][1];

}

idle[n][0]=0;

idle[n][1]=0;

b--;

}

break;

}

}

if(ch2==1)zuixian();

if(ch2==2)zuijia();

if(ch2==3)zuihuai();

for(int p=c;c

free[c][0]=free[c+1][0];

free[c][1]=free[c+1][1];

free[c][2]=free[c+1][2];

work[c][0]=work[c+1][0];

work[c][1]=work[c+1][1];

}

cout<<“该进程已被成功回收!”<

} }

void fp(){

int tag=0;//判断空闲区与请求区大小

num=0;

b=0;

jishu();

jishu1();

for(int j=0;j

if(work[b][1]

free[b][0]=work[b][0];

free[b][1]=idle[j][0];

free[b][2]=work[b][1];

idle[j][0]=idle[j][0]+work[b][1];

idle[j][1]=idle[j][1]-work[b][1];

tag=1;

break;

}

else if(work[b][1]==idle[j][1]){

free[b][0]=work[b][0];

free[b][1]=idle[j][0];

free[b][2]=work[b][1];

tag=1;

for(int i=j;i <=num-1;i++){

idle[i][0]=idle[i+1][0];

idle[i][1]=idle[i+1][1];}

break;}

else tag=0;}

if(tag==0)cout <<“作业过大没有足够存储空间!” <

void print(){

num=0;

b=1;

jishu();

jishu1();

cout <<“已分配表为:” <

for(int i=0;i <=b;i++)

if(free[i][2]!=0)

cout <<“作业名:” <

cout <

cout <<“空闲区表为:” <

for(int j=0;j

if(idle[j][1]!=0)

cout <<“起始地址:” <

cout <

void main(){ //主函数运行上面定义的函数

init();

int n;

cout <<“1.分配空间;2.回收空间;” <

cin>>ch1;

cout <

cout <<“1.最先适应法;2.最佳适应法;3.最坏适应法;” <

cin>>ch2;

cout <

cout <<“请输入要分配内存的作业名及占用内存大小:”;

cin>>work[b][0]>>work[b][1];

cout <

if(ch2==1){

zuixian();

fp();

}

else if(ch2==2){

zuijia();

fp();}

else if(ch2==3){

zuihuai();

fp();}

print();}

cout <<“输入要回收的作业名:” <

cin>>n;

huishou(n);

} 实验截图:

成功回收时:

回收失败时:

实验体会:

本次实验的难度较大,尤其是回收进程,主要编写几个算法和回收程序,最佳,最优,最坏算法和回收算法,我用的是数组,有工作数组,空闲数组,已分配数组。最后再编写算法,但是回收算法现在还是有些不清晰,需要进一步研究!

上一篇:一建工程法规第三、四章知识点下一篇:去看书作文300字