您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 公司方案 > 可变分区存储管理实验报告
沈阳工程学院学生实验报告实验室名称:信息工程系信息安全实验室实验课程名称:操作系统实验项目名称:可变分区存储管理班级:计专本121姓名:郑永凯学号:2012461127实验日期:2013年5月27日实验台编号:F608指导教师:张楠批阅教师(签字):成绩:【实验目的】通过编写和调试存储管理的模拟程序以加深对存储管理方案的理解。【实验内容】设计一个可变式分区分配的存储管理方案。并模拟实现分区的分配和回收过程。对分区的管理法可以采用下面三种算法之一:1、首次适应算法;2、循环首次适应算法;3、最佳适应算法;必须建立空闲区表和占用区表,回收算法考虑四种情况。【实验要求】1)上机前认真复习可变式分区分配算法,熟悉存储器分配和回收过程;2)上机时独立编程、调试程序;3)根据具体实验要求,完成好实验报告(包括实验的目的、内容、要求、源程序、实例运行结果截图)。#includestdio.h#includestdlib.h#defineNULL0#definegetjcb(type)(type*)malloc(sizeof(type))#definegetsub(type)(type*)malloc(sizeof(type))intnum,num2;//要调度的作业数和要回收的区域数intm=0;//已分配作业数intflag;//分配成功标志intisup,isdown;//回收区域存在上邻和下邻的标志intis=0;structjcb{charname[10];charstate;intntime;//所需时间intsize;//所需空间大小intaddr;//所分配分区的首地址structjcb*link;}*ready=NULL,*p,*q,*as=NULL;//作业队列ready,已分配作业队列astypedefstructjcbJCB;structsubarea{//分区块charname[10];intaddr;//分区首地址intsize;//分区大小charstate;structsubarea*link;}*sub=NULL,*r,*s,*cur;//空闲分区队列sub,当前分区指针curtypedefstructsubareaSUB;voidsort()/*建立对作业按到达时间进行排列的函数,直接插在队列之尾*/{JCB*first;if(ready==NULL)ready=p;else{first=ready;while(first-link!=NULL)first=first-link;first-link=p;p-link=NULL;}}voidsort3()/*建立对已分配作业队列的排列函数,直接插在队列之尾*/{JCB*fir;if(as==NULL)as=q;else{fir=as;while(fir-link!=NULL)fir=fir-link;fir-link=q;q-link=NULL;}m++;}voidinput()/*建立作业控制块函数*/{inti;printf(\n请输入要调度的总作业数:);scanf(%d,&num);for(i=0;inum;i++){printf(\n作业号No.%d:\n,i);p=getjcb(JCB);printf(\n输入作业名:);scanf(%s,&p-name);printf(\n输入作业的大小:);scanf(%d,&p-size);printf(\n输入作业所需运行时间:);scanf(%d,&p-ntime);p-state='w';p-link=NULL;sort();/*调用sort函数*/}printf(\n按任一键继续......\n);getch();}voidinput2()/*建立要回收区域的函数*/{JCB*k;inthas;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(输出该作业首地址:%d\n,q-addr);printf(输出该作业大小:%d\n\n,q-size);q-link=NULL;break;}else{p=p-link;has=0;}/*输入作业名不存在标志*/}if(has==0){printf(\n输入作业名错误!请重新输入!\n);input2();}}voidprint(){printf(\n\n\n\n);printf(\t\t**************************************\n);printf(\t\t\t三.存储管理实验演示\n);printf(\t\t**************************************\n\n\n);printf(\t\t\t\t123456\n);printf(\t\t\t\t信自学院\n);printf(\t\t\t\t计专本121\n);printf(\t\t\t\t2012461119\n);printf(\t\t\t\t2013年5月\n);printf(\n\n\n);printf(\t\t\t按任意键进入演示);getch();system(cls);}voidinit_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;}//--------------------------------------------------------------------------voiddisp()/*空闲分区表的显示函数*/{printf(\n\n);printf(\t\t分区首地址长度状态\n);r=sub;while(r!=NULL){printf(\t\t%s\t\t%d\t\t%d\t\t%c\n,r-name,r-addr,r-size,r-state);r=r-link;}printf(\n);}voiddisp2()/*显示已分配内存的作业表函数*/{printf(\n\n);printf(\t\t作业名首地址长度状态\n);p=as;while(p!=NULL){printf(\t\t%s\t\t%d\t\t%d\t\t%c\n,p-name,p-addr,p-size,p-state);p=p-link;}printf(\n\n);}voidassign2(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;}elseif(((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;}}voidreclaim2(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;}elser=r-link;}if(r==NULL
本文标题:可变分区存储管理实验报告
链接地址:https://www.777doc.com/doc-5142420 .html