实验项目 名称 | |
实验 目的及要求 | 1、深入了解采用可变分区存储管理方式的内存分配回收的实现 |
实验 内容 | 编写程序完成可变分区存储管理方式的内存分配回收 |
实验步骤 | 1、确定内存空间分配表 2、采用最优适应算法完成内存空间的分配和回收 3、编写主函数对所做工作进行测试 |
实验环境 | Windows XP、visualstudio 2005 |
实验结果与 分析 | #define n 10 #define m 10 #define minisize 100 struct { float address; float length; int flag; }used table[n]; struct { float address; float length; int flag; }free_table[m]; allocate(j,xk) char j; float xk; { int i,k; float ad; k=-1; for(i=0;i<m;i++) if(free_table[i].length>=xk&&free_table[i].flag==1) if(k==-1||free_table[i].length<free_table[k].length) k=i; if(k==-1) {printf("无T可¨¦用®?空?闲D区?\n"); return; } if(free_table[k].length-xk<=minisize) { free_table[k].flag=0; ad=free_table[k].address; xk=free_table[k].length; } else {free_table[k].length=free_table[k].length-xk; ad-free_table[k].address+free_table[k].length; } i=0; while{used_table[i].flag!=0&&i<n) i++; if(i>=n) {printf("无T表À¨ª目?填¬?写¡ä已°?分¤?分¤?区?,ê?错䨪误¨®\n"); if(free_table[k].flag==0) free_table[k].flag=1; else {used_table[i].address=ad; used_table[i].length=xk; used_table[i].flag=j; } return; } reclaim(j) char J; {int i,k,j,s,t; float S,L; s=0; while((used_table[s].flag!=J||used_table[s].flag==0)&&s<n) s++; if(s>=n) {printf("¨°不?到Ì?该?作Á¡Â业°¦Ì\n"); return; } used_table[s].flag=0; s=used_table[s].address; L=used_table[s].length; j==1;k=-1;i=0; while(i<m&&(j==-1||k==-1)) { if(free_table[i].glag==0) {if(free_table[i].address+free_table[i].length==s)k=i; if(free_table[i].address==S+L)j=i; } i++; } if(k!=-1) if(j!=1) {free_table[k].length=free_table[j].length+free_table[k].length+L; free_table[j].flag=0; } else free_table[k].length=free_table[k].length+L; else if(j!=-1) {free_table[j].address=S; free_table[j].length=free_table[j].length+L; } else { t=0; while(free_table[t].flag==1&&t<m) t++; if(t>=m) { printf("内¨²存ä?空?闲D表À¨ª没?有®D空?间?,ê?回?收º?空?间?失º¡ì败㨹\n"); used_table[s].flag=J; return; } free_table[t].address=S; free_table[t].length=L; free_table[t].flag=1; } return(ture); main() { int i,a; float xk; char J; free_table[0].address=10240; free_table[0].length=102400; free_table[0].flag=1; for(i=1;i<m;i++) free_table[i].flag=0; for(i=0;i<n;i++) used_table[i].flag=0; while(l) {printf("选?择?功|能¨¹项?(ꡧ0退ª?出?,ê?1分¤?配?内¨²存ä?,ê?2回?收º?内¨²存ä?,ê?3显?示º?内¨²存ä?)ê?\n"); printf("选?择?功|能¨¹项?(ꡧ0~3)ê?:êo"); scanf("%d",&a); switch(a) {case 0;exit(0); case 1; printf ("输º?入¨?作Á¡Â业°¦Ì名?J和¨ª作Á¡Â业°¦Ì所¨´需¨¨长¡è度¨¨xk:êo"); scanf("%*c%c%f",&J,&xk); allocate(J,xk); break; case 2; printf("输º?入¨?要°a回?收º?分¤?区?的Ì?作Á¡Â业°¦Ì名?"); scanf("%*c%c",&J); reclaim(J); break; case 3; printf("输º?入¨?空?闲D区?表À¨ª:êo \n起e始º?地Ì?址¡¤ 分¤?区?长¡è度¨¨ 标À¨º志?\n"); for(i=0;i<m;i++) printf("%5.0f%10.0f%6d\n",free_table[i].address,free_table[i].length,free_table[i].flag); printr("按ã¡ä任¨?意°a键¨¹,ê?输º?出?已°?分¤?分¤?区?表À¨ª\n"); getch(); printf("输º?出?已°?分¤?分¤?区?表À¨ª:êo\n起e始º?地Ì?址¡¤ 分¤?区?长¡è度¨¨ 标À¨º志?\n"); for(i=0;i<n;i++) if(used_table[i].flag!=0) printf{"%6.0f%9.0f%6c\n",used_table[i].address,used_table[i].length,used_table[i]flag); else printf{"%6.0f%9.0f%6d\n",used_table[i].address,used_table[i].length,used_table[i]flag); break; default:printf("没?有®D该?选?项?\n"); } } } } } |
注:可根据实际情况加页
发布评论