《主存储器空间的分配和回收.pdf》由会员分享,可在线阅读,更多相关《主存储器空间的分配和回收.pdf(13页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、-.实验二实验二主存储器空间的分配和回收主存储器空间的分配和回收一、实验题目一、实验题目模拟在分页式管理方式下采用位示图来表示主存分配情况, 实现主存空间的分配和回收。 提示: (1)、 分页式存储器把主存分成大小相等的假设干块,作业的信息也按块的大小分页,作业装入主存时可把作业的信息按页分散存放在主存的空闲块中,为了说明主存中哪些块已经被占用,哪些块是尚未分配的空闲块,可用一位示图来指出。位示图可由假设干存储单元来构成,其中每一位与一个物理块对应,用0/1 表示对应块为空闲/已占用。(2)、 假设某系统的主存被分成大小相等的 64 块, 那么位示图可用 8 个字节来构成,另用一单元记录当前空
2、闲块数。如果已有第 0,1,4,5,6,9,11,13,24,31,共 10 个主存块被占用了,那么位示图情况如下:位数号012345610010001100000000000001000001000000110000010000000001000节字01234567.优选-.700000000(3)、当要装入一个作业时,根据作业对主存的需要量,先查当前空闲块数是否能满足作业要求,假设不能满足那么输出分配不成功。假设能满足,那么查位示图,找出为0的一些位,置上占用标志1,从当前空闲块数中减去本次占用块数。按找到的计算出对应的块号,其计算公式为:块号= j 8+i其中,j 表示找到的是第 n 个
3、字节,I 表示对应的是第 n 位。根据分配给作业的块号,为作业建立一页表,页表格式:页号012(4) 、当一个作业执行完毕,归还主存时,根据该作业的页表可以知道应归还的块号,由块号可计算出在位示图中的对应位置,把对应位的占用标志清成0,表示对应的块已成为空闲块。归还的块数参加到当前空闲块数中。由块号计算在位示图中的位置的公式如下:字节号 j=块号/8 表示取整位数 i=块号/8 表示取余块号.优选-.(5) 设计实现主存分配和回收的程序。假定位示图的初始状态如2所述,现有一信息量为 5 页的作业要装入, 运行你所设计的分配程序,为作业分配主存且建立页表格式如3所述 。然后假定有另一作业执行完毕
4、,它占用的块号为第 4,5,6 和 31 块,运行你所设计的回收程序,收回作业归还的主存块。要求能显示和打印分配或回收前后的位示图和当前空闲块数, 对完成一次分配后还要显示或打印为作业建立的页表。二、程序中使用的数据构造及符号说明二、程序中使用的数据构造及符号说明1、数据构造:本程序中使用的是:一维数组和二维数组2、函数说明:void menu():显示菜单项选择项huawei():调用 menu()函数显示菜单,并且根据允许输入调用相应函数,执行操作。void Initvalue():根据输入开辟相应的块号空间,并且按照题目要求初始化已占用块号void kongxiankuai():将空闲块
5、号保存在 kuai数组中,并记录数组中元素个数void printkongxiankuaishu():打印空闲块号void caozuo():根据作业所需块数修改位示图void yebiao():打印页表void weishitu():打印位示图.优选-.void guihuan():按照需要释放存三、流程图三、流程图Main 函数huawei()yecaobiao()四、打印一份源程序并附上注释四、打印一份源程序并附上注释weiInitvalue()Cpp 文件:*include*include*include*includestdlib.h*includelin1402.hint main
6、()头文件:int *table;int m,n;int b=0;.优选-guiprintkongxiankkongxiankexitkongxianhuawei();return 0;-.int *kuai;int changdu10;int k;int v=0;int kuaihao1064;/*根据输入开辟相应的块号空间,并且按照题目要求初始化已占用块号*/void Initvalue()int i,j;printf(请输入被分成主存块的总字节数和位数:);scanf(%d,&n);scanf(%d,&m);table=(int *)malloc(sizeof(int)*n);/使用指针
7、动态建立一个位视图的数组for(i=0;in;i+)kuai=(int *)malloc(sizeof(int)*(m*n);for(i=0;in;i+)for(j=0;jm;j+)tablei=(int *)malloc(sizeof(int)*m);.优选-.tableij=0;table00=1,table01=1,table04=1,table05=1,table06=1;table11=1,table13=1,table15=1,table30=1,table37=1;/按照题目要求把第 0 1 4 5 6 9 11 13 24 31 块置为占用/*将空闲块号保存在 kuai数组中,
8、并记录数组中元素个数*/void kongxiankuai()int i,j,sum=0;k=0;for(i=0;in;i+)for(j=0;jm;j+)if(tableij=0)kuaik=i*8+j;.优选-.-k+; /记录空闲块数/* 打印空闲块号*/void printkongxiankuaishu()int i;printf(当前空闲的块数:n);for(i=0;i64-k)while(need!=0)changduv=g;for(i=0;in;i+)for(j=0;jm;j+)if(tableij=0&need!=0)/作业分配存储tableij=1;kuaihaovg=i*8+
9、j; /保存作业块号g+;need=need-1;printf(存缺乏。n);goto begin1;.优选-.-v+;begin1:kongxiankuai();void yebiao()/打印页表int i,j;printf(打印页表n);for(j=0;jv;j+)printf(页号块号n); for(i=0;ichangduj;i+) printf(%d %dn,i,kuaihaoji);void weishitu()/打印位示图int i,j;printf(打印位示图n);printf( );for(i=0;in;i+).优选-.-printf(%3d,i);printf(n);fo
10、r(i=0;in;i+)printf(%3d,i);for(j=0;jm;j+)printf(%3d,tableij);printf(n);void guihuan() /按照需要释放存int i,q,p,j; /p 表示数组长度printf(请输入归还的进程号:);scanf(%d,&p);for(q=0;qchangdup-1;q+)i=kuaihaopq/8;.优选-.-j=kuaihaopq%8;tableij=0;/找到对应得位置,然后置为 0;kongxiankuai();void menu()/显示操作列表printf(存储器管理:n);printf(1.初始化n);printf
11、(2.打印位视图n);printf(3.打印页表n);printf(4.进程操作n);printf(5.归还n);printf(6.打印空闲块号n);printf(7.退出n);void huawei()/根据输入执行相应操作begin:menu();/输出菜单列表int q;scanf(%d,&q);switch(q).优选-.-case 1:Initvalue();goto begin;break;case 2:weishitu();goto begin;break;case 3:yebiao();goto begin;break;case 4:caozuo();goto begin;break;case 5:guihuan();goto begin;break; case 6:printkongxiankuaishu();goto begin;break;case 7:exit(0);.优选-.-五、运行结果五、运行结果.优选-
限制150内