




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、大学学院实验报告课程名称: 计算机操作系统 实验名称:存储管理实验实验日期:班级: 姓名: 学号: 仪器编号: XX实验报告要求: 1.实验目的 2.实验要求 3.实验步骤 4.程序清单 5.运行情况 6.流程图 7.实验体会1、实验目的通过编写和调试存储管理的模拟程序以加深对存储管理方案的理解,熟悉虚存管理的各种页面淘汰法。通过编写和调试地址转换过程的模拟程序以加强对地址转换过程的了解。2、实验要求设计一个固定式分区分配的存储管理方案,并模拟实现分区的分配和回收过程。 可以假定每个作业都是批处理作业,并且不允许动态申请内存。为实现分区的分配和回收,可以设 定一个分区说明表,按照表中的有关信息
2、进行分配,并根据分区的分配和回收情况修改该表。设计一个可变式分区分配的存储管理方案,并模拟实现分区的分配和回收过程。对分区的管理法可以是下面三种算法之一:首次适应算法;最坏适应算法;最佳适应算法。编写并调试一个段页式存储管理的地址转换的模拟程序。首先设计好段表、页表,然后给出若干个有一定代表性的地址,通过查找段表页表后得到转换的地 址。要求打印转换前的地址,相应的段表,页表条款及转换后的地址,以便检查。3、实验步骤(1)理解实验要求,联系所学知识;(2)根据要求编写调度算法;( 3)编写完整的实验代码并在 VC+ 6.0 环境下编译运行;( 4)调试程序直至得出结果。4、程序清单#includ
3、e #include #include#include#define NUM 4#define alloMemory(type) (type*)malloc(sizeof(type)struct partiTabint no;int size;int firstAddr;char state;parTabNUM;typedef struct partiTab PARTITAB;typedef struct jcb /* 定义作业控制块 JCB 部, 分信息省略 */ char name10; / 作业名 int size; / 作业大小 struct jcb* link; / 链指针JCB;
4、typedef structJCB *front,*rear;jcbQue;jcbQue *jcbReadyQue;void AllocateMemory(int size); void createTab(); void checkTab();void recycleMemory(int i);void AllocateMemory(int size)int i;for(i=0;isize) parTabi.state=Y;elseprintf( 没有空闲分区,无法分配内存! n); void createTab() int i;for( i=1;i=NUM;i+) /getPartiTab
5、(PARTITAB); parTabi-1.no=i;parTabi-1.size=20; parTabi-1.firstAddr=21;parTabi-1.state=N;void checkTab()int i;printf( 分区号 t 大小 t 起址 t 状态 n);for(i=0;iNUM;i+)printf(%dt,parTabi.no); printf(%dt,parTabi.size); printf(%dt,parTabi.firstAddr);printf(%ct,parTabi.state);printf(n);void recycleMemory(int i)parTa
6、bi-1.state=N;int main(int argc, char* argv)int i;printf(nntt*ttn); printf(tttt 实验一 存储管理实验 n); printf(tttt 固定式分区分配存储管理 n); printf(tt* *ttn); createTab();checkTab();printf( 请按任意键继续: n);getchar();printf( 每个分区装入一道作业: n); for(i=0;iNUM;i+)AllocateMemory(i+1)*3);checkTab();printf( 请按任意键继续: n);getchar();pri
7、ntf( 假如一段时间后,其中一个作业结束,回收给它分配的分区(假如该作业在第 2 分区 )n);recycleMemory(2);checkTab();printf( 请按任意键继续: n);getchar();printf( 接着 ,从外存后备作业队列中选择一个作业装入该分区(假如该作业大小为 10)n);AllocateMemory(10);checkTab();return 0; #include#include #include#include#define n 10#define m 10#define minisize 100structfloat address;float l
8、ength;int flag;used_tablen;structfloat address;float length;int flag;free_tablem;void allocate(char J,float xk)int i,k;float ad;k=-1;for(i=0; i=xk&free_tablei.flag=1) if(k=-1|free_tablei.lengthfree_tablek.length) k=i;if(k=-1)printf( 无可用空闲区 n);return;if(free_tablek.length-xk=minisize)free_tablek.flag
9、=0;ad=free_tablek.address;xk=free_tablek.length;elsefree_tablek.length=free_tablek.length-xk; ad=free_tablek.address+free_tablek.length;i=0;while(used_tablei.flag!=0&i=n)printf( 无表目填写已分分区,错误 n); if(free_tablek.flag=0) free_tablek.flag=1;else free_tablek.length=free_tablek.length+xk; return;else used
10、_tablei.address=ad; used_tablei.length=xk; used_tablei.flag=J;return;void reclaim(char J)int i,k,j,s,t;float S,L;s=0;while(used_tables.flag!=J|used_tables.flag=0)&s=n)printf( 找不到该作业 n);return; used_tables.flag=0; S=used_tables.address;L=used_tables.length;j=-1;k=-1;i=0; while(im&(j=-1|k=-1) if(free_
11、tablei.flag=1)if(free_tablei.address+free_tablei.length=S)k=i; if(free_tablei.address=S+L)j=i;i+;if(k!=-1)if(j!=-1) /* 上邻空闲区,下邻空闲区,三项合并 */ free_tablek.length=free_tablej.length+free_tablek.length+L; free_tablej.flag=0;else/* 上邻空闲区,下邻非空闲区,与上邻合并 */ free_tablek.length=free_tablek.length+L;else if(j!=-1
12、) /* 上邻非空闲区,下邻为空闲区,与下邻合并 */ free_tablej.address=S; free_tablej.length=free_tablej.length+L;else /* 上下邻均为非空闲区,回收区域直接填入 */* 在空闲区表中寻找空栏目 */t=0;while(free_tablet.flag=1&t=m) /* 空闲区表满 ,回收空间失败 ,将已分配表复原 */printf( 主存空闲表没有空间 ,回收空间失败 n); used_tables.flag=J;return;free_tablet.address=S;free_tablet.length=L;fre
13、e_tablet.flag=1;return;/* 主存回收函数结束 */ int main( ) printf(nntt*ttn); printf(tttt 实验三 存储管理实验 n); printf(nttt 可变式分区分配 (最佳适应算法 )n); printf(tt*n);int i,a; float xk; char J;/* 空闲分区表初始化: */ free_table0.address=10240; /* 起始地址假定为 10240*/ free_table0.length=10240; /* 长度假定为 10240 ,即 10k*/ free_table0.flag=1; /
14、* 初始空闲区为一个整体空闲区 */ for(i=1; im; i+)free_tablei.flag=0; /* 其余空闲分区表项未被使用 */* 已分配表初始化: */ for(i=0; in; i+) used_tablei.flag=0; /* 初始时均未分配 */ while(1)printf( 功能选择项: n1 。显示主存 n2 。分配主存 n3 。回收主存 n4 。退出 n); printf( 请选择相应功能 1-4 :);scanf(%d,&a); switch(a)case 4:exit(0); /*a=4 程序结束 */ case 2:/*a=2 分配主存空间 */pri
15、ntf( 输入作业名 J和作业所需空间 xk: ); scanf(%*c%c%f,&J,&xk);allocate(J,xk); /* 分配主存空间 */ break;case 3:/*a=3 回收主存空间 */printf( 输入要回收分区的作业名 ); scanf(%*c%c,&J);reclaim(J); /* 回收主存空间 */break;case 1:/*a=1 显示主存情况 */* 输出空闲区表和已分配表的内容 */printf( 输出空闲区表: n 起始地址 分区长度 标志 n); for(i=0; im; i+) printf(%6.0f%9.0f%6dn,free_table
16、i.address,free_tablei.length, free_tablei.flag); printf( 按任意键 ,输出已分配区表 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); elseprintf(%6.0f%9.0f%6dn,used_tablei.address,used_tablei.len
17、gth, used_tablei.flag); break;default:printf( 没有该选项 n);/*case*/ /*while*/ return 1;#include #include using namespace std;typedef struct Quickint qs;/ 快表段号int qp;/ 快表页号int qb;/ 快表段号 Quick;typedef struct Dataint num;/ 内存的块数string str;/ 对应数据块的作业内容,简化起见说明内容为一串字符。 Data;/ 页表 typedef struct Page int num;/
18、页号int flag;/ 页状态,即是否在内存。int block;/ 该页对应的块号 Page;typedef struct Stackint num;/ 段号int flag;/ 段状态int plen;/ 页表长度int psta;/ 页表始址 Stack;/ 段表寄存器 typedef struct Stare int ssta;/ 段表始址 int slen;/ 段表长度 Stare;Stack ss10;/ 全局变量 Stare st;/ 全局变量 Data work20;/ 全局变量 Quick qu;/ 全局变量 Page page55; bool menuflag=0;int
19、 bbs;/ 内存块大小 int bs;/ 内存大小 void menu();void start(); void change();int main() menu();return 0; void menu()*ttendl;coutnnttcouttttt 实验三 存储管理实验 endl;coutnttt 段页式存储管理的地址转换的模拟程序 endl;endl;couttt*cout 请选择 :endl; coutendl;cout1、初始化表endl;cout2、物理地址转换endl;cout3、退出menu1; if(menu1!=1&menu1!=2&menu1!=3)cout 请输
20、入正确的选项 endl; menu();switch(menu1)case 1: menuflag=1; start(); break;case 2:if(menuflag=0)cout 请初始化表 endl;menu();change();break;case 3:return;/switchvoid start()cout 请输入内存大小 (K)bs;cout 请输入内存块的大小 (k)bbs;int blocknum;blocknum=bs/bbs;cout内存一共被分为 blocknum块,每块 bbsk一共bskendl; cout 请输入进程个数 pn;/ 下面求所有进程的总段数和
21、段表 ,并为每段创建页表int sums=0;for (int pn1=0; pn1pn; pn1+)cout请输入第 pn1 个进程的段数 ppn; sums+=ppn;for(int ss1=0; ss1sums; ss1+)cout 请输入第 ss1个段表数据:段号,状态,页表长度,页表始址ssss1.numssss1.flagssss1.plenssss1.psta;cout 请初始化第 ss1段的页表,输入两个数据页表状态和对应块号endl;for(int sss1=0; sss1ssss1.plen; sss1+)pagess1sss1.num=sss1;cout 请输入该段第 s
22、ss1个页表的页表状态和对应块号 pagess1sss1.flagpagess1sss1.block;/ 初始化段表寄存器cout 初始化段表寄存器的段表始址 st.ssta;st.slen=sums;/ 初始化内存中物理地址每一块的数据区cout 简单起见, 我们对物理地址的每一块用字符串进行简单的初始化,没有具体到每一物理地址endl;for (int bn=0; bnblocknum; bn+)workbn.num=bn;cout请输入第 bn 个内存块里的作业内容 workbn.str;/ 初始化快表cout 简单起见,我们初始化快表只有一个endl;cout 请输入要作为快表的段号和页号 qu.qbqu.qp;while(ssqu.qb.flag!=1|pagequ.qbqu.qp.flag!=1)cout 该页不在内存请输入一页在内存中的作为快表,请输入要作为快表的段号和页号qu.qbqu.qp;qu.qs=pagequ.qbqu.qp.block;menu();void change()cout 请输入要转化的逻辑地址,段号 s,段内页号 p,页内偏移地址 d(B)snumpnumdnum;/ 首先查快表if(snum=qu.qb&pnum=qu.q
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025国家电投集团人才院(工匠学院)招聘20人考试参考题库及答案解析
- 2025年医保欺诈防范与风险管理试题库及答案(医保政策理解与应用)
- 2025“黑龙江人才周”校园引才活动七台河市“聚才奥运冠军之城”人才引进70人考试参考题库及答案解析
- 2025浙江金华兰溪市市属国企(兰溪资本)下半年招聘工作人员19人考试参考题库及答案解析
- 混凝土找平层配比及施工方案详解
- 2025年郑州学森实验学校招聘教师5人考试参考题库及答案解析
- 商贸企业安全测试题及答案解析
- 安全工长题库模拟及答案解析
- 2026建信理财有限责任公司校园招聘9人考试参考题库及答案解析
- 安全员手机题库及答案解析
- 现代温室附属设施课件
- 基于Java的网上蛋糕预订销售系统的设计与实现
- 成人高考专升本医学综合考试真题及答案
- 可复制的领导力心得
- 《小猪变形记》一年级
- 抗菌药物临床应用指导原则
- MirrorView切换手册模板
- 急救车必备药品和物品 急救车物品药品管理
- GB/T 3253.8-2009锑及三氧化二锑化学分析方法三氧化二锑量的测定碘量法
- GB/T 24720-2009交通锥
- GB/T 15065-2009电线电缆用黑色聚乙烯塑料
评论
0/150
提交评论