




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、洛阳理工学院实验报告系别计算机与信息工程系班级B100503学号B10050309姓名赵贺龙课程名称计算机操作系统实验日期2012-11-1实验名称分区内存管理成绩实验目的:通过这次实验,加深对内存管理的认识,进一步掌握内存的分配、回收算法的思想。实验条件:装有vc6.0的微机一台。实验原理:设计程序模拟内存的动态分区内存管理方法。内存空闲区使用分区(说明)表进行管理,采用最先适应算法从分区表中寻找空闲区进行分配,内存回收时不考虑与相邻空闲区的合并。假定系统的内存共640K,初始状态为操作系统本身占用40K。t1时刻,为作业A、B、C分配80K、60K、100K、的内存空间;t2时刻作业B完成
2、;t3时刻为作业D分配50K的内存空间;t4时刻作业C、A完成;t5时刻作业D完成。要求编程序分别输出t1、t2、t3、t4、t5时刻内存的空闲分区。实验内容:源代码:包含 头文件link.h,Windows.h和主程序 内存管理.cpp头文件link.h#include "stdio.h"#include "malloc.h"/进程Pcb类型及系统PCB表(顺序表)的描述#define maxPCB 15#define maxPart 10#define TRUE 1typedef struct char name; /进程名 int address,
3、len,valid;/进程所占分区起止和长度, /该PCB有效标示 1有效,0无效。PCB;typedef struct PCB PCBelemmaxPCB; int total;PCBseql;/分区类型及分区说明表(顺序表)的描述typedef structint address,len,valid;Part;typedef structPart PartelemmaxPart;int sum; /该时刻的分区数Partseql;void initPcb(PCBseql* vpcbl,int iosm); /初始化进程表vpcbl;void initpart(); /初始化分区表vpart
4、l;void request(char name,int len); /进程name请求len大小的内存void release(char name); /回收进程name所占的空间void getprint();/输出内存空闲分区主程序:内存管理.cpp#include "link.h"#include<Windows.h>int length = 640 ;/系统有640 的空闲PCBseql *pcbl = (PCBseql*)malloc(sizeof(PCBseql); ;Partseql *partl = (Partseql*)malloc(size
5、of(Partseql);void initPcb(PCBseql* vpcbl,int adr)int i=1;PCB *pcbelem;int tel;char c;pcbelem=vpcbl->PCBelem;while(TRUE)printf("请输入第%d进程名称",i+);vpcbl->total+;scanf("%c",&(pcbelem->name);printf("请输入进程所需内存");scanf("%d",&tel);pcbelem->len=tel;p
6、cbelem->address=adr+tel;pcbelem->valid=1;pcbelem+; printf("是否要继续输入进程?(Y/y) 是/(N/n) 否"); fflush(stdin); c = getchar(); fflush(stdin);if(c='N'|c='n')break; void initpart()char c,name;int len; printf("请输入你的操作 R.请求内存;P.输出空闲分区; S. 强制进程结束;(N/n).退出n"); fflush(stdin
7、); c= getchar(); fflush(stdin); while(c!='N'|c!='n') if(c='R'|c='r') fflush(stdin); /做输入的时候要清空缓冲区 printf("请输入请求内存进程的名称,长度"); scanf("%c,%d",&name,&len); request(name,len); /进程请求内存 else if(c='P'|c='p') printf("t*VIEW begi
8、n*n"); getprint(); printf("t*VIEW end *n"); else if(c='S'|c='s') printf("请输入想要回收的进程名称n"); scanf("%c",&name); release(name); printf("请输入你的操作 R.请求内存;P.输出空闲分区; S. 强制进程结束 n"); fflush(stdin); c= getchar(); fflush(stdin); void init4IOS(int t
9、em)Part *newPart = &partl->Partelem0;tem = tem>0?(tem<length?tem:length):0; newPart->address = 0;newPart->len = tem ;newPart->valid = 1;partl->sum+;printf("->已为操作系统分配了%d kb内存n",tem);newPart = &partl->Partelem1;newPart->address = tem ;length=tem = lengt
10、h -tem;tem = tem<0?(0):tem; newPart->len = tem ;newPart->valid = 0;partl->sum+;printf("->为操作系统分配后剩余的内存%d kb内存n",tem);int getTagByPcb(char name)/有提提/*int i=0;char tem ; PCB * newPcb =0; newPcb = pcbl->PCBelem; while (TRUE) tem = newPcb->name;if(name!=tem)newPcb+;i+;else
11、 break;return i;*/int i=0;for(;i<(pcbl->total);i+)if(name != pcbl->PCB)i+;elsebreak;return i;/分配出去就会产生一个碎片 将元素后移动一位voidArrayToRightOne(int i)/Part tem ;int leng=partl->sum;while(leng>i)partl->Partelemleng.address = partl->Partelemleng-1.address;partl->Partelemleng.l
12、en = partl->Partelemleng-1.len;partl->Partelemleng.valid = partl->Partelemleng-1.valid;leng-;partl->sum+;int findBylen(int len)int i=0;while(i<partl->sum)if (partl->Partelemi.valid=0) if (len<=partl->Partelemi.len) return i; i+;return 0;void request(char name,int len)/Part
13、 *suipian;char tem; int i; /是name进程的下标int temBylen;int temByPcb ;temByPcb=getTagByPcb(name);while (temByPcb>pcbl->total) printf("找不到进程名%c,重新输入Y/N",name); fflush(stdin); tem = getchar(); if(tem='Y') fflush(stdin); /做输入的时候要清空缓冲区 printf("请输入请求内存进程的名称,长度"); scanf("
14、%c,%d",&name,&len); if (len>pcbl->PCBelemtemByPcb.len) printf("您请求的容量大于您进程最大要求量%d,",pcbl->PCBelemtemByPcb.len); return; if (tem='N') return ; /找到一块len内存if(findBylen(len)=0)/sort2part(); /收集内存 代码没写if(i=findBylen(len)=0)printf("警告内存已满,无法分配n");/分配出去就会产生
15、一个碎片 将元素后移动一位ArrayToRightOne(i); /直接对partl->Partelemi赋值 并加入一个碎片temBylen = partl->Partelemi.len-len; partl->Partelemi.len = len;partl->Partelemi.valid = 1;/新的碎片partl->Partelemi+1.address = partl->Partelemi.address+partl->Partelemi.len;partl->Partelemi+1.len =temBylen;partl->
16、;Partelemi+1.valid=0;/更新pcb的状态和容量pcbl->PCBelemtemByPcb.address = partl->Partelemi.address;pcbl->PCBelemtemByPcb.len = pcbl->PCBelemtemByPcb.len-len ;/更新pcb的len pcbl->PCBelemtemByPcb.valid = 1 ;void release(char name)int i=0;int adress,len; if( getTagByPcb(name)<0) printf("找不到进
17、程名%cn",name);return ; else if(pcbl->PCBelemgetTagByPcb(name).valid=0) printf("%c还没有运行,请先运行n",name);printf("现在正回收%c的内存n",name); adress = pcbl->PCBelemgetTagByPcb(name).address; len = pcbl->PCBelemgetTagByPcb(name).len; while (i<partl->sum)if (adress=partl->P
18、artelemi.address)partl->Partelemi.valid=0;i+;void getprint()int i;printf("-空闲分区begin-n"); for (i=0;i<partl->sum;i+) if (partl->Partelemi.valid=0) printf("第%d块空闲内存 起止为%d,容量为%dn",i,partl->Partelemi.address,partl->Partelemi.len); printf("-空闲分区 end-n"); void main()char tem;int k,OSsize = 40;const int M=25;partl->sum=0;pcbl->total=0;system("color fc");/初始化操作系统 printf("n"); printf("n"); printf("n"); printf("n"); printf("n"); printf("n"); printf("n"
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 安全居家班会课件
- 江苏专转本管理技能课件
- 执业护士考试试题及答案解析
- 小学生文明礼仪教育规范
- 2025年经济法考试难点解析试题及答案
- 行政法与伦理道德的关联性试题及答案
- 主管护师考试护理方针试题及答案
- 现代建筑技术教学课件:工业化建筑构造详解
- 执业医师考试知识复习手册试题及答案
- 行政管理综合素养提升试题及答案
- 市场营销试题(含参考答案)
- 重庆市2023年度居民健康状况报告
- (输血科)培训计划
- 机械工程技术训练知到智慧树章节测试课后答案2024年秋北京航空航天大学
- 预拌混凝土质量管理
- 工贸行业隐患排查指导手册
- 第四单元《保护牙齿》活动三《保护牙齿》教案 浙教版综合实践活动二年级上册
- 小儿推拿合同范例
- 2024-2030年中国南美白对虾养殖市场规模分析及发展风险研究报告权威版
- 定期清洗消毒空调及通风设施规章制度
- 2024年21起典型火灾案例及消防安全知识专题培训(消防月)
评论
0/150
提交评论