内存分配回收.docx
- 文档编号:8010697
- 上传时间:2023-01-27
- 格式:DOCX
- 页数:14
- 大小:133.68KB
内存分配回收.docx
《内存分配回收.docx》由会员分享,可在线阅读,更多相关《内存分配回收.docx(14页珍藏版)》请在冰豆网上搜索。
内存分配回收
操作系统课程设计报告
题目:
内存管理
班级:
学号:
姓名:
指导教师:
日期:
12.7
内存管理
一、实验目的
通过本实验加深对计算机为进程分配内存算法的理解,提高用C语言编程的能力。
二、实验要求
编写程序,分别实现用首次适应算法、循环首次适应算法、最佳算法、最坏算法分别实现对进程的分配,每分配一次输出一次内存状态。
分配完毕可以按要求回收内存。
三、实验内容
本实验主要针对操作系统中内存管理相关理论进行实验,要求实验者编写一个程序,该程序管理一块虚拟内存,实现内存分配和回收功能。
1)设计内存分配的数据结构(空闲分区表/空闲分区链),
2)设计内存分配函数;
3)设计内存回收函数;
4)实现动态分配和回收操作;
5)可动态显示每个内存块
程序流程图:
四、运行结果分析
完整代码:
#include
voidscsy();
voidxhscsy();
voidzjsy();
voidzhsy();
intnum;
inta[20][20];
voidmain()
{
inti;
intsel;
printf("请输入空闲区数目\n");
scanf("%d",&num);
for(i=0;i { printf("请输入空闲区起始地址空闲区大小\n"); scanf("%d",&a[i][0]); scanf("%d",&a[i][1]); } printf("***********************\n*1、首次适应算法*\n*2、循环首次适应算法*\n*3、最佳适应算法*\n*4、最坏适应算法*\n***********************\n"); scanf("%d",&sel); switch(sel) { case1: scsy(); break; case2: xhscsy(); break; case3: zjsy(); break; case4: zhsy(); break; default: break; } } voidscsy()//首次适应算法 { inti; intj; intp; intq=1; intshumu; intdaxiao; intb[20][20][20]; intk; intm; printf("请输入进程数目\n"); scanf("%d",&shumu); for(i=0;i { printf("请输入进程所需内存大小\n"); scanf("%d",&daxiao); for(j=0;j { if(a[j][1]>=daxiao) { b[q][0][0]=j;//起址位置 a[j][0]=a[j][0]+daxiao; a[j][1]=a[j][1]-daxiao; j=num; b[q][0][1]=daxiao;//数的大小 q++; } } printf("空闲区起始地址大小\n"); for(p=0;p printf("%5d%d\n",a[p][0],a[p][1]); } for(i=0;i { printf("请输入回收进程号\n"); scanf("%d",&m); printf("空闲区起始地址大小\n"); k=b[m][0][0]; a[k][0]=a[k][0]-b[m][0][1]; a[k][1]=a[k][1]+b[m][0][1]; for(p=0;p printf("%5d%d\n",a[p][0],a[p][1]); } } voidxhscsy()//循环首次适应算法 { inti; intj; intp; intq=1; intshumu; intdaxiao; ints=0; intb[20][20][20]; intk; intm; printf("请输入进程数目\n"); scanf("%d",&shumu); printf("请输入进程所需内存大小\n"); scanf("%d",&daxiao); for(j=0;j { if(a[j][1]>=daxiao) { b[q][0][0]=j; b[q++][0][1]=daxiao; a[j][0]+=daxiao; a[j][1]-=daxiao; s=j; j=num; } } printf("空闲区起始地址大小\n"); for(p=0;p printf("%5d%d\n",a[p][0],a[p][1]); for(i=1;i { printf("请输入进程所需内存大小\n"); scanf("%d",&daxiao); for(j=s;j { if(a[j][1]>=daxiao) { b[q][0][0]=j; b[q++][0][1]=daxiao; a[j][0]+=daxiao; a[j][1]-=daxiao; s=j; j=num; printf("空闲区起始地址大小\n"); for(p=0;p printf("%5d%d\n",a[p][0],a[p][1]); } } } for(i=0;i { printf("请输入回收进程号\n"); scanf("%d",&m); printf("空闲区起始地址大小\n"); k=b[m][0][0]; a[k][0]=a[k][0]-b[m][0][1]; a[k][1]=a[k][1]+b[m][0][1]; for(p=0;p printf("%5d%d\n",a[p][0],a[p][1]); } } voidzjsy()//最佳适应算法 { inti; intj; intc[20][20]; intshumu; intdaxiao; intd; inte; intf; intg; intp; intb[20][20][20]; intq=1; intm; intk; printf("请输入进程数目\n"); scanf("%d",&shumu); for(i=0;i { d=0; printf("请输入进程所需内存大小\n"); scanf("%d",&daxiao); for(j=0;j { if(a[j][1]>=daxiao) { c[d][0]=j; c[d++][1]=a[j][1]-daxiao; } } f=c[0][1]; g=c[0][0]; for(e=0;e { if(c[e][1] { f=c[e][1]; g=c[e][0]; } } b[q][0][0]=g; b[q++][0][1]=daxiao; a[g][0]+=daxiao; a[g][1]-=daxiao; printf("空闲区起始地址大小\n"); for(p=0;p printf("%5d%d\n",a[p][0],a[p][1]); } for(i=0;i { printf("请输入回收进程号\n"); scanf("%d",&m); printf("空闲区起始地址大小\n"); k=b[m][0][0]; a[k][0]=a[k][0]-b[m][0][1]; a[k][1]=a[k][1]+b[m][0][1]; for(p=0;p printf("%5d%d\n",a[p][0],a[p][1]); } } voidzhsy()//最坏适应算法 { inti; intj; intc[20][20]; intshumu; intdaxiao; intd; inte; intf; intg; intp; intb[20][20][20]; intq=1; intm; intk; printf("请输入进程数目\n"); scanf("%d",&shumu); for(i=0;i { d=0; printf("请输入进程所需主存大小\n"); scanf("%d",&daxiao); for(j=0;j { if(a[j][1]>=daxiao) { c[d][0]=j; c[d++][1]=a[j][1]-daxiao; } } f=c[0][1]; g=c[0][0]; for(e=0;e { if(c[e][1]>f) { f=c[e][1]; g=c[e][0]; } } b[q][0][0]=g; b[q++][0][1]=daxiao; a[g][0]+=daxiao; a[g][1]-=daxiao; printf("空闲区起始地址大小\n"); for(p=0;p printf("%5d%d\n",a[p][0],a[p][1]); } for(i=0;i { printf("请输入回收进程号\n"); scanf("%d",&m); printf("空闲区起始地址大小\n"); k=b[m][0][0]; a[k][0]=a[k][0]-b[m][0][1]; a[k][1]=a[k][1]+b[m][0][1]; for(p=0;p printf("%5d%d\n",a[p][0],a[p][1]); } }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 内存 分配 回收