可变分区存储管理实验报告.docx_第1页
可变分区存储管理实验报告.docx_第2页
可变分区存储管理实验报告.docx_第3页
可变分区存储管理实验报告.docx_第4页
可变分区存储管理实验报告.docx_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

沈 阳 工 程 学 院学 生 实 验 报 告实验室名称:信息工程系信息安全实验室实验课程名称:操作系统实验项目名称: 可变分区存储管理班 级:计专本121 姓 名:郑永凯 学 号:2012461127实验日期:2013 年5 月 27日 实验台编号:F608指导教师:张楠 批阅教师(签字): 成绩:【实验目的】 通过编写和调试存储管理的模拟程序以加深对存储管理方案的理解。【实验内容】设计一个可变式分区分配的存储管理方案。并模拟实现分区的分配和回收过程。 对分区的管理法可以采用下面三种算法之一: 1、首次适应算法;2、循环首次适应算法;3、最佳适应算法;必须建立空闲区表和占用区表,回收算法考虑四种情况。【实验要求】1)上机前认真复习可变式分区分配算法,熟悉存储器分配和回收过程;2)上机时独立编程、调试程序;3)根据具体实验要求,完成好实验报告(包括实验的目的、内容、要求、源程序、实例运行结果截图)。#include#include#define NULL 0#define getjcb(type) (type*)malloc(sizeof(type)#define getsub(type) (type*)malloc(sizeof(type)int num,num2; /要调度的作业数和要回收的区域数int m=0; /已分配作业数int flag; /分配成功标志int isup,isdown; /回收区域存在上邻和下邻的标志int is=0;struct jcbchar name10;char state;int ntime; /所需时间int size; /所需空间大小int addr; /所分配分区的首地址struct jcb *link; *ready =NULL, *p,*q,*as=NULL;/作业队列ready,已分配作业队列astypedef struct jcb JCB;struct subarea /分区块 char name10; int addr; /分区首地址int size; /分区大小char state;struct subarea *link; *sub=NULL,*r,*s,*cur; /空闲分区队列sub,当前分区指针cur typedef struct subarea SUB;void sort() /* 建立对作业按到达时间进行排列的函数,直接插在队列之尾*/ JCB *first; if(ready=NULL) ready=p; else first=ready; while(first-link!=NULL) first=first-link; first-link=p; p-link=NULL; void sort3() /*建立对已分配作业队列的排列函数,直接插在队列之尾*/ JCB *fir; if(as=NULL) as=q; else fir=as; while(fir-link!=NULL) fir=fir-link; fir-link=q; q-link=NULL; m+;void input() /* 建立作业控制块函数*/ int i; printf(n请输入要调度的总作业数:); scanf(%d,&num); for(i=0;iname); printf(n输入作业的大小:); scanf(%d,&p-size); printf(n输入作业所需运行时间:); scanf(%d,&p-ntime); p-state=w; p-link=NULL; sort(); /* 调用sort函数*/ printf(n 按任一键继续.n); getch();void input2() /*建立要回收区域的函数*/ JCB *k; int has; q=getjcb(JCB); printf(n输入区域名(作业名):); scanf(%s,&q-name); p=as; while(p!=NULL) if(strcmp(p-name,q-name)=0) /*在已分配作业队列中寻找*/ q-addr=p-addr; q-size=p-size; has=1; /*输入作业名存在标志位*/ if(p=as) as=p-link; /*在已分配作业队列中删除该作业*/ else k=as; while(k-link!=p) k=k-link; k-link=k-link-link; /*删除*/ printf(输出该作业首地址:%dn,q-addr); printf(输出该作业大小:%dnn,q-size); q-link=NULL; break; else p=p-link; has=0; /*输入作业名不存在标志*/ if(has=0) printf(n输入作业名错误!请重新输入!n); input2(); void print()printf(nnnn); printf(tt*n); printf(ttt三.存储管理实验演示n); printf(tt*nnn); printf(tttt123456n); printf(tttt信自学院n); printf(tttt计专本121n); printf(tttt2012461119n); printf(tttt2013年5月n); printf(nnn); printf(ttt按任意键进入演示); getch(); system(cls);void init_sub() /*初始化空闲分区表*/ r=getsub(SUB); strcpy(r-name,0); r-addr=5; r-size=10; r-state=F; sub=r; s=getsub(SUB); strcpy(s-name,1); s-addr=20; s-size=120; s-state=F; sub-link=s;r=s; s=getsub(SUB); strcpy(s-name,2); s-addr=160; s-size=40; s-state=F; r-link=s;r=s; s=getsub(SUB); strcpy(s-name,3); s-addr=220; s-size=10; s-state=F; r-link=s;r=s; s=getsub(SUB); strcpy(s-name,4); s-addr=250; s-size=20; s-state=F; r-link=s;r=s; s=getsub(SUB); strcpy(s-name,5); s-addr=300; s-size=80; s-state=F; r-link=s; s-link=0;/-void disp() /*空闲分区表的显示函数*/ printf(nn); printf(tt 分区 首地址 长度 状态 n); r=sub; while(r!=NULL) printf(tt %stt%dtt%dtt%cn,r-name,r-addr,r-size,r-state); r=r-link; printf(n);void disp2() /*显示已分配内存的作业表函数*/ printf(nn); printf(tt 作业名 首地址 长度 状态 n); p=as; while(p!=NULL) printf(tt %stt%dtt%dtt%cn,p-name,p-addr,p-size,p-state); p=p-link; printf(nn);void assign2(JCB *pr) /*首次适应作业分区*/ SUB *k; r=sub; /*从空闲表头开始寻找*/ while(r!=NULL) if(r-size)(pr-size)&(r-state=F) /*有空闲分区大于作业大小的情况*/ pr-addr=r-addr; r-size-=pr-size; r-addr+=pr-size; flag=1; /*分配成功标志位置1*/ q=pr; q-state=r; sort3(); /*插入已分配作业队列*/ printf(作业%s的分区为%s,首地址为%d.n,p-name,r-name,pr-addr); break; else if(r-size)=(pr-size)&(r-state=F) /*有空闲分区等于作业大小的情况*/ pr-addr=r-addr; flag=1; /*分配成功标志位置1*/ q=pr; sort3(); /*插入已分配作业队列*/ s=sub; /*空闲分区已完成分配,应删除*/ while(s-link!=r) s=s-link; s-link=s-link-link; /*删除空闲分区*/ printf(作业%s的分区为%s,首地址为%d.n,p-name,r-name,pr-addr); break; else r=r-link; flag=0; if(flag=0) /*作业过大的情况*/ printf(作业%s长度过大,内存不足,分区分配出错!n,p-name); is=1; void reclaim2(JCB *pr) /*首次适应与循环首次适应区域回收*/ SUB *k; r=sub; while(r!=NULL) if(r-addr=(pr-addr)+(pr-size) /*回收区域有下邻*/ pr-size+=r-size; s=sub; isdown=1; /*下邻标志位置1*/ while(s!=NULL) if(s-addr)+(s-size)=(pr-addr) /*有下邻又有上邻*/ s-size+=pr-size; k=sub; while(k-link!=r) k=k-link; k-link=k-link-link; isup=1; /*上邻标志位置1*/ break; else s=s-link; isup=0; /*上邻标志位置0*/ if(isup=0) /*有下邻无上邻*/ r-addr=pr-addr; r-size=pr-size; break; else r=r-link; isdown=0; /*下邻标志位置0*/ if(isdown=0) /*区域无下邻*/ s=sub; while(s!=NULL) if(s-addr)+(s-size)=(pr-addr) /*无下邻但有上邻*/ s-size+=pr-size; isup=1; /*上邻标志位置1*/ break; else s=s-link; isup=0; /*上邻标志位置0*/ if(isup=0) /*无下邻且无上邻*/ k=getsub(SUB); /*重新生成一个新的分区结点*/ strcpy(k-name,pr-name); k-addr=pr-addr; k-size=pr-size; k-state=n; r=sub; while(r!=NULL) if(r-addr)(k-addr) /*按分区首地址排列,回收区域插在合适的位置*/ if(r=sub) /*第一个空闲分区首址大于回收区域的情况*/ k-link=r; sub-link=k; else s=sub; while(s-link!=r) s=s-link; k-link=r; s-link=k; break; else r=r-link; if(r=NULL) /*所有空闲分区的首址都大于回收区域首址的情况*/ s=sub; while(s-link!=NULL) s=s-link; s-link=k; k-link=NULL; printf(n区域%s己回收.,pr-name);menu() printf(nnntt*n); printf(ttt存储管理实验演示n); printf(tt*nnn); printf(ttt 1. 显示空闲分区 n); printf(ttt 2. 分配和回收作业 n); printf(ttt 0. 退出 n); printf(ttt请选择你要的操作:); switch(getchar() case 1: system(cls); disp(); getch(); system(cls); menu(); break; case 2: system(cls); printf(n首次适应算法); input(); printf(n); while(num!=0) p=ready; ready=p-link; p-link=NULL; assign2(p); num-; printf(n显示回收后的空闲分区表和已分配作业表.); getch(); printf(ntt 完成分配后的空闲分区表 n); disp(); printf(ntt 已分配作业表 n); disp2(); if(is=0) printf(n 全部作业已经被分配内存.); else printf(n 作业没有全部被分配内存.n); printf(nn按任意键进行区域回收.); printf(n); while(as!=NULL) getch(); input2(); printf(按任意键继续.); getch(); printf(n); reclaim2(q); printf(n显示回收后的空闲分区表和已分配作业表.); getch

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论