#include"stdio.h" #include"stdlib.h" struct{ char name[8]; float address; /*已分分区起始地址*/ float length; /*已分分区长度,*/ int flag; /*已分配区表登记栏标志,用"0"表示空栏目*/ }used_table[10]; /*已分配区表*/ struct{ float address; /*空闲区起始地址*/ float length; /*空闲区长度*/ int flag; /*空闲区表登记栏标志,用"0"表示空栏目,用"1"表示未分配*/ }temp,free_table[10]; /*空闲区表*/ void allocate(char str[8],float leg); void sort(); void reclaim(char str[8]);//回收主存函数 void input(); int main() { int i; float length; char name[8]; int caozuo; /*空闲分区表初始化:*/ free_table[0].address=10240; free_table[0].length=102400; free_table[0].flag=1; for(i=1;i<10;i++) free_table[i].flag=0; /*已分配表初始化:*/ for(i=0;i<10;i++){ used_table[i].flag=0; strcpy(used_table[i].name,"---"); } input(); while(1) { printf("请选择操作 1.分配 2.回收 "); scanf("%d",&caozuo); if(caozuo==1) { printf("输入进程名和作业所需长度: "); scanf("%s",&name); scanf("%f",&length); allocate(name,length);/*分配主存空间*/ } else { printf("输入要回收分区的进程名"); scanf("%s",&name); reclaim(name);/*回收主存空间*/ } input(); } return 0; } void input() { int i; printf("输出空闲区表: 起始地址 分区长度 标志 "); for(i=0;i<10;i++) { printf(" %.0f %9.0f %9d ",free_table[i].address,free_table[i].length,free_table[i].flag); } printf("输出已分配区表: 名称 起始地址 分区长度 标志 "); strcpy(used_table[0].name,"sys"); used_table[0].address=0; used_table[0].length=10240; used_table[0].flag=1; for(i=0;i<10;i++) { if(used_table[i].flag!=0) printf("%s %.0f %9.0f %9d ",used_table[i].name,used_table[i].address,used_table[i].length,used_table[i].flag); else printf("%s %.0f %9.0f %9d ",used_table[i].name,used_table[i].address,used_table[i].length,used_table[i].flag); } } int uflag;//分配表标志 int fflag;//空闲表标志 void allocate(char str[8],float leg) { int k,i; fflag=0; for(k=0;k<10;k++) { if(!strcmp(str,used_table[k].name)) { printf(" 存在相同名称的作业,请重新输入 "); return; } } for(i=0;i<10;i++) { if(free_table[i].flag==1 && free_table[i].length>=leg) { fflag=1; break; } } if(fflag==0) printf("没有满足条件的空闲区 "); else { for(k=1;k<10;k++) { if(used_table[k].flag==0) { strcpy(used_table[k].name,str); used_table[k].length=leg; used_table[k].address=free_table[i].address; used_table[k].flag=1; free_table[i].address=free_table[i].address+leg; free_table[i].length=free_table[i].length-leg; free_table[i].flag=1; break; } } } } void sort() { int i,j; for(i = 0; i < 10; i++) { for(j = 0; j < 10-i; j++) { if(free_table[j].address > free_table[j+1].address) { if(free_table[j+1].address==0) break; temp=free_table[j]; free_table[j]=free_table[j+1]; free_table[j+1]=temp; } } } } void reclaim(char str[8]) { int k,i; float uend_address; float fend_address; uflag=0; fflag=0; for(k=1;k<10;k++) { if(!strcmp(str,used_table[k].name)) { uflag=1; break; } } if(uflag==0) printf(" 找不到该进程! "); else { for(i=0;i<10;i++) { uend_address=used_table[k].address+used_table[k].length; fend_address=free_table[i].address+free_table[i].length; if(used_table[k].address==fend_address)//上邻 { fflag=1; free_table[i].length=free_table[i].length+used_table[k].length; free_table[i].flag=1; strcpy(used_table[k].name,"---"); used_table[k].flag=0; used_table[k].length=0; used_table[k].address=0; printf(" 已回收! "); break; } else { if(free_table[i].address==uend_address)//下邻 { fflag=1; free_table[i].address=used_table[k].address; free_table[i].length=free_table[i].length+used_table[k].length; free_table[i].flag=1; strcpy(used_table[k].name,"---"); used_table[k].flag=0; used_table[k].length=0; used_table[k].address=0; printf(" 已回收! "); break; } } } if(fflag==0)//上下领都没有空闲 { i=0; for(i=0;i<10;i++) { if(free_table[i].flag==0) { free_table[i].address=used_table[k].address; free_table[i].length=used_table[k].length; free_table[i].flag=1; strcpy(used_table[k].name,"---"); used_table[k].length=0; used_table[k].flag=0; used_table[k].address=0; break; } } printf(" 已回收! "); } } sort(); }