- 设计动态分区首次适应分配、回收算法。
- 设计“未分配区说明表”,格式为: 序号 始址 长度 状态
-
设计“已分配区说明表”,格式为: 作业名 始址 长度 状态
-
设计显示程序,将“未分配区说明表”和“已分配区说明表”的 内容,显示在屏幕上
-
初始分配从一个空闲区分配起,回收时要合并空区。
#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<string.h> #include<windows.h> #define N 5 #define MINSIZE 0.5 typedef struct EMP { int num; int start; int length; int status; }EMP; typedef struct USE { int num; int start; int length; int status; char pname[10]; }USE; void show(EMP e[], USE u[]) { int i; printf("************空闲分区表************\n"); printf("分区编号 起始地址 长度 状态\n"); for (i = 0;i < N;i++) { if (e[i].status == 1) printf(" %d %d %d %d\n", i, e[i].start, e[i].length, e[i].status); } printf("\n************分区使用表*************\n"); printf("编号 起始地址 长度 状态 作业名\n"); for (i = 0;i < N;i++) { if (u[i].status == 1) printf(" %d %d %d %d %s\n", i, u[i].start, u[i].length, u[i].status, u[i].pname); } } void fenpei(EMP e[], USE u[]) { char name[10]; int i,j,k,space=0; printf("请输入作业名:\n"); scanf("%s", name); printf("请输入请求的内存空间:\n"); scanf("%d", &space); for ( i = 0;i < N;i++) if (e[i].status == 1 && e[i].length > space) break; if (i == N) printf("wait a monnent\n"); else { k = e[i].length - space; if (k >= MINSIZE) { e[i].start = e[i].start+space; e[i].length = k; } else e[i].status = 0; for (j = 0;j < N;j++) { if (u[j].status == 0) { u[j].start = e[i].start-space; u[j].length = space; u[j].status = e[i].status; strcpy(u[j].pname,name); break; } printf("分配成功!\n"); } } } void huishou(EMP e[], USE u[]) { char name[10]; int i,n,m,j; printf("请输入结束的作业名:\n"); scanf("%s", &name); getchar(); for (i = 0;i < N;i++) if(strcmp(u[i].pname,name)==0) { u[i].status = 0; for(m=0;m<N;m++) for (n= 0;n < N;n++) { if (e[n].start + e[n].length == u[i].start) if (e[m].start = u[i].length + u[i].start)//有上下相邻的空闲分区 { e[n].length = e[n].length + e[m].length + u[i].length; e[m].status = 0; } else e[n].length = e[n].length + u[i].length;//只有上相邻的空闲分区 else//无上相邻 if (e[m].start == u[i].length + u[i].start)//只有下相邻的空闲分区 { e[m].length = e[m].length + u[i].length; e[m].start = u[i].start; } } if (m = N && n != N) for(j=0;j<N;j++) if (e[j].status == 0) { e[j].start = u[i].start; e[j].length = u[i].length; e[j].status = u[i].status; } printf("回收成功!\n"); break; } for (i = 0;i < N - 1, e[i].status == 1;i++)//按首次适应算法调整空闲分区表的顺序 for (j = i + 1;j < N, e[j].status == 1;j++) if (e[j].start < e[i].start) { EMP temp; temp = e[j]; e[j] = e[i]; e[i] =temp; } if (i == N) printf("未找到!"); } void main() { EMP e[N]; USE u[N]; e[0].start = 400; e[0].length = 2160; e[0].status = 1; u[0].status = 0; for (int i = 1;i < N;i++) { u[i].status = 0; e[i].status = 0; } int sel, flag=1; while (flag) { printf("************系统菜单************\n"); printf("\t1\t分配\n"); printf("\t2\t回收\n"); printf("\t3\t显示\n"); printf("\t0\t退出\n"); printf("*********************************\n"); printf("input your choice:"); scanf("%d",&sel); getchar(); switch (sel) { case 1:fenpei(e, u);break; case 2:huishou(e, u);break; case 3:show(e, u);break; case 0:flag = 0;break; } } }
设计动态分区首次适应分配、回收算法
于 2022-04-30 21:41:40 首次发布