操作系统固定分区管理方式的主存分配回收模拟系统的设计

使用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 distribution1or0");//是否继续分配内存

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 release1or0" );

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 release1or0" );//请选择是否继续释放

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");

}

}