操作系统存储管理试验报告
____大学____学院实验报告 课程名称:计算机操作系统实验名称:存储管理实验实验日期: 班级:姓名:学号:仪器编号: XX 实验报告要求:1.实验目的 2.实验要求 3.实验步骤 4.程序清单 5.运行情况 6.流程图 7.实验体会 1 1、实验目的、实验目的 通过编写和调试存储管理的模拟程序以加深对存储管理方案的理解,熟悉虚存 管理的各种页面淘汰法。 通过编写和调试地址转换过程的模拟程序以加强对地址转换过程的了解。 2 2、实验要求、实验要求 设计一个固定式分区分配的存储管理方案,并模拟实现分区的分配和回收过程。设计一个固定式分区分配的存储管理方案,并模拟实现分区的分配和回收过程。 可以假定每个作业都是批处理作业,并且不允许动态申请内存。为实现分区的分配和回收,可以设 定一个分区说明表,按照表中的有关信息进行分配,并根据分区的分配和回收情况修改该表。 设计一个可变式分区分配的存储管理方案,并模拟实现分区的分配和回收过程。设计一个可变式分区分配的存储管理方案,并模拟实现分区的分配和回收过程。 对分区的管理法可以是下面三种算法之一:首次适应算法;最坏适应算法;最佳适应算法。 编写并调试一个段页式存储管理的地址转换的模拟程序。 编写并调试一个段页式存储管理的地址转换的模拟程序。 首先设计好段表、页表,然后给出若干个有一定代表性的地址,通过查找段表页表后得到转换的地 址。要求打印转换前的地址,相应的段表,页表条款及转换后的地址,以便检查。 3 3、实验步骤、实验步骤 (1)理解实验要求,联系所学知识;(2)根据要求编写调度算法;(3)编 写完整的实验代码并在 VC++ 6.0 环境下编译运行;(4)调试程序直至得出结 果。 4 4、程序清单、程序清单 #include #include #include #include #define NUM 4 #define alloMemory(type) (type*)malloc(sizeof(type)) struct partiTab { int no; int size; int firstAddr; char state; }parTab[NUM]; typedef struct partiTab PARTITAB; typedef struct jcb { /*定义作业控制块 JCB ,部分信息省略*/ char name[10]; //作业名 int size; //作业大小 struct jcb* link; //链指针 }JCB; typedef struct { JCB *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) parTab[i].state= Y ; else printf(“没有空闲分区,无法分配内存!\n“); } } void createTab() { int i; for( i=1;imenu1; if(menu1!=1 menu(); } switch(menu1) { case 1: { menuflag=1; start(); break; } case 2: { if(menuflag==0) { coutbs; coutbbs; int blocknum; blocknum=bs/bbs; coutpn; //下面求所有进程的总段数和段表,并为每段创建页表 int sums=0; for (int pn1=0; pn1ppn; sums+=ppn; } for(int ss1=0; ss1ss[ss1].numss[ss1].flagss[ss1].plenss[ss1].psta; coutpage[ss1][sss1].flagpage[ss1][sss1].block; } } //初始化段表寄存器 coutst.ssta; st.slen=sums; //初始化内存中物理地址每一块的数据区 coutwork[bn].str; } //初始化快表 coutqu.qbqu.qp; while(ss[qu.qb].flag!=1||page[qu.qb][qu.qp].flag!=1) { coutqu.qbqu.qp; } qu.qs=page[qu.qb][qu.qp].block; menu(); } void change() { coutsnumpnumdnum; //首先查快表 if(snum==qu.qb cout“该块中作业数据是 “work[page[qu.qb][qu.qp].block].strendl; cout“物理地址是“qu.qs*bbs*1024+dnumendl;; menu(); } //访问段表寄存器 else { cout“快表没有命中,访问段表寄存器,段号等于段表始址加上偏移地址 “st.slen-1) { cout“越界中断“=0 if(ss[ssnum].flag==0) { cout“缺段中断“ss[ssnum].plen-1) { cout“缺页中断“=0 menu(); } else { cout“找到该页““查询页表后对应块号 “page[ssnum][pnum].blockendl; cout“该块内存的数据是 “work[page[ssnum][pnum].block].strendl; cout“ 转 化 得 到 的 物 理 地 址 是 : “page[ssnum][pnum].block*bbs*1024+dnumendl; menu(); } } } } } } } } 5 5、运行情况、运行情况 按提示操作,直至程序运行完毕,即可得结果。 6 6、流程图、流程图 7 7、心得体会、心得体会 通过这次实验,我懂得了存储管理分配和回收的一些简单算法的实现。对于实验 过程中遇到的问题,通过上网查找相关资料以及研读课本上的理论知识,都一一得 到了解决。同时,实验过程中我还掌握了用高级语言编写和调试管理程序的方法, 加深了对存储管理各种算法的概念及存储管理算法的理解,加深了对段页式存储管 理的地址转换的理解。多次实验下来最大的感受就是:实践出真知。只有把所学知 识付诸实践才能真正地掌握知识。 优 教师评价 秀好等格 格 名 良中及 及 签期 教 师日 不