C语言模拟实现(二)-----可变分区存储管理方式
生活随笔
收集整理的這篇文章主要介紹了
C语言模拟实现(二)-----可变分区存储管理方式
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
系統特點
系統采用最優適應分配算法為作業分配主存空間,而且具有合并、移動技術。
概念區別
合并:每次將作業回收后,若回收后的地址空間與空閑去相鄰,則將其與相鄰的空閑區合并為一塊空閑區。
移動:如果每塊空閑區的內存都不足以滿足要裝入的作業所需的內存,但空閑區的總和夠用,此時采取移動技術。
實現代碼
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h> typedef struct udata{int number;int address;int length;char flag[10]; }data; typedef struct used_table{data udata;data* next; }used_table; typedef struct fdata{int number;int address;int length; }fdata; typedef struct free{fdata fdata;fdata* next; }free_table;//初始化系統狀態 void InitOS(used_table* usedtable,free_table* freetable){used_table* p = usedtable;free_table* p1 = freetable;used_table* upt;free_table* fpt;int i,j;printf("----初始化已分配區----\n");for(i=1;i<4;i++){upt = (used_table*)malloc(sizeof(used_table));printf("請輸入相關信息\n");upt->udata.number = i;printf("請輸入起始地址\n");scanf("%d",&upt->udata.address);printf("請輸入長度\n");scanf("%d",&upt->udata.length);printf("請輸入作業名\n");scanf("%s",upt->udata.flag);p->next = upt;upt->next = NULL;p = upt;}printf("----初始化未分配區----\n");for(j=1;j<4;j++){fpt = (free_table*)malloc(sizeof(free_table));printf("請輸入相關信息\n");fpt->fdata.number = j;printf("請輸入起始地址\n");scanf("%d",&fpt->fdata.address);printf("請輸入長度\n");scanf("%d",&fpt->fdata.length);p1->next = fpt;fpt->next = NULL;p1 = fpt;} }//輸出已分配區表和未分配區表 void Output(used_table *usedtable,free_table *freetable){printf("已分配區表\n");printf("序號 起始地址 長度 作業名\n");used_table* p = usedtable->next;while(p != NULL){if(p->udata.length != 0){printf("%d %d %d %s\n",p->udata.number,p->udata.address,p->udata.length,p->udata.flag);}p=p->next;}printf("------------------\n");printf("未分配區表\n");printf("序號 起始地址 長度 \n");free_table* p1=freetable->next;while(p1 != NULL){if(p1->fdata.length != 0){printf("%d %d %d\n",p1->fdata.number,p1->fdata.address,p1->fdata.length);}p1=p1->next;} } //空閑區合并 void combine(free_table* freetable){free_table* pt = NULL;free_table* pt1 = NULL;fdata temp;for(pt=freetable->next;pt->next != NULL;pt=pt->next){for(pt1=freetable->next;pt1->next != NULL;pt1=pt1->next){if(pt->fdata.address+pt->fdata.length == pt1->fdata.address){pt->fdata.length = pt->fdata.length + pt1->fdata.length;pt1->fdata.address = 0;pt1->fdata.length = 0;}}} }//空閑區移動策略 void move(free_table* freetable,int len){//printf("移動技術\n");free_table* p = freetable->next;free_table* tmp = freetable->next;free_table* tmp1 = freetable->next;int sum = 0;free_table* stop = NULL;//記錄停止移動時,當前的指針while(p != NULL){//printf("jinru\n");sum+=p->fdata.length;//printf("sum = %d",sum);if(sum>=len){//地址空間足夠時,停止移動stop = p;break;}p = p->next;}if(sum < len){printf("空閑區和也不夠\n");}else{//printf("stop = %d\n",stop->fdata.address);//printf("stop = %d\n",stop->fdata.length);stop->fdata.address = tmp->fdata.address;stop->fdata.length = sum;while(tmp1 != stop){tmp1->fdata.address = 0;tmp1->fdata.length = 0;tmp1->fdata.number = 0;tmp1 = tmp1->next;}}//printf("jieshu\n"); }//主存分配 void allocate(used_table* usedtable,free_table* freetable){printf("請輸入要裝入作業的長度\n");int len;scanf("%d",&len);printf("請輸入要裝入作業的名稱\n");char name[10];scanf("%s",name);printf("請輸入要裝入作業的序號\n");int number;scanf("%d",&number);free_table* p = freetable->next;free_table* tmp = NULL;//記錄找到的最小分區int min = 1000;int temp = 0;int flag = 0;//判斷每一塊分區是否滿足while(p != NULL){//尋找能滿足用戶進程的最小分區if(p->fdata.length >= len){if(p->fdata.length-len < min && p->fdata.length-len >= 0){//尋找最小的空間min = p->fdata.length-len;tmp = p;}}else{flag++;}p = p->next;temp++;}if(flag == temp){//每一塊地址空間都小于jobprintf("地址空間不夠,采用移動技術\n");move(freetable,len);}else{used_table* p1 = NULL;used_table* pt = (used_table*)malloc(sizeof(used_table));strcpy(pt->udata.flag,name);pt->udata.length = len;pt->udata.number = number;pt->udata.address = tmp->fdata.address;p1 = usedtable->next;usedtable->next = pt;pt->next = p1;//修改未分配區if(tmp->fdata.length == len){tmp->fdata.length =0;tmp->fdata.address = 0;}else{tmp->fdata.length-=len;tmp->fdata.address = tmp->fdata.address+len;}}} //根據空閑區起始地址遞增排列 void sort_free_table(free_table* freetable){free_table* pt = NULL;free_table* pt1 = NULL;fdata temp;for(pt=freetable->next;pt->next != NULL;pt=pt->next){for(pt1=freetable->next;pt1->next != NULL;pt1=pt1->next){if(pt->fdata.address < pt1->fdata.address && pt->fdata.address != 0){temp = pt->fdata;pt->fdata = pt1->fdata;pt1->fdata = temp;}}} } //主存回收 void reclaim(used_table* usedtable,free_table* freetable){printf("請輸入要回收的作業序號\n");int number;scanf("%d",&number);free_table* pt = (free_table*)malloc(sizeof(free_table));used_table* tmp = NULL;//記錄要回收的作業used_table* p = usedtable->next;while(p != NULL){if(p->udata.number == number){tmp = p;break;}p = p->next;}pt->fdata.number = tmp->udata.number;pt->fdata.length = tmp->udata.length;pt->fdata.address = tmp->udata.address;//消除空間tmp->udata.number = -1;tmp->udata.length = 0;tmp->udata.address = 0;//插入到未分配區free_table* p1 = freetable->next;freetable->next = pt;pt->next = p1; }int main(){used_table usedtable;free_table freetable;//初始化內存分配InitOS(&usedtable,&freetable);//1.輸出此時的已分配區表和未分配區表Output(&usedtable,&freetable);printf("-------------------\n");//2.裝入 Job3(15K),輸出主存分配后的已分配區表和未分配區表allocate(&usedtable,&freetable);Output(&usedtable,&freetable);printf("-------------------\n"); // 3.回收 Job2所占用的主存空間,輸出主存回收后的已分配區表和未分配區表reclaim(&usedtable,&freetable);sort_free_table(&freetable);combine(&freetable);Output(&usedtable,&freetable);printf("-------------------\n");//4.裝入 Job4(130K),輸出主存分配后的已分配區表和未分配區表allocate(&usedtable,&freetable);printf("請重新輸入一次\n");allocate(&usedtable,&freetable);Output(&usedtable,&freetable);return 0; }示例
系統當前狀態如下:
要求:
(1). 輸出此時的已分配區表和未分配區表;
(2). 裝入 Job3(15K),輸出主存分配后的已分配區表和未分配區表;
(3). 回收 Job2所占用的主存空間,輸出主存回收后的已分配區表和未分配區表;
(4).裝入 Job4(130K),輸出主存分配后的已分配區表和未分代碼配區表。
實驗結果
(1)
(2)
(3)
(4)
總結
以上是生活随笔為你收集整理的C语言模拟实现(二)-----可变分区存储管理方式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SaaS 转化 3 步曲:让用户变客户
- 下一篇: 业务中台01:中台解决方案本质在解决什么