主题:[讨论]急!动态分区存储管理模拟
操作系统课程实验,想了一个下午了。。。三个省略号处是需要进行补充的内容,哪位达人帮帮忙啊
#include "stdio.h"
#include "stdlib.h"
#include "iostream"
#define n 10 /*假定系统允许的最大作业数为n,假定模拟实验中n 值为10*/
#define m 10 /*假定系统允许的空闲区表最大为m,假定模拟实验中m值为10*/
#define minisize 100 /*空闲分区被分配时,如果分配后剩余的空间小于minisize,
则将该空闲分区全部分配,若大于minisize,则切割分配*/
using namespace std;
struct
{
char name;
float address; /*已分配分区起始地址*/
float length; /*已分配分区长度,单位为字节*/
int flag; /*已分配区表登记栏标志,用"0"表示空栏目*/
}used_table[n]; /*已分配区表*/
struct
{
float address; /*空闲区起始地址*/
float length; /*空闲区长度,单位为字节*/
int flag; /*空闲区表登记栏标志,用"0"表示空栏目,用"1"表示未分配*/
}free_table[m]; /*空闲区表*/
int Getfree_table(float address,float size)
{
if(address==0) return -1;
for(int i=0;i<m;i++)
{
if((free_table[i].address+free_table[i].length==address)&&(free_table[i].flag==1))
return i;
}
return -1;
}
int Getfree_table2(float address,float size)
{
for(int i=0;i<m;i++)
{
if(address+size==free_table[i].address)
return i;
}
return -1;
}
int GetTable()
{
for(int i=0;i<n;i++)
{
if(used_table[i].flag==0) {
cout<<i<<endl;
return i;
}
}
return -1;
}
int GetTable2(char J)//求分配表NAME为J
{
for(int i=0;i<n;i++)
{
if(used_table[i].name==J)
return i;
}
return -1;
}
int GetTable3()//求空间表FLAG为0
{
…………
}
void allocate(char J,float xk)
{
.......
}/*给J作业,采用分配算法分配xk大小的空间*/
void reclaim(char J) /*回收作业名为J的作业所占主存空间*/
{
int f=GetTable2(J);
float size=used_table[f].length;
float address=used_table[f].address;
used_table[f].length=0;
used_table[f].address=0;
used_table[f].flag=0;
//判断是否有上先临界空间
//判断是否有下先临界空间
int top=Getfree_table(address,size);
int bottom=Getfree_table2(address,size);
……
……
}
int main( )
{
int i,a;
float xk;
char J;
/*空闲分区表初始化:*/
free_table[0].address=0; /*起始地址假定为10240*/
free_table[0].length=10240; /*长度假定为10240,即10k*/
free_table[0].flag=1; /*初始空闲区为一个整体空闲区*/
for(i=1;i<m;i++)
free_table[i].flag=0; /*其余空闲分区表项未被使用*/
/*已分配表初始化:*/
for(i=0;i<n;i++)
used_table[i].flag=0; /*初始时均未分配*/
while(1)
{
printf("选择功能项(0-退出,1-分配主存,2-回收主存,3-显示主存)\n");
printf("选择功能项(0~3) :");
scanf("%d",&a);
switch(a)
{
case 0: exit(0); /*a=0程序结束*/
case 1: /*a=1分配主存空间*/
allocate(char J,float xk) ;
break;
case 2: /*a=2回收主存空间*/
reclaim(char J);
break;
case 3: /*a=3显示主存情况*/
/*输出空闲区表和已分配表的内容*/
printf("输出空闲区表:\n 起始地址 分区长度 标志\n");
for(i=0;i<m;i++)
printf("%6.0f%9.0f%6d\n",free_table[i].address,free_table[i].length,
free_table[i].flag);
printf(" 按任意键,输出已分配区表\n");
getch();
printf(" 输出已分配区表:\n起始地址 分区长度 标志\n");
for(i=0;i<n;i++)
if(used_table[i].flag!=0)
printf("%6.0f%9.0f%6c\n",used_table[i].address,used_table[i].length,
used_table[i].flag);
else
printf("%6.0f%9.0f%6d\n",used_table[i].address,used_table[i].length,
used_table[i].flag);
break;
default:printf("没有该选项\n");
}/*case*/
}/*while*/
return 1;
}/*主函数结束*/
[em2][em2][em2][em2][em2][em2]
#include "stdio.h"
#include "stdlib.h"
#include "iostream"
#define n 10 /*假定系统允许的最大作业数为n,假定模拟实验中n 值为10*/
#define m 10 /*假定系统允许的空闲区表最大为m,假定模拟实验中m值为10*/
#define minisize 100 /*空闲分区被分配时,如果分配后剩余的空间小于minisize,
则将该空闲分区全部分配,若大于minisize,则切割分配*/
using namespace std;
struct
{
char name;
float address; /*已分配分区起始地址*/
float length; /*已分配分区长度,单位为字节*/
int flag; /*已分配区表登记栏标志,用"0"表示空栏目*/
}used_table[n]; /*已分配区表*/
struct
{
float address; /*空闲区起始地址*/
float length; /*空闲区长度,单位为字节*/
int flag; /*空闲区表登记栏标志,用"0"表示空栏目,用"1"表示未分配*/
}free_table[m]; /*空闲区表*/
int Getfree_table(float address,float size)
{
if(address==0) return -1;
for(int i=0;i<m;i++)
{
if((free_table[i].address+free_table[i].length==address)&&(free_table[i].flag==1))
return i;
}
return -1;
}
int Getfree_table2(float address,float size)
{
for(int i=0;i<m;i++)
{
if(address+size==free_table[i].address)
return i;
}
return -1;
}
int GetTable()
{
for(int i=0;i<n;i++)
{
if(used_table[i].flag==0) {
cout<<i<<endl;
return i;
}
}
return -1;
}
int GetTable2(char J)//求分配表NAME为J
{
for(int i=0;i<n;i++)
{
if(used_table[i].name==J)
return i;
}
return -1;
}
int GetTable3()//求空间表FLAG为0
{
…………
}
void allocate(char J,float xk)
{
.......
}/*给J作业,采用分配算法分配xk大小的空间*/
void reclaim(char J) /*回收作业名为J的作业所占主存空间*/
{
int f=GetTable2(J);
float size=used_table[f].length;
float address=used_table[f].address;
used_table[f].length=0;
used_table[f].address=0;
used_table[f].flag=0;
//判断是否有上先临界空间
//判断是否有下先临界空间
int top=Getfree_table(address,size);
int bottom=Getfree_table2(address,size);
……
……
}
int main( )
{
int i,a;
float xk;
char J;
/*空闲分区表初始化:*/
free_table[0].address=0; /*起始地址假定为10240*/
free_table[0].length=10240; /*长度假定为10240,即10k*/
free_table[0].flag=1; /*初始空闲区为一个整体空闲区*/
for(i=1;i<m;i++)
free_table[i].flag=0; /*其余空闲分区表项未被使用*/
/*已分配表初始化:*/
for(i=0;i<n;i++)
used_table[i].flag=0; /*初始时均未分配*/
while(1)
{
printf("选择功能项(0-退出,1-分配主存,2-回收主存,3-显示主存)\n");
printf("选择功能项(0~3) :");
scanf("%d",&a);
switch(a)
{
case 0: exit(0); /*a=0程序结束*/
case 1: /*a=1分配主存空间*/
allocate(char J,float xk) ;
break;
case 2: /*a=2回收主存空间*/
reclaim(char J);
break;
case 3: /*a=3显示主存情况*/
/*输出空闲区表和已分配表的内容*/
printf("输出空闲区表:\n 起始地址 分区长度 标志\n");
for(i=0;i<m;i++)
printf("%6.0f%9.0f%6d\n",free_table[i].address,free_table[i].length,
free_table[i].flag);
printf(" 按任意键,输出已分配区表\n");
getch();
printf(" 输出已分配区表:\n起始地址 分区长度 标志\n");
for(i=0;i<n;i++)
if(used_table[i].flag!=0)
printf("%6.0f%9.0f%6c\n",used_table[i].address,used_table[i].length,
used_table[i].flag);
else
printf("%6.0f%9.0f%6d\n",used_table[i].address,used_table[i].length,
used_table[i].flag);
break;
default:printf("没有该选项\n");
}/*case*/
}/*while*/
return 1;
}/*主函数结束*/
[em2][em2][em2][em2][em2][em2]