版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、精选优质文档-倾情为你奉上洛阳理工学院实验报告系别计算机系班级学号姓名课程名称计算机操作系统实验日期2015/10/26实验名称分区内存管理成绩实验目的: 过本次实验,加深对进程概念的理解,进一步掌握进程状态的转变及进程调度策略。实验条件:计算机一台,软件vc+6.0一、实验目的通过这次实验,加深对内存管理的认识,进一步掌握内存的分配、回收算法的思想。二、实验原理设计程序模拟内存的动态分区内存管理方法。内存分区使用分区(说明)表进行管理,采用最先适应算法从分区表中寻找空闲区进行分配,内存回收时不考虑与相邻空闲区的合并。假定系统的内存共640K,初始状态为操作系统本身占用40K。t1时刻,为作业
2、A、B、C分配80K、60K、100K、的内存空间;t2时刻作业B完成;t3时刻为作业D分配50K的内存空间;t4时刻作业C、A完成;t5时刻作业D完成。要求编程序分别输出t1、t2、t3、t4、t5时刻内存的空闲分区。三、实验内容#include<stdio.h>#include<malloc.h>#include<stdlib.h>#include<conio.h>#define maxPCB 10#define maxPart 10#define TRUE 1#define FALSE 0typedef struct PCB_type ch
3、ar name; /进程名int address, len, valid; /进程所占分区起止、长度、该PCB有效标识(1有效,0无效)PCB;typedef struct seqlist PCB PCBelemmaxPCB; / maxPCB为系统中允许的最多进程数 int total; /系统中实际的进程数 PCBseql;typedef struct Partitionint address, len, valid; /分区起址、长度、有效标识(1空闲,0已分配) Part;typedef struct Partlist Part PartelemmaxPart; / maxPart为系
4、统中可能的最多分区数 int sum; /系统中实际的分区数Partseql;int length = 640 ;/系统有640 的空闲 PCBseql *pcbl;Partseql *partl;void initpcb(PCBseql *vpcbl,int adr); /初始化进程表vpcblvoid getprint(); void initpart(); /初始化分区表vpartlvoid request (char name, int len); /进程name请求len大小的内存void release(char name); /回收name进程所占内存空间void print()
5、; /输出内存空闲分区/*void printp()int i;for(i=0;i<(pcbl->total);i+) printf("%cn",pcbl->PCB); */void initpcb(PCBseql *vpcbl,int adr) /初始化进程表vpcbl int i=1; PCB *pcbelem; int tel; char c; pcbelem=vpcbl->PCBelem; while(TRUE) printf("请输入第%d进程名称",i+); vpcbl->total+; sc
6、anf("%c",&(pcbelem->name); printf("请输入进程所需内存"); scanf("%d",&tel); pcbelem->len=tel; pcbelem->address=adr+tel; pcbelem->valid=1; pcbelem+; printf("是否要继续输入进程(Enter-是 Esc-否)n"); fflush(stdin); c = getch(); fflush(stdin); if(c=27) break; void i
7、nitpart() char c,name; int len; printf("请输入你的操作 R.请求内存;P.输出空闲分区; S. 强制进程结束;(N/n).退出n"); fflush(stdin); c= getchar(); fflush(stdin); while(c!='N'|c!='n') if(c='R'|c='r') fflush(stdin); /做输入的时候要清空缓冲区 printf("请输入请求内存进程的名称,长度"); scanf("%c,%d"
8、,&name,&len); request(name,len); /进程请求内存 else if(c='P'|c='p') printf("t*VIEW begin*n"); getprint(); printf("t*VIEW end *n"); else if(c='S'|c='s') printf("请输入想要回收的进程名称n"); scanf("%c",&name); release(name); printf(&quo
9、t;请输入你的操作R.请求内存;P.输出空闲分区; S.强制进程结束 n"); fflush(stdin); c= getchar(); fflush(stdin); void init4IOS(int tem) Part *newPart = &partl->Partelem0; tem = tem>0?(tem<length?tem:length):0; newPart->address = 0; newPart->len = tem ; newPart->valid = 1; partl->sum+; printf("
10、->已为操作系统分配了%d kb内存n",tem); newPart = &partl->Partelem1; newPart->address = tem ; length=tem = length -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;
11、for(;i<(pcbl->total);i+) if(name = pcbl->PCB) return i; return pcbl->total+1; /分配出去就会产生一个碎片 将元素后移动一位 void ArrayToRightOne(int i) int leng=partl->sum; while(leng>i) partl->Partelemleng.address = partl->Partelemleng-1.address; partl->Partelemleng.len = partl->Pa
12、rtelemleng-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) char tem; in
13、t 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("%c,%d",&na
14、me,&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"); /分配出去就会产生一个碎片 将元素后移动一位 1
15、0 / 16 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(&quo
17、t;找不到进程名%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=par
18、tl->Partelemi.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&q
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年下半年北京市石景山区事业单位招考易考易错模拟试题(共500题)试卷后附参考答案
- 2025年下半年内蒙呼伦贝尔市教育信息中心招聘易考易错模拟试题(共500题)试卷后附参考答案
- 2025年下半年内蒙古赤峰喀喇沁旗直属事业单位“绿色通道”引进人才20人易考易错模拟试题(共500题)试卷后附参考答案
- 2025年下半年六安市公安局经济技术开发区分局招考特警辅助人员易考易错模拟试题(共500题)试卷后附参考答案
- 2025年下半年信阳市浉河区事业单位及招考易考易错模拟试题(共500题)试卷后附参考答案
- 2025年下半年保定市人民检察院招考司法辅助人员易考易错模拟试题(共500题)试卷后附参考答案
- 临床护理工作流程题目及答案
- 企业通讯与信息共享平台搭建指南
- 区块链风险控制-第6篇-洞察与解读
- 移动端安全审计方法-洞察与解读
- 介入导管室护士进修汇报
- 《高速铁路概论(第2版)》高职铁路专业全套教学课件
- 假劣药事件讲课件
- 农旅项目可行性分析报告
- 绿城诚园户型设计
- 《急性心力衰竭急救》课件
- 大学生职业规划大赛《生物科学专业》生涯发展展示
- 梦想启航励志前行主题班会课件
- 城市轨道交通运营管理职业生涯规划书范文
- 2024年安徽医科大学第一附属医院及北区人才招聘笔试真题
- 上海市二级甲等综合医院评审标准(2024版)
评论
0/150
提交评论