标签:
实验四主存空间的分配和回收
1.1. 实验目的
用高级语言完成一个主存空间的分配和回收程序,以加深对动态分区分配方式及其算法的理解。
1.2. 实验要求
采用连续分配方式之动态分区分配存储管理,使用首次适应算法、循环首次适应算法、最佳适应算法和最坏适应算法4种算法完成设计。
(1)**设计一个作业申请队列以及作业完成后的释放顺序,实现主存的分配和回收。采用分区说明表进行。
(2)或在程序运行过程,由用户指定申请与释放。
(3)设计一个空闲区说明表,以保存某时刻主存空间占用情况。
把空闲区说明表的变化情况以及各作业的申请、释放情况显示。
根据指定的实验课题,完成设计、编码和调试工作,完成实验报告。
可以选用Visual C++作为开发环境。也可以选用Windows下的VB,CB或其他可视化环境,利用各种控件较为方便。自主选择实验环境。
#include<stdio.h>
#include<conio.h>
#include<string.h>
#define MAX 24
struct partition{
char pn[10];
int begin;
int size;
int end; ////////
char status; //////////
};
typedef struct partition PART;
第一步:(第13周完成)
完成程序数据结构的创建,初始化内存分配情况,创建空闲分区表和已分配分区表。
#include<stdio.h> #include<conio.h> #include<string.h> #define MAX 24 #define M 1024 #define SIZE 1 void PT(); struct partition{ char pn[10]; //名字 int begin; //开始位置 int size; //块大小 int end; //结束地址 char status; //状态 }; typedef struct partition PART; PART Free[MAX],Used[MAX],addresses[MAX],Copy[MAX]; int sumFree,sumUsed,sumaddresses,vsum[MAX]; int freeblock=0; void addFree(int i,int j) { strcpy(addresses[i].pn,Free[j].pn); addresses[i].begin=Free[j].begin; addresses[i].size=Free[j].size; addresses[i].status=Free[j].status; } void addUsed(int i,int j) { strcpy(addresses[i].pn,Used[j].pn); addresses[i].begin=Used[j].begin; addresses[i].size=Used[j].size; addresses[i].status=Used[j].status; } void cpit(PART* in,PART* out,int sum) { int i; for(i=0;i<=sum;i++) { strcpy(in[i].pn,out[i].pn); in[i].begin=out[i].begin; in[i].size=out[i].size; in[i].end=out[i].end; in[i].status=out[i].status; } } void fch(char* pn,int size) { int i,j; for(i=0;i<=sumFree;i++) { if(Free[i].size>=size) { sumUsed++; strcpy(Used[sumUsed].pn,pn); Used[sumUsed].begin=Free[sumFree].begin; Used[sumUsed].size=size; Used[sumUsed].status=‘u‘; addUsed(sumaddresses,sumUsed); if(Free[i].size-size<=SIZE) { for(j=i;j<=sumFree;j++) { Free[i].size; strcpy(Free[i].pn,Free[j].pn); Free[i].size=Free[j].size; Free[i].status=Free[j].status; Free[i].begin=Free[j].begin; Free[i].end=Free[j].end; } sumFree--; } else { Free[i].size=Free[i].size-size; } sumaddresses++; addFree(sumaddresses,sumFree); break; } else { printf("无法分配!\n"); } } } void nfch(char* pn,int size) { int i,j; for(i=freeblock%sumFree;i<=sumFree;i++) { if(Free[i].size>=size) { sumUsed++; freeblock=i+1; strcpy(Used[sumUsed].pn,pn); Used[sumUsed].begin=Free[sumFree].begin; Used[sumUsed].size=size; Used[sumUsed].status=‘u‘; addUsed(sumaddresses,sumUsed); if(Free[i].size-size<=SIZE) { for(j=i;j<=sumFree;j++) { Free[i].size; strcpy(Free[i].pn,Free[j].pn); Free[i].size=Free[j].size; Free[i].status=Free[j].status; Free[i].begin=Free[j].begin; Free[i].end=Free[j].end; } sumFree--; } else { Free[i].size=Free[i].size-size; } sumaddresses++; addFree(sumaddresses,sumFree); break; } else { printf("无法分配!\n"); } } } void sortMAX(int sum) { int temp,i,j; for(i=0;i<sum;i++) { vsum[i]=i; } for(i=0;i<sum;i++) { for(j=i;j<=sum;j++) { if(Copy[i].size<Copy[j].size) { temp=vsum[i]; vsum[i]=vsum[j]; vsum[j]=temp; } } } } void sortMIN(int sum) { int temp,i,j; for(i=0;i<sum;i++) { vsum[i]=i; } for(i=0;i<sum;i++) { for(j=i;j<=sum;j++) { if(Copy[i].size>Copy[j].size) { temp=vsum[i]; vsum[i]=vsum[j]; vsum[j]=temp; } } } } void betfch(char* pn,int size) { int i,j; cpit(Copy,Free,sumFree); sortMAX(sumFree); i=vsum[0]+1; if(Free[i].size>=size) { sumUsed++; strcpy(Used[sumUsed].pn,pn); Used[sumUsed].begin=Free[sumFree].begin; Used[sumUsed].size=size; Used[sumUsed].status=‘u‘; addUsed(sumaddresses,sumUsed); if(Free[i].size-size<=SIZE) { for(j=i;j<=sumFree;j++) { Free[i].size; strcpy(Free[i].pn,Free[j].pn); Free[i].size=Free[j].size; Free[i].status=Free[j].status; Free[i].begin=Free[j].begin; Free[i].end=Free[j].end; } sumFree--; } else { Free[i].size=Free[i].size-size; } sumaddresses++; addFree(sumaddresses,sumFree); } else { printf("无法分配!\n"); } } void badfch(char* pn,int size) { int i,j; cpit(Copy,Free,sumFree); sortMAX(sumFree); for(i=0;i<sumFree;i++) { i=vsum[i]+1; if(Free[i].size>=size) { sumUsed++; strcpy(Used[sumUsed].pn,pn); Used[sumUsed].begin=Free[sumFree].begin; Used[sumUsed].size=size; Used[sumUsed].status=‘u‘; addUsed(sumaddresses,sumUsed); if(Free[i].size-size<=SIZE) { for(j=i;j<=sumFree;j++) { Free[i].size; strcpy(Free[i].pn,Free[j].pn); Free[i].size=Free[j].size; Free[i].status=Free[j].status; Free[i].begin=Free[j].begin; Free[i].end=Free[j].end; } sumFree--; } else { Free[i].size=Free[i].size-size; } sumaddresses++; addFree(sumaddresses,sumFree); break; } else { printf("无法分配!\n"); } } } void choose(char* pn,int size) { int xuanze; printf("请选择算法\n"); printf("(1) 首次适应算法\n"); printf("(2) 循环首次适应算法\n"); printf("(3) 最佳适应算法\n"); printf("(4) 最坏适应算法\n"); scanf("%d",&xuanze); switch(xuanze) { case 1: fch(pn,size); break; case 2: nfch(pn,size); break; case 3: betfch(pn,size); break; case 4: badfch(pn,size); break; } PT(); } void input() { int i; int bo1=0,bo2=0; char pn[10]; int size; instart: printf("请输入作业名称\n"); scanf("%s",&pn); for(i=0;i<=sumUsed;i++) { if(strcmp(Used[i].pn,pn)==0) { bo1=1; break; } } if(bo1==0) { printf("请输入作业所占空间大小\n"); scanf("%d",&size); for(i=0;i<=sumFree;i++) { if(Free[i].size>=size) { bo2=1; break; } } if(bo2==1) { choose(pn,size); } } else { goto instart; } } void init() { sumFree=0,sumUsed=0,sumaddresses=0; strcpy(Used[1].pn,"SYSTEM"); Used[1].begin=0; Used[1].size=100; Used[1].status=‘u‘; sumUsed++; sumaddresses++; addUsed(sumaddresses,sumUsed); printf("初始化,设内存总容量为512k\n"); printf("系统从低地址部分开始使用,占用100k\n\n"); strcpy(Free[1].pn,"----"); Free[1].begin=100; Free[1].size=M-Free[1].begin; Free[1].status=‘f‘; sumFree++; sumaddresses++; addFree(sumaddresses,sumFree); } void PT() { int i; printf("空闲区表Free\n"); printf("\t\tNo.\tproname\tbegin\tsize\tstatus\n"); for(i=1;i<=sumFree;i++) printf("\t\tNo.%d\t%s\t%d\t%d\t%c\n",i,Free[i].pn,Free[i].begin,Free[i].size,Free[i].status); printf("已分配分区表Used\n"); printf("\t\tNo.\tproname\tbegin\tsize\tstatus\n"); for(i=1;i<=sumUsed;i++) printf("\t\t\No.%d\t%s\t%d\t%d\t%c\n",i,Used[i].pn,Used[i].begin,Used[i].size,Used[i].status); printf("内存使用情况,按起始址增长的排:\n"); printf("\t\tNo.\tproname\tbegin\tsize\tstatus\n"); for(i=1;i<=sumaddresses;i++) printf("\t\tNo.%d\t%s\t%d\t%d\t%c\n",i,addresses[i].pn,addresses[i].begin,addresses[i].size,addresses[i].status); } int main() { init(); PT(); input(); return 0; }
标签:
原文地址:http://www.cnblogs.com/huang123/p/5594352.html