您的当前位置:首页正文

《操作系统》存储管理实验报告

来源:一二三四网
____大学____学院实验报告

课程名称: 计算机操作系统 实验名称: 存储管理实验 实验日期: 班级: 姓名: 学号: 仪器编号: XX 实验报告要求:1.实验目的 2.实验要求 3.实验步骤 4.程序清单 5.运行情况 6.流程图 7.实验体会 1、实验目的 通过编写和调试存储管理的模拟程序以加深对存储管理方案的理解,熟悉虚存管理的各种页面淘汰法。 通过编写和调试地址转换过程的模拟程序以加强对地址转换过程的了解。 2、实验要求 设计一个固定式分区分配的存储管理方案,并模拟实现分区的分配和回收过程。 可以假定每个作业都是批处理作业,并且不允许动态申请内存。为实现分区的分配和回收,可以设定一个分区说明表,按照表中的有关信息进行分配,并根据分区的分配和回收情况修改该表。 设计一个可变式分区分配的存储管理方案,并模拟实现分区的分配和回收过程。 对分区的管理法可以是下面三种算法之一:首次适应算法;最坏适应算法;最佳适应算法。 编写并调试一个段页式存储管理的地址转换的模拟程序。 首先设计好段表、页表,然后给出若干个有一定代表性的地址,通过查找段表页表后得到转换的地址。要求打印转换前的地址,相应的段表,页表条款及转换后的地址,以便检查。 3、实验步骤 (1)理解实验要求,联系所学知识; (2)根据要求编写调度算法; (3)编写完整的实验代码并在VC++ 6.0环境下编译运行; (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;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'; } } void checkTab() { int i; printf(\"分区号\大小\起址\状态\\n\"); for(i=0;i #include #include #include #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]; void allocate(char J,float xk) { int i,k; float ad; k=-1; for(i=0; i=xk&&free_table[i].flag==1) if(k==-1||free_table[i].length=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; } void reclaim(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) { 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) /*空闲区表满,回收空间失败,将已分配表复原*/ { printf(\"主存空闲表没有空间,回收空间失败\\n\"); used_table[s].flag=J; return; } free_table[t].address=S; free_table[t].length=L; free_table[t].flag=1; } return; }/*主存回收函数结束*/ int main( ) { printf(\"\\n\\n\\*********************************************\\\\n\"); printf(\"\\\\实验三 存储管理实验\\n\"); printf(\"\\n\\\可变式分区分配 (最佳适应算法)\\n\"); printf(\"\\*********************************************\\n\"); int i,a; float xk; char J; /*空闲分区表初始化:*/ free_table[0].address=10240; /*起始地址假定为10240*/ free_table[0].length=10240; /*长度假定为10240,即10k*/ free_table[0].flag=1; /*初始空闲区为一个整体空闲区*/ for(i=1; i #include using namespace std; typedef struct Quick { int qs;//快表段号 int qp;//快表页号 int qb;//快表段号 } Quick; typedef struct Data { int num;//内存的块数 string str;//对应数据块的作业内容,简化起见说明内容为一串字符。 } Data; //页表 typedef struct Page { int num;//页号 int flag;//页状态,即是否在内存。 int block;//该页对应的块号 } Page; typedef struct Stack { int num;//段号 int flag;//段状态 int plen;//页表长度 int psta;//页表始址 } Stack; //段表寄存器 typedef struct Stare { int ssta;//段表始址 int slen;//段表长度 } Stare; Stack ss[10];////全局变量 Stare st;///////全局变量 Data work[20];//全局变量 Quick qu;//////全局变量 Page page[5][5]; bool menuflag=0; int bbs;//内存块大小 int bs;//内存大小 void menu(); void start(); void change(); int main() { menu(); return 0; } void menu() { cout<<\"\\n\\n\\*********************************************\\\"<>menu1; if(menu1!=1&&menu1!=2&&menu1!=3) { cout<<\"请输入正确的选项\"<>bs; cout<<\"请输入内存块的大小(k)\"<>bbs; int blocknum; blocknum=bs/bbs; cout<<\"内存一共被分为\"<>pn; //下面求所有进程的总段数和段表,并为每段创建页表 int sums=0; for (int pn1=0; pn1>ppn; sums+=ppn; } for(int ss1=0; ss1>ss[ss1].num>>ss[ss1].flag>>ss[ss1].plen>>ss[ss1].psta; cout<<\"请初始化第\"<>page[ss1][sss1].flag>>page[ss1][sss1].block; } } //初始化段表寄存器 cout<<\"初始化段表寄存器的段表始址\"<>st.ssta; st.slen=sums; //初始化内存中物理地址每一块的数据区 cout<<\"简单起见,我们对物理地址的每一块用字符串进行简单的初始化,没有具体到每一物理地址\"<>work[bn].str; } //初始化快表 cout<<\"简单起见,我们初始化快表只有一个\"<>qu.qb>>qu.qp; while(ss[qu.qb].flag!=1||page[qu.qb][qu.qp].flag!=1) { cout<<\"该页不在内存请输入一页在内存中的作为快表,请输入要作为快表的段号和页号\"<>qu.qb>>qu.qp; } qu.qs=page[qu.qb][qu.qp].block; menu(); } void change() { cout<<\"请输入要转化的逻辑地址,段号s,段内页号p,页内偏移地址d(B)\"<>snum>>pnum>>dnum; //首先查快表 if(snum==qu.qb&&pnum==qu.qp) { cout<<\"快表命中\"<<\"对应块号是\"<st.slen-1) { cout<<\"越界中断\"<=0&&ssnum<=st.slen-1) { //是否缺段 cout<<\"段表有效\"<ss[ssnum].plen-1) { cout<<\"缺页中断\"<=0&&pnum<=ss[ssnum].plen-1) { if(page[ssnum][pnum].flag==0) { cout<<\"缺页中断\"<良 中 及及签期 教师 日 不

因篇幅问题不能全部显示,请点此查看更多更全内容

Top