《操作系统储存管理程序》由会员分享,可在线阅读,更多相关《操作系统储存管理程序(5页珍藏版)》请在金锄头文库上搜索。
1、#include #include #include #include #include#define n 10 /*假定系统允许的最大作业数为 n,假定模拟实验中 n 值为 10*/ #define m 10 /*假定系统允许的空闲区表最大为 m,假定模拟实验中 m 值为 10*/ #define minisize 100 /*空闲分区被分配时,如果分配后剩余的空间小于 minisize,则将该空闲分 区全部分配,若大于 minisize,则切割分配*/struct float address; /*已分配分区起始地址*/ float length; /*已分配分区长度,单位为字节*/ in
2、t flag; /*已分配区表登记栏标志,用“0“表示空栏目*/ used_tablen; /*已分配区表*/ struct float address; /*空闲区起始地址*/ float length; /*空闲区长度,单位为字节*/ int flag; /*空闲区表登记栏标志,用“0“表示空栏目,用“1“表示未分配*/ free_tablem; /*空闲区表*/ void allocate(char J,float xk) /*给 J 作业,采用最佳分配算法分配 xk 大小的空间*/ int i,k; float ad; k=-1; for(i=0;i=xk /*修正空闲区表*/ if(
3、free_tablek.flag=0) /*前面找到的是整个空闲分区*/ free_tablek.flag=1; else /*前面找到的是某个空闲分区的一部分*/ free_tablek.length=free_tablek.length+xk; return; else /*修改已分配表*/ used_tablei.address=ad; used_tablei.length=xk; used_tablei.flag=J; return;/*主存分配函数结束*/ void reclaim(char J) /*回收作业名为 J 的作业所占主存空间*/ int i,k,j,s,t; float
4、 S,L; /*寻找已分配表中对应登记项*/ s=0; while(used_tables.flag!=J|used_tables.flag=0) return; /*修改已分配表*/ used_tables.flag=0; /*取得归还分区的起始地址 S 和长度 L*/ S=used_tables.address; L=used_tables.length; j=-1;k=-1;i=0; /*寻找回收分区的空闲上下邻,上邻表目 k,下邻表目 j*/ while(i=m)/*空闲区表满,回收空间失败,将已分配表复原*/ printf(“主存空闲表没有空间,回收空间失败n“); used_tab
5、les.flag=J; return; free_tablet.address=S; free_tablet.length=L; free_tablet.flag=1; return; /*主存回收函数结束*/ int main( ) int i,a; float xk; char J; /*空闲分区表初始化:*/ free_table0.address=10240; /*起始地址假定为 10240*/free_table0.length=10240; /*长度假定为 10240,即 10k*/free_table0.flag=1; /*初始空闲区为一个整体空闲区*/for(i=1;im;i+
6、) free_tablei.flag=0; /*其余空闲分区表项未被使用*/*已分配表初始化:*/ for(i=0;in;i+) used_tablei.flag=0; /*初始时均未分配*/while(1) printf(“选择功能项(0-退出,1-分配主存,2-回收主存,3-显示主存)n“); printf(“选择功项(03) :“); scanf(“%d“, switch(a) case 0: exit(0); /*a=0 程序结束*/ case 1: /*a=1 分配主存空间*/ printf(“输入作业名 J 和作业所需长度 xk: “); scanf(“%*c%c%f“, allo
7、cate(J,xk); /*分配主存空间*/ break; case 2: /*a=2 回收主存空间*/ printf(“输入要回收分区的作业名“); scanf(“%*c%c“, reclaim(J); /*回收主存空间*/ break; case 3: /*a=3 显示主存情况*/ /*输出空闲区表和已分配表的内容*/ printf(“输出空闲区表:n 起始地址 分区长度 标志n“); for(i=0;im;i+) printf(“%6.0f%9.0f%6dn“,free_tablei.address,free_tablei.length, free_tablei.flag); print
8、f(“ 按任意键,输出已分配区表n“); getch(); printf(“ 输出已分配区表:n 起始地址 分区长度 标志n“); for(i=0;in;i+) if(used_tablei.flag!=0) printf(“%6.0f%9.0f%6cn“,used_tablei.address,used_tablei.length, used_tablei.flag); else printf(“%6.0f%9.0f%6dn“,used_tablei.address,used_tablei.length, used_tablei.flag); break; default:printf(“没有该选项n“); /*case*/ /*while*/ return 1;