ImageVerifierCode 换一换
格式:DOCX , 页数:26 ,大小:108.08KB ,
资源ID:6380040      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/6380040.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(实验三存储管理实验.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

实验三存储管理实验.docx

1、实验三存储管理实验实验三 存储管理实验一.? 目的要求:? 1、通过编写和调试存储管理的模拟程序以加深对存储管理方案的理解。熟悉虚存管理的各种页面淘汰算法。?2、通过编写和调试地址转换过程的模拟程序以加强对地址转换过程的了解。二实验内容:1、设计一个固定式分区分配的存储管理方案,并模拟实现分区的分配和回收过程。 可以假定每个作业都是批处理作业,并且不允许动态申请内存。为实现分区的分配和回收,可以设定一个分区说明表,按照表中的有关信息进行分配,并根据分区的分配和回收情况修改该表。算法描述:本算法将内存的用户区分成大小相等的四个的分区,设一张分区说明表用来记录分区,其中分区的表项有分区的大小、起始

2、地址和分区的状态,当系统为某个作业分配主存空间时,根据所需要的内存容量,在分区表中找到一个足够大的空闲分区分配给它,然后将此作业装入内存。如果找不到足够大的空闲分区,则这个作业暂时无法分配内存空间,系统将调度另一个作业。当一个作业运行结束时,系统将回收改作业所占据的分区并将该分区改为空闲。算法原程序#include stdio.h#include windows.h#include #include #define PCB_NUM 5 /模拟进程数量#define INT 800/内存分区数量struct MemInf int addr; /分区起始地址 int size; /分区大小 int

3、 state; /0表示空闲,0时表示已分配,存储的是进程ID;struct PCB int pcbID; /进程ID int size; /进程大小 int RunState; /运行状态,0表示就绪,1表示已分配内存正运行,2表示运行结束且退出内存 int TolTime; /总需要运行时间 int RunTime; /已运行时间 pcbListPCB_NUM;void menu() /菜单 int m; system(cls); printf(nntt*ttn); printf(tttt固定分区存储程序演示n); printf(tt*ttn); printf(nttt1.执行程序.);

4、printf(nttt0.退出程序.); scanf(%d,&m); switch(m) case 1: break; case 0: system(cls); menu(); break; default: system(cls); break; void paixu(struct MemInf* ComMem,int n) int i,j,t; for(j=0; jn-1; j+) for(i=0; iComMemi+1.size) t=ComMemi.size; ComMemi.size=ComMemi+1.size; ComMemi+1.size=t; void paixu2() in

5、t i,j,t; for(j=0; j4; j+) for(i=0; ipcbListi+1.size) t=pcbListi.size; pcbListi.size=pcbListi+1.size; pcbListi+1.size=t; void main()DD: menu(); char ch; int i,j,n,a=0; struct MemInf* ComMem; system(cls); printf(你要分多少个分区呢,请输入数值吧:); scanf(%d,&n); ComMem=(struct MemInf*)malloc(n*sizeof(struct MemInf); p

6、rintf(请划分内存固定大小分区:n);/划分内存固定大小分区 for(i=0; i=INT) printf(超出规定内存范围); ch=getchar(); ch=getchar(); goto DD; paixu(ComMem,n);/初始化就绪进程队列 pcbList0.pcbID =1; pcbList0.RunState =0; /运行状态,0表示就绪,1表示已分配内存正运行,2表示运行结束且退出内存 pcbList0.size=30; pcbList0.RunTime =0; pcbList0.TolTime =5; pcbList1.pcbID =2; pcbList1.Run

7、State =0; pcbList1.size=15; pcbList1.RunTime =0; pcbList1.TolTime =6; pcbList2.pcbID =3; pcbList2.RunState =0; pcbList2.size=50; pcbList2.RunTime =0; pcbList2.TolTime =3; pcbList3.pcbID =4; pcbList3.RunState =0; pcbList3.size=120; pcbList3.RunTime =0; pcbList3.TolTime =4; pcbList4.pcbID =5; pcbList4

8、.RunState =0; pcbList4.size=125; pcbList4.RunTime =0; pcbList4.TolTime =9; ch=getchar(); ch=getchar(); while(pcbListPCB_NUM-1.RunTime pcbListPCB_NUM-1.TolTime) for(j=0; jPCB_NUM; j+) /内存分配 for(i=0; i= pcbListj.size) /如果该内存分区空间大于或等于进程空间,即可以把该空闲内存分区分配给该进程 ComMemi.state =pcbListj.pcbID ; pcbListj.RunSt

9、ate=1; /内存回收 if(pcbListj.RunTime =pcbListj.TolTime) /如果该进程运行时间大于或等于总需时间,即可回收该进程占用内存 for(i=0; in; i+) if(ComMemi.state = pcbListj.pcbID) ComMemi.state = 0; /内存状态变为 未分配 pcbListj.RunState=2; /进程状态变为 运行完毕 /运行时间加1 for(i=0; iPCB_NUM; i+) if (pcbListi.RunState=1 & pcbListi.RunTime pcbListi.TolTime) /处于运行状态

10、且运行时间小于总需时间的进程,运行时间加1 pcbListi.RunTime+;/显示模块 printf(进程IDt 进程大小t 状态t 需要时间t 运行时间n); for(i=0; iPCB_NUM; i+) printf(%dt %dtt %dt %dtt %dn,pcbListi.pcbID,pcbListi.size, pcbListi.RunState, pcbListi.TolTime ,pcbListi.RunTime); printf(分区IDt 分区大小t 状态n); for(i=0; in; i+) printf(%dt %dtt %dn,i,ComMemi.size ,C

11、omMemi.state ); printf(按回车键继续.n); getchar(); /按任意键继续(分步执行,以便观察内存分配回收 运行结果截图:2、设计一个可变式分区分配的存储管理方案。并模拟实现分区的分配和回收过程。 对分区的管理法可以是下面三种算法之一: 首次适应算法 循环首次适应算法 最佳适应算法 代码实现部分:#include#include#include#define max 100typedef struct node int start; int length; char tag20;job;job freesmax;job occupysmax;int free_qu

12、antity,occupy_quantity;int SIZE;void initial() /初始化函数 int i; for(i=0;imax;i+) freesi.start=-1; freesi.length=0; strcpy(freesi.tag,free); occupysi.start=-1; occupysi.length=0; strcpy(occupysi.tag,); free_quantity=0; occupy_quantity=0;void writedata() /把分区函数写入磁盘文件 FILE *fp; char fname20; int i,j; prin

13、tf(请输入初始空闲表文件名:n); scanf(%s,&fname); printf(现在进行初始化空闲分区!n); printf(请输入您要建立的空闲分区数:n); scanf(%d,&SIZE); for(i=0;iSIZE;i+) j=i+1; printf(输入第%d个分区的起始地址:n,j); scanf(%d,&freesi.start); printf(输入第%d个分区的长度:n,j); scanf(%d,&freesi.length); if(fp=fopen(fname,wb)=NULL) printf(错误,文件打不开,请检查文件名n); for(i=0;iSIZE;i+

14、) if(fwrite(&freesi,sizeof(struct node),1,fp)!=1) printf(文件写入错误!n); fclose(fp);void readdata() /从文件读入分区表函数 FILE *fp; char fname20; printf(请输入读入空闲表文件名:); /输入空闲表文件的文件名 scanf(%s,&fname); if(fp=fopen(fname,rb)=NULL) printf(错误,文件打不开,请检查文件名n); exit(0); else int i; for(i=0;iSIZE;i+) fread(&freesi,sizeof(st

15、ruct node),1,fp); free_quantity+; fclose(fp);void sort() /排序空闲表 int i; for(i=0;ifree_quantity-1;i+) int t=i; int j; for(j=i+1;jfree_quantity;j+) if(freesj.start=freest.start) t=j; freesfree_quantity.start=freesi.start; freesfree_quantity.length=freesi.length; freesi.start=freest.start; freesi.length

16、=freest.length; freest.start=freesfree_quantity.start; freest.length=freesfree_quantity.length; void view() /显示分区信息int i,j; printf(空闲分区表显示如下:n); printf(起始地址t长度t状态标志n); for(i=0;ifree_quantity;i+) printf(%6dkt%10dkt%stn,freesi.start,freesi.length,freesi.tag); printf(nn已分配分区表显示如下:n); printf(起始地址t长度t占用作

17、业名n); for(j=0;joccupy_quantity;j+) printf(%6dkt%10dkt%stn,occupysj.start,occupysj.length,occupysj.tag); getchar(); getchar();void earliest() /首次适应算法 char jobname20; int joblength,f=0; int i,j; printf(请输入作业名:n); scanf(%s,&jobname); printf(输入作业的长度:n); scanf(%d,&joblength); for(i=0;i=joblength) f=1; if

18、(f=0) printf(n当前没有能满足你申请长度的空闲内存,请稍候再试n); getchar(); else /找到了满足的空间 int t=0; j=0; while(t=0) if(freesj.length=joblength) t=1; j+; j-; occupysoccupy_quantity.start=freesj.start; /分配满足条件的空间 strcpy(occupysoccupy_quantity.tag,jobname); occupysoccupy_quantity.length=joblength; occupy_quantity+; if(freesj.

19、lengthjoblength) freesj.start+=joblength; freesj.length-=joblength; else for(i=j;ifree_quantity-1;i+) freesi.start=freesi+1.start; freesi.length=freesi+1.length; free_quantity-; printf(作业申请内存空间成功!n); getchar(); getchar(); void excellent() /最佳适应法 char jobname20; int joblength,f=0; int i,j;printf(请输入作

20、业名:n); scanf(%s,&jobname); printf(输入作业的长度:n); scanf(%d,&joblength); for(i=0;i=joblength) f=1; if(f=0) printf(n当前没有能满足你申请长度的空闲内存,请稍候再试n); getchar(); else /找到了满足的空间 int t=0; j=0; while(t=0) if(freesj.length=joblength) t=1; j+; j-; for(i=0;i=joblength&freesi.lengthjoblength) freesj.start+=joblength; fr

21、eesj.length-=joblength; else for(i=j;ifree_quantity-1;i+) freesi.start=freesi+1.start; freesi.length=freesi+1.length; free_quantity-; printf(作业申请内存空间成功!n); getchar(); getchar(); void worst() char jobname20; int joblength,f=0;int i,j; printf(请输入作业名:n); scanf(%s,&jobname); printf(输入作业的长度:n); scanf(%d,

22、&joblength); for(i=0;i=joblength) f=1; if(f=0) printf(n当前没有能满足你申请长度的空闲内存,请稍候再试n); getchar(); getchar(); else /找到了满足的空间 int t=0; j=0; while(t=0) if(freesj.length=joblength) t=1; j+; j-; for(i=0;i=joblength&freesi.lengthfreesj.length) j=i; occupysoccupy_quantity.start=freesj.start; /分配空闲空间 strcpy(occu

23、pysoccupy_quantity.tag,jobname); occupysoccupy_quantity.length=joblength; occupy_quantity+; if(freesj.lengthjoblength) freesj.start+=joblength; freesj.length-=joblength; else for(i=j;ifree_quantity-1;i+) freesi.start=freesi+1.start; freesi.length=freesi+1.length; free_quantity-; printf(作业申请内存空间成功!n); getchar(); getchar(); void main() initial(); int n; writedata(); system(cls); readdata(); for(;) sort(); printf(*n); printf(*n); printf(* 欢迎使用可变分区存储管理系统 *n); printf(*n); printf(* 1.显示空闲表和分配表 *n); printf(* 2.首次适应算法 *n); printf(* 3.最佳适应算法 *

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1