操作系统-存储器管理实验
一、目的
本课题实验的目的是,使学生实验存储器管理系统的设计方法;加深对所学各种存储器管理方案的了解;要求采用一些常用的存储器分配算法,设计一个存储器管理模拟系统并调试运行。
二、题目
存储器管理
三、要求及提示
1、要求采用一种常用的存储器分配算法,设计一个存储器管理模拟系统。允许进行多次的分配和释放,并可向用户反馈分配和释放情况及当前内存的情况;采用“命令菜单”选择和键盘命令输入的会话方式,根据输入请求调用分配模块,或回收模块,或内存查询模块,或最终退出系统。
2、编程实现。
3、工具:C 语言或其它高级语言
4、实验时间:2 学时
四、实验报告
1、写出存储器管理的思想。
2、画出算法流程图和设置的数据结构。
3、写出调试程序出现的问题及解决的方法。
4、打印实验报告及程序清单。
5、报告给出测试的结果。
五、范例
采用可变分区存储器管理方案的模拟系统。
1、问题描述
该模拟系统的外部特性与真实系统基本一样。存储分配算法采用首次适应法。用“拼,接”和“紧凑”技术来处理存储器碎片。
2、算法
存储分配算法采用首次适应(FF)法。根据指针 freep 查找自由链,当找到第一块可满足分配请求的空闲区时便分配之。当某空闲区被分配后的剩余空闲区空间大于规定的碎片最小容量 min 时,则形成一个较小的空闲区留在自由链中。回收时,根据 MAT 将指定分区链入自由链。若该分区有前邻或后邻空闲分区,则将他们拼接成一块加大的空闲区。当某个分配请求不能被满足,但此时系统中所有碎片总量满足分配请求的容量时,系统立即进入内存“紧凑”以消除碎片。即将各作业占用区集中下移到用户内存区的下部(高地址部分),形成一片连接的作业区,而在用户内存区的上部形成一块较大的空闲区。然后再进行分配。
本系统的主要程序模块包括:分配模块 ffallocation,回收模块 ffcolection,紧凑模块coalesce 及命令处理模块 menu。Menu 用以模拟系统的输入,采用“命令菜单”选择和键盘命令输入的会话方式,根据输入请求调用分配模块,或回收模块,或内存查询模块,或最终退出系统。
系统的主流程如图 3 所示。
3、数据结构
(1) 自由链与区头。内存空闲区采用自由链结构。链首由 freep 指向,链中各个空闲区按地址递增次序排列。初启时整个用户内存区为一个空闲区。在每个空闲区首部设置一个区头(freearca)结构。区头信息包括:
size 空闲区大小(以字节计),包括区头所占空间;
next 前向链指针,指向下一个空闲区;
back 反向链指针,指向上一个空闲区;
address 本空闲区首地址。
(2) 内存分配表 MAT。系统设置一个 MAT,每个运行作业都在 MAT 中占有一个表目,回收分区时清除相应表目。表目信息包括:
name 用户作业名;
length 作业区大小;
addr 作业区首地址;
4、程序清单
#include<stdio.h>
#include<stdlib.h>#define TOTAL 5000
#define SETADDRESS 2000
#define MIN 100
#define MAX 10typedef struct freearea
{ int address;int size;struct freearea *next;struct freearea *back;
}*freeptr;typedef struct mat
{ char name;int address;int length;struct mat *next;struct mat *back;
}*jobptr;char string[10];
long totalfree;
char jobnumber;freeptr freep;
jobptr jobp;/********初始化**********/
int init()
{freep=(freeptr)malloc(sizeof(struct freearea));freep->size=TOTAL;freep->address=SETADDRESS;freep->next=NULL;freep->back=NULL;totalfree=TOTAL;jobp=NULL;jobnumber=0;return(0);
}/******分配模块*******/
int fengpei(int jl,char jn)
{freeptr fp;jobptr jp,jp1,jp2;jp2=(jobptr)malloc(sizeof(struct mat));if(totalfree<jl) return(1);fp=freep;while(fp!=NULL){if(fp->size<jl) fp=fp->next;else{jobnumber=jobnumber+1;totalfree=totalfree-jl;jp2->name=jn;jp2->length=jl;jp2->address=freep->address;if(jobp==NULL){ jp2->next=NULL;jp2->back=NULL;jobp=jp2;}else{jp=jobp;while(jp!=NULL&&(jp2->address<jp->address)){ jp1=jp;jp=jp->next;}jp2->next=jp;if(jp==NULL){jp2->back=jp1;jp1->next=jp2;}else{ jp2->back=jp->back;if(jp->back!=NULL) jp1->next=jp2;else jobp=jp2;jp->back=jp2;}}if((fp->size-jl)<MIN){ if(fp->next!=NULL)fp->next->back=fp->back;if(fp->back!=NULL) fp->back->next=fp->next;else freep=fp->next;/* return();*/}else{fp->size=fp->size-jl;fp->address=fp->address+jl;}return(2);}if(totalfree>=jl) return(0);}
}
/*********显示模块*********/
void xianshi()
{jobptr jp;/****清屏****/if(jobnumber<=0)printf("NO JOB!");else{printf("name\t\tlength\t\taddress\n");jp=jobp;while(jp!=NULL){printf("%c\t\t%d\t\t%d\n",jp->name,jp->length,jp->address);jp=jp->next;}}printf("\nthe total left is %d bytes:",totalfree);
}/******回收模块********/
void huishou(char jn)
{freeptr fp,fp1,fp2;jobptr jp;int f=0;jp=jobp;while((jp!=NULL)&&(jp->name!=jn))jp=jp->next;if(jp!=NULL){jobnumber=jobnumber-1;totalfree=totalfree+jp->length;if(freep==NULL){freep=(freeptr)malloc(sizeof(struct freearea));freep->address=jp->address;freep->size=jp->address;freep->next=NULL;freep->back=NULL;}else{fp=freep;while((fp!=NULL)&&(fp->address<jp->address)){fp1=fp;fp=fp->next;}if(fp!=NULL){if((fp->next!=NULL)&&(fp->next->address=jp->address+jp->length))f=f+1;if((fp->back!=NULL)&&(jp->address=fp1->address+fp1->size))f=f+2;}else if((jp->address)=(fp1->address+fp1->size)) f=f+2;switch(f){case 0:{fp2=(freeptr)malloc(sizeof(struct freearea));fp2->address=jp->address;fp2->size=jp->length;fp2->next=fp;if(fp!=NULL){fp2->back=fp->back;if(fp->back!=NULL) fp1->next=fp2;else freep=fp2;fp->back=fp2;}else{fp2->back=fp1;fp1->next=fp2;}break;}case 1:{fp->size=fp->size+jp->length;fp->address=jp->address;break;}case 2:fp1->size=fp1->size+jp->length; break;case 3:{fp1->size=fp1->size+jp->length+fp->size;fp1->next=fp->next;if(fp->next!=NULL) fp->next->back=fp2;free(fp);break;}}}if(jp==jobp) jobp=jp->next;if(jp->next!=NULL) jp->next->back=jp->back;if(jp->back!=NULL) jp->back->next=jp->next;free(jp);}
}
/*********搬家************/
void banjia()
{
freeptr fp,fp1;
jobptr jp;
long bottom;if(jobnumber>0){jp=jobp;bottom=TOTAL+SETADDRESS;while(jp!=NULL){jp->address=bottom-jp->length;bottom=bottom-jp->length;jp=jp->next;}fp=freep;while(fp!=NULL){fp1=fp;fp=fp->next;free(fp1);}freep=(freeptr)malloc(sizeof(freeptr));freep->size=totalfree;freep->address=SETADDRESS;freep->next=NULL;freep->back=NULL;}
}
void mingling()
{char name,anykey,jobname;int length,select;int address;{
a1: //clrscr(); //用 system("cls"); 替换system("cls");printf("you can select one of the following:\n");printf(" (1)require to be allocate\n");printf(" (2)require to collexte the size\n");printf(" (3)check the memory\n");printf(" (4)quit system\n");printf("you select is:");scanf("%d",&select);switch(select){ case 1:if(jobnumber>=MAX) printf("the job is too many");else{printf("enter you job name\n");scanf("%s",&name);printf("enter your job length\n");scanf("%10d",&length);address=fengpei(length,name);switch(address){ case 1: printf("the memory is full");break;case 0:{banjia();fengpei(length,name);xianshi();break;}case 2: xianshi(); break;/*****else xianshi();*****/}break; }case 2:{printf("enter the name of the job\n");printf("you select is:");jobname=getchar(); //清除之前滞留在缓冲区的回车符“\n”jobname=getchar();// scanf("%c",&jobname);// printf("%c",jobname);huishou(jobname);xianshi();break;}case 3: xianshi(); break;case 4: goto a2;}printf("\npress enter to return menu\n");anykey=getchar();anykey=getchar();/* scanf("%c",anykey); */goto a1;a2: printf("you have exit the system!");}}
int main()
{init();mingling();return 0;
}
操作系统-存储器管理实验相关推荐
- 操作系统存储器管理实验报告_献上膝盖!华为工程师抛出一份堪称“举世无双”操作系统笔记...
写在前面 操作系统在计算机行业中是一门最基础的技术,无论是在开发项目还是在算法岗,我们都是基于计算机上进行的,我们对操作系统的了解体现我们从事计算机相关岗位的资深素质,因此,接下来,这篇文章给大家介绍 ...
- 模拟存储器管理C语言,操作系统-存储器管理实验C语言.doc
#include "stdio.h" #include "stdlib.h" #include "string.h" #define Siz ...
- 操作系统——存储器管理
操作系统--存储器管理 程序的装入和链接 用户程序想要在系统中运行,必须先将他装入内存,然后再将其转变为一个可执行的程序,步骤: 编译-->链接-->装入 程序的装入: 绝对装入方式:(只 ...
- 操作系统存储器管理管理试验
存储器管理 一.目的 本课题实验的目的是,使学生实验存储器管理系统的设计方法:加深对所学各种存储器管理方案的了解:要求采用一些常用的存储器分配算法,设计一个存储器管理模拟系统并调试运行. 二.要求及提 ...
- 操作系统—存储器管理
存储器管理 1 存储器的层次结构 计算机执行时,几乎每条指令都涉及对存储器的访问.因此要求对存储器的访问速度跟得上处理机的运行速度.考虑到价格和现实因素,如今的计算机大都采用了多层结构的存储器系统 ...
- 操作系统——存储器管理(连续分配存储管理方式)
文章目录 一.单一连续分配 二.固定分区分配 1. 划分分区的方法 2. 内存分配 三.动态分区分配 1. 动态分区分配中的数据结构 2. 动态分区分配算法 3. 分区分配操作 四.基于顺序搜索的动态 ...
- 操作系统——存储器管理的功能
一. 内容总览 二. 内存空间的分配和回收 为了能将用户程序装入内存,必须为它分配一定大小的内存空间.连续分配方式是最早出现的一种存储器分配方式 该分配方式为一个用户程序分配一个连续的内存空间,即程序 ...
- 操作系统-进程管理实验(2)
实验二 进程管理 一.目的 本课题实验的目的是,加深对进程概念及进程管理各个部分内容的理解:熟悉进程管理中主要数据结构的设计及进程调度算法,进程控制机构,同步机构,通信机构的实施. 二.题目 进程管 ...
- 【操作系统——存储器管理习题】 某虚拟存储器的用户编程空间共32个页面,每页为1KB,内存为16KB,假定某时刻一用户页表中已调入内存的页面对应的物理块号如下:则逻辑地址0A5C(H)物理地址为?
解题步骤: 第一步: 将十六进制逻辑地址转换为十进制 0A5C=160*12+161*5+162*10+163*0=12+80+2560+0=2652 第二步: 根据书上P103公式: P=INT[A ...
最新文章
- 会议重点介绍芯片设计中的人工智能
- error C2589: “(”: “::”右边的非法标记;error C2059: 语法错误 : “::”
- nodejs-EventEmitter
- js循环解析html标签,riot.js教程【六】循环、HTML元素标签
- Apache Sentry 初识
- 敏捷软件开发:原则、模式与实践——第12章 ISP:接口隔离原则
- 非法关机的时候,postgresql启动故障的解决
- jquery图表统计插件-highcharts详解
- 计算机动漫与游戏制作电脑配置,动漫与游戏设计该如何选电脑配置?
- python爬取同花顺_Python爬虫-同花顺行业历史数据及成分股
- 加载webView使用框架AgenWeb
- 0-glusterfs: failed to set volfile server: File exists
- android 更换桌面名称_更改安卓软件名称 android修改应用程序名称
- 输出电容的ESR对DC_DC的影响——电感发烫排查思路
- 邪恶心理学-真实面对谎言的本质
- LEDMAN雷曼家庭巨幕成都首店正式开业
- pychram 配置清华镜像源_教你如何给树莓派更换软件源
- 【学习总结】数学-lucas定理
- Android自定义view摇杆,Android自定义摇杆
- 微众银行在联邦推荐算法上的探索及应用
热门文章
- 三、项目分工(华为项目管理法-孙科炎读书摘要)
- Springboot项目install打包-某些输入文件使用了未经检查或不安全的操作。分析与解决
- 数据预处理之特征选择(Feature Selections Methods)
- Linux常用备份恢复工具(1)
- 【QQ邮箱第三方客户端设置】Outlook登录QQ邮箱报错,解决方案。
- matlab分数约分,分母
- 全国大学生网络安全精英赛初赛(nisp一级)
- jieba分词库、WordCloud词云库、requests库
- 计算机毕业设计Python+uniapp养花助手小程序(小程序+源码+LW)
- element中设置5栏布局