1. 程式人生 > >作業系統固定分割槽管理方式的主存分配回收模擬系統的設計

作業系統固定分割槽管理方式的主存分配回收模擬系統的設計

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

}

}