操作系统存储管理实验报告.doc
- 文档编号:238320
- 上传时间:2022-10-07
- 格式:DOC
- 页数:15
- 大小:336KB
操作系统存储管理实验报告.doc
《操作系统存储管理实验报告.doc》由会员分享,可在线阅读,更多相关《操作系统存储管理实验报告.doc(15页珍藏版)》请在冰豆网上搜索。
____大学____学院实验报告
课程名称:
计算机操作系统实验名称:
存储管理实验实验日期:
班级:
姓名:
学号:
仪器编号:
XX
实验报告要求:
1.实验目的2.实验要求3.实验步骤4.程序清单5.运行情况6.流程图7.实验体会
1、实验目的
通过编写和调试存储管理的模拟程序以加深对存储管理方案的理解,熟悉虚存管理的各种页面淘汰法。
通过编写和调试地址转换过程的模拟程序以加强对地址转换过程的了解。
2、实验要求
设计一个固定式分区分配的存储管理方案,并模拟实现分区的分配和回收过程。
可以假定每个作业都是批处理作业,并且不允许动态申请内存。
为实现分区的分配和回收,可以设定一个分区说明表,按照表中的有关信息进行分配,并根据分区的分配和回收情况修改该表。
设计一个可变式分区分配的存储管理方案,并模拟实现分区的分配和回收过程。
对分区的管理法可以是下面三种算法之一:
首次适应算法;最坏适应算法;最佳适应算法。
编写并调试一个段页式存储管理的地址转换的模拟程序。
首先设计好段表、页表,然后给出若干个有一定代表性的地址,通过查找段表页表后得到转换的地址。
要求打印转换前的地址,相应的段表,页表条款及转换后的地址,以便检查。
3、实验步骤
(1)理解实验要求,联系所学知识;
(2)根据要求编写调度算法;(3)编写完整的实验代码并在VC++6.0环境下编译运行;(4)调试程序直至得出结果。
4、程序清单
#include
#include
#include
#include
#defineNUM4
#definealloMemory(type)(type*)malloc(sizeof(type))
structpartiTab
{
intno;
intsize;
intfirstAddr;
charstate;
}parTab[NUM];
typedefstructpartiTabPARTITAB;
typedefstructjcb{/*定义作业控制块JCB,部分信息省略*/
charname[10];//作业名
intsize; //作业大小
structjcb*link;//链指针
}JCB;
typedefstruct
{
JCB*front,*rear;
}jcbQue;
jcbQue*jcbReadyQue;
voidAllocateMemory(intsize);
voidcreateTab();
voidcheckTab();
voidrecycleMemory(inti);
voidAllocateMemory(intsize)
{
inti;
for(i=0;i { PARTITABp=parTab[i]; if(p.state='N'&&p.size>size) parTab[i].state='Y'; else printf("没有空闲分区,无法分配内存! \n"); } } voidcreateTab() { inti; for(i=1;i<=NUM;i++) { //getPartiTab(PARTITAB); parTab[i-1].no=i; parTab[i-1].size=20; parTab[i-1].firstAddr=21; parTab[i-1].state='N'; } } voidcheckTab() { inti; printf("分区号\t大小\t起址\t状态\n"); for(i=0;i { printf("%d\t",parTab[i].no); printf("%d\t",parTab[i].size); printf("%d\t",parTab[i].firstAddr); printf("%c\t",parTab[i].state); printf("\n"); } } voidrecycleMemory(inti) { parTab[i-1].state='N'; } intmain(intargc,char*argv[]) { inti; printf("\n\n\t\t*********************************************\t\t\n"); printf("\t\t\t\t实验一存储管理实验\n"); printf("\t\t\t\t固定式分区分配存储管理\n"); printf("\t\t*********************************************\t\t\n"); createTab(); checkTab(); printf("请按任意键继续: \n"); getchar(); printf("每个分区装入一道作业: \n"); for(i=0;i AllocateMemory((i+1)*3); } checkTab(); printf("请按任意键继续: \n"); getchar(); printf("假如一段时间后,其中一个作业结束,回收给它分配的分区(假如该作业在第2分区)\n"); recycleMemory (2); checkTab(); printf("请按任意键继续: \n"); getchar(); printf("接着,从外存后备作业队列中选择一个作业装入该分区(假如该作业大小为10)\n"); AllocateMemory(10); checkTab(); return0; } #include #include #include #include #definen10 #definem10 #defineminisize100 struct { floataddress; floatlength; intflag; }used_table[n]; struct { floataddress; floatlength; intflag; }free_table[m]; voidallocate(charJ,floatxk) { inti,k; floatad; k=-1; for(i=0;i if(free_table[i].length>=xk&&free_table[i].flag==1) if(k==-1||free_table[i].length k=i; if(k==-1) { printf("无可用空闲区\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 i++; if(i>=n) { printf("无表目填写已分分区,错误\n"); if(free_table[k].flag==0) free_table[k].flag=1; else { free_table[k].length=free_table[k].length+xk; return; } } else { used_table[i].address=ad; used_table[i].length=xk; used_table[i].flag=J; } return; } voidreclaim(charJ) { inti,k,j,s,t; floatS,L; s=0; while((used_table[s].flag! =J||used_table[s].flag==0)&&s 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 { if(free_table[i].flag==1) { 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; elseif(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 t++; if(t>=m)/*空闲区表满,回收空间失败,将已分配表复原*/ { printf("主存空闲表没有空间,回收空间失败\n"); used_table[s].flag=J; return; } free_table[t].address=S; free_table[t].length=L; free_table[t].flag=1; } return; }/*主存回收函数结束*/ intmain() { printf("\n\n\t\t*********************************************\t\t\n"); printf("\t\t\t\t实验三存储管理实验\n"); printf("\n\t\t\t可变式分区分配(最佳适应算法)\n"); printf("\t\t*********************************************\n"); inti,a; floatxk;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 操作系统 存储 管理 实验 报告