




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、 存储管理实验实验报告1实验目的设计一个固定分区分配的存储管理方案,并编程模拟实现分区的分配和回收过程。 对分区的管理法可以是循环首次适应算法 或 最佳适应算法。2实验原理通过采用最佳适应算法的固定式分区分配的存储管理方案,模拟实现分区的分配和回收过程。可以假定每个作业都是批处理作业,并且不允许动态申请内存。为实现分区的分配和回收,可以设定一个分区说明表,按照表中的有关信息进行分配,并根据分区的分配和回收情况修改该表。3采用算法及算法描述本程序通过手动输入内存大小的输入,然后通过冒泡法对分区的大小进行排序,采用最佳适应算法构建整个算法的架构,该算法要求所有的空闲分区按照其容量的大小进行从小到大
2、的顺序形成一空闲分区链。因而,第一次如果能够满足要求的空闲区,必然是最佳的。该算法也存在一定的缺陷,因为每次分配后切割下来的剩余部分总是最小的,故而存储器中会留下许多难以利用的小空余区。4数据结构描述,程序模块划分头文件模块:#include "stdio.h"#include "windows.h"#include <stdlib.h>#include <conio.h>#define PCB_NUM 5 /模拟进程数量 #define INT 800/内存分区数量 struct MemInfint addr; /分区起始地址
3、int size; /分区大小int state; /0表示空闲,>0时表示已分配,存储的是进程ID ; struct PCB int pcbID; /进程ID int size; /进程大小 int RunState; /运行状态,0表示就绪,1表示已分配内存正运行,2表示运行结束且退出内存 int TolTime; /总需要运行时间 int RunTime; /已运行时间 ; PCB pcbListPCB_NUM;菜单模块:void menu() /菜单 int m;system("cls");printf("nntt*ttn");printf
4、("tttt固定分区存储程序演示n");printf("tt*ttn");printf("nttt1.执行程序.");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
5、n) int i,j,t; for(j=0;j<n-1;j+) for(i=0;i<n-j-1;i+) if(ComMemi.size>ComMemi+1.size) t=ComMemi.size; ComMemi.size=ComMemi+1.size; ComMemi+1.size=t; void paixu2() int i,j,t; for(j=0;j<4;j+) for(i=0;i<4-j;i+) if(pcbListi.size>pcbListi+1.size) t=pcbListi.size; pcbListi.size=pcbListi+1.
6、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); printf("请划分内存固定大小分区:n");/划分内存固定大小
7、分区 for(i=0;i<n;i+) printf("输入固定分区%d分区的长度:",i);/输入固定分区每个的长度 scanf("%d",&ComMemi.size); if(i=0) ComMemi.addr=40;/定义第一个分区的起始地址为40 else ComMemi.addr=ComMemi-1.addr+ComMemi-1.size;/表示下一个起始地址的起始状态表示的是分区长度加上起始地址长度 ComMemi.state=0;/表示状态为未分配 a=ComMemi.size+a; if(a>=INT) printf(&
8、quot;超出规定内存范围"); 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.RunState =0;pcbList1.size=15;pcbList1.RunTime =0;pcbL
9、ist1.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.RunState =0;pcbList4.size=125;pcbList4.RunTime =0;pcbList4.TolT
10、ime =9;ch=getchar();ch=getchar();while(pcbListPCB_NUM-1.RunTime < pcbListPCB_NUM-1.TolTime)for(j=0;j<PCB_NUM;j+)/内存分配for(i=0;i<n;i+)if(ComMemi.state =0 && pcbListj.RunState=0 ) /内存分区为0空闲,且进程状态为就绪,即可以考虑分配该内存分区if(ComMemi.size >= pcbListj.size) /如果该内存分区空间大于或等于进程空间,即可以把该空闲内存分区分配给该进程
11、ComMemi.state =pcbListj.pcbID ;pcbListj.RunState=1;/内存回收if(pcbListj.RunTime >=pcbListj.TolTime) /如果该进程运行时间大于或等于总需时间,即可回收该进程占用内存 for(i=0;i<n;i+)if(ComMemi.state = pcbListj.pcbID) ComMemi.state = 0; /内存状态变为 "未分配"pcbListj.RunState=2; /进程状态变为 "运行完毕" /运行时间加1for(i=0;i<PCB_NUM;
12、i+)if (pcbListi.RunState=1 && pcbListi.RunTime < pcbListi.TolTime) /处于运行状态且运行时间小于总需时间的进程,运行时间加1 pcbListi.RunTime+; 显示模块:printf("进程IDt 进程大小t 状态t 需要时间t 运行时间n");for(i=0;i<PCB_NUM;i+)printf("%dt %dtt %dt %dtt %dn",pcbListi.pcbID,pcbListi.size, pcbListi.RunState, pcbList
13、i.TolTime ,pcbListi.RunTime);printf("分区IDt 分区大小t 状态n");for(i=0;i<n;i+)printf("%dt %dtt %dn",i,ComMemi.size ,ComMemi.state );printf("按回车键继续.n"); getchar(); /按任意键继续(分步执行,以便观察内存分配回收)5主模块流程图、各子模块流程图6程序源代码及调试#include "stdio.h"#include "windows.h"#inclu
14、de <stdlib.h>#include <conio.h>#define PCB_NUM 5 /模拟进程数量 #define INT 800/内存分区数量 struct MemInfint addr; /分区起始地址 int size; /分区大小int state; /0表示空闲,>0时表示已分配,存储的是进程ID ; struct PCB int pcbID; /进程ID int size; /进程大小 int RunState; /运行状态,0表示就绪,1表示已分配内存正运行,2表示运行结束且退出内存 int TolTime; /总需要运行时间 int
15、RunTime; /已运行时间 ; PCB pcbListPCB_NUM;void menu() /菜单 int m;system("cls");printf("nntt*ttn");printf("tttt固定分区存储程序演示n");printf("tt*ttn");printf("nttt1.执行程序.");printf("nttt0.退出程序.");scanf("%d",&m);switch(m)case 1: break;case 0: s
16、ystem("cls");menu(); break;default: system("cls");break;void paixu(struct MemInf* ComMem,int n) int i,j,t; for(j=0;j<n-1;j+) for(i=0;i<n-j-1;i+) if(ComMemi.size>ComMemi+1.size) t=ComMemi.size; ComMemi.size=ComMemi+1.size; ComMemi+1.size=t; void paixu2() int i,j,t; for(j=
17、0;j<4;j+) for(i=0;i<4-j;i+) if(pcbListi.size>pcbListi+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); C
18、omMem=(struct MemInf*)malloc(n*sizeof(struct MemInf); printf("请划分内存固定大小分区:n");/划分内存固定大小分区 for(i=0;i<n;i+) printf("输入固定分区%d分区的长度:",i);/输入固定分区每个的长度 scanf("%d",&ComMemi.size); if(i=0) ComMemi.addr=40;/定义第一个分区的起始地址为40 else ComMemi.addr=ComMemi-1.addr+ComMemi-1.size;/
19、表示下一个起始地址的起始状态表示的是分区长度加上起始地址长度 ComMemi.state=0;/表示状态为未分配 a=ComMemi.size+a; if(a>=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; pcb
20、List0.TolTime =5;pcbList1.pcbID =2;pcbList1.RunState =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.TolTi
21、me =4; pcbList4.pcbID =5;pcbList4.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;j<PCB_NUM;j+)/内存分配for(i=0;i<n;i+)if(ComMemi.state =0 && pcbListj.RunState=0 ) /内存分区为0空闲
22、,且进程状态为就绪,即可以考虑分配该内存分区if(ComMemi.size >= pcbListj.size) /如果该内存分区空间大于或等于进程空间,即可以把该空闲内存分区分配给该进程 ComMemi.state =pcbListj.pcbID ;pcbListj.RunState=1;/内存回收if(pcbListj.RunTime >=pcbListj.TolTime) /如果该进程运行时间大于或等于总需时间,即可回收该进程占用内存 for(i=0;i<n;i+)if(ComMemi.state = pcbListj.pcbID) ComMemi.state = 0; /内存状态变为 "未
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025国内技术转让合同的范本
- 2025招标采购合同管理考点之合同谈判技巧要求
- 2025石油购销合同范本2
- 2025成都写字楼租赁合同范本
- 2025关于设备租赁承包合同范本
- 2025年的设备安装合同范本
- 2025标准办公室租赁合同协议
- 2025年上海市宽带互联网接入服务合同
- 《统计与分析方法》课件
- 2025上海市企业单位劳动合同
- 固体化学导论 第八章固体的扩散与表面化学 第九章固相反应课件
- 2025年内蒙古赤峰新正电工技术服务有限公司招聘笔试参考题库含答案解析
- 瑜伽授课合同协议
- 电梯有限空间作业安全专项施工方案
- 考后析得失思则得未来-(班会课)段考后试卷分析培养成长型思维
- 2025年江西九江市城市发展集团有限公司招聘笔试参考题库含答案解析
- 女性生命觉醒
- 机械行业重点岗位安全手册
- 基于大数据的公共安全风险预测模型研究报告
- 2025年广东省广州市荔湾区中考一模英语模拟试题
- DBJ33∕T 1104-2022 建设工程监理工作标准
评论
0/150
提交评论