操作系统固定分区管理方式的主存分配回收模拟系统的设计
使用C语言编写
1.功能描述
固定分区管理方式的主存分配回收模拟系统的设计
固定分区法就是把内存区固定地划分为若干个大小不等的区域。系统对内存的管理和控制通过数据结构----分区说明表进行,分区说明表各分区号、分区大小、起始地址和是否是空闲区。内存的分配和释放、存储保护以及地址变换等都通过分区说明表进行。要求:模拟内存分区的分配与回收过程。
1. 实现思路:利用分区说明表给出既定分区大小及起始地址,以及分配情况。分配时依照最先适应方法对作业进行分配。
分配算法:
cornmap[i].m_addr+=size;
cornmap[i].m_size-=size;
释放算法:
cornmap[i-1].m_addr-=size;
cornmap[i-1].m_size+=size;
2. 实验结果:
3. 源代码:
//采用最先适应算法进行分配与释放
#include "stdio.h"
#define N 5 //假设分区为5
struct map{
int m_num;//分区号
int m_size;//大小
int m_addr;//起始地址
int m_do;//分配状态
} cornmap[N]={{1,20,100,0},{2,40,120,0},{3,100,160,0},{4,200,260,0},{5,50,500,0}};
struct mdist{//各作业分配表
int m_addr;
int m_size;
}md[15];
int distribute(int size){
int i;
int regint;
for(i=0;i<5;i++){
regint=cornmap[i].m_addr;
if(cornmap[i].m_do==0){//表示该分区未被分配
if(cornmap[i].m_size==size){
cornmap[i].m_do=1;//如果该分区完全被分配则将其分配状态改为1
cornmap[i].m_addr+=size;
cornmap[i].m_size=0;
printf("此时第%d分区已完全分配",i);
break;
}
if(cornmap[i].m_size>size){
cornmap[i].m_addr+=size;
cornmap[i].m_size-=size;
break;
}
}
//如果所有分区都无法满足该作业要求的分区则执行下一个作业
}
return regint;//返回分配的起始地址
}
int free(int startsize, int startaddr){//释放作业的起始地址和大小
int i,addr,size;
addr=startaddr;
size=startsize;
for(i=0;cornmap[i].m_addr<=addr;i++){
cornmap[i-1].m_addr-=size;
cornmap[i-1].m_size+=size;
}
return 0;
}
void main(){
int id=0,size,i,k;
int cd;
do{
printf("Please enter the size of the allocated memory space:");
scanf("%d",&size);//输入需要分配内存的作业所要分配的内存空间
md[id].m_size=size;
md[id].m_addr=distribute(md[id].m_size);
id++;
printf("Please determine whether to continue the distribution:1or0");//是否继续分配内存
printf("\n");
scanf("%d",&cd);
}while(cd!=0);
for(i=0;i<id;i++){
printf("The %d task is starting from%d and take over %d kb",i+1,md[i].m_addr,md[i].m_size);
printf("\n");
}
printf("分区表:\n");
for(i=0;i<N;i++){
printf("num=%d,size=%d,addr=%d,do=%d",i+1,cornmap[i].m_size,cornmap[i].m_addr,cornmap[i].m_do);
printf("\n");
}
do{
printf("Please determine whether to release:1or0" );
scanf("%d",&k);
if(k==0){
break;
}
printf("please input the number of task\n");//请输入要释放内存的作业号
scanf("%d",&i);
free(md[i-1].m_size,md[i-1].m_addr);
printf("Please determine whether to continue to release:1or0" );//请选择是否继续释放
printf("\n");
scanf("%d",&cd);
}while(cd!=0);
for(i=0;i<id;i++){
printf("The %d task is starting from%d and take over %d kb",i+1,md[i].m_addr,md[i].m_size);
printf("\n");
}
printf("分区表:\n");
for(i=0;i<N;i++){
printf("num=%d,size=%d,addr=%d,do=%d",i+1,cornmap[i].m_size,cornmap[i].m_addr,cornmap[i].m_do);
printf("\n");
}
}