存储器管理

一、目的
本课题实验的目的是,使学生实验存储器管理系统的设计方法;加深对所学各种存储器管理方案的了解;要求采用一些常用的存储器分配算法,设计一个存储器管理模拟系统并调试运行。
二、题目
存储器管理
三、要求及提示
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;
}

操作系统-存储器管理实验相关推荐

  1. 操作系统存储器管理实验报告_献上膝盖!华为工程师抛出一份堪称“举世无双”操作系统笔记...

    写在前面 操作系统在计算机行业中是一门最基础的技术,无论是在开发项目还是在算法岗,我们都是基于计算机上进行的,我们对操作系统的了解体现我们从事计算机相关岗位的资深素质,因此,接下来,这篇文章给大家介绍 ...

  2. 模拟存储器管理C语言,操作系统-存储器管理实验C语言.doc

    #include "stdio.h" #include "stdlib.h" #include "string.h" #define Siz ...

  3. 操作系统——存储器管理

    操作系统--存储器管理 程序的装入和链接 用户程序想要在系统中运行,必须先将他装入内存,然后再将其转变为一个可执行的程序,步骤: 编译-->链接-->装入 程序的装入: 绝对装入方式:(只 ...

  4. 操作系统存储器管理管理试验

    存储器管理 一.目的 本课题实验的目的是,使学生实验存储器管理系统的设计方法:加深对所学各种存储器管理方案的了解:要求采用一些常用的存储器分配算法,设计一个存储器管理模拟系统并调试运行. 二.要求及提 ...

  5. 操作系统—存储器管理

    存储器管理 1 存储器的层次结构 ​ 计算机执行时,几乎每条指令都涉及对存储器的访问.因此要求对存储器的访问速度跟得上处理机的运行速度.考虑到价格和现实因素,如今的计算机大都采用了多层结构的存储器系统 ...

  6. 操作系统——存储器管理(连续分配存储管理方式)

    文章目录 一.单一连续分配 二.固定分区分配 1. 划分分区的方法 2. 内存分配 三.动态分区分配 1. 动态分区分配中的数据结构 2. 动态分区分配算法 3. 分区分配操作 四.基于顺序搜索的动态 ...

  7. 操作系统——存储器管理的功能

    一. 内容总览 二. 内存空间的分配和回收 为了能将用户程序装入内存,必须为它分配一定大小的内存空间.连续分配方式是最早出现的一种存储器分配方式 该分配方式为一个用户程序分配一个连续的内存空间,即程序 ...

  8. 操作系统-进程管理实验(2)

    实验二  进程管理 一.目的 本课题实验的目的是,加深对进程概念及进程管理各个部分内容的理解:熟悉进程管理中主要数据结构的设计及进程调度算法,进程控制机构,同步机构,通信机构的实施. 二.题目 进程管 ...

  9. 【操作系统——存储器管理习题】 某虚拟存储器的用户编程空间共32个页面,每页为1KB,内存为16KB,假定某时刻一用户页表中已调入内存的页面对应的物理块号如下:则逻辑地址0A5C(H)物理地址为?

    解题步骤: 第一步: 将十六进制逻辑地址转换为十进制 0A5C=160*12+161*5+162*10+163*0=12+80+2560+0=2652 第二步: 根据书上P103公式: P=INT[A ...

最新文章

  1. 会议重点介绍芯片设计中的人工智能
  2. error C2589: “(”: “::”右边的非法标记;error C2059: 语法错误 : “::”
  3. nodejs-EventEmitter
  4. js循环解析html标签,riot.js教程【六】循环、HTML元素标签
  5. Apache Sentry 初识
  6. 敏捷软件开发:原则、模式与实践——第12章 ISP:接口隔离原则
  7. 非法关机的时候,postgresql启动故障的解决
  8. jquery图表统计插件-highcharts详解
  9. 计算机动漫与游戏制作电脑配置,动漫与游戏设计该如何选电脑配置?
  10. python爬取同花顺_Python爬虫-同花顺行业历史数据及成分股
  11. 加载webView使用框架AgenWeb
  12. 0-glusterfs: failed to set volfile server: File exists
  13. android 更换桌面名称_更改安卓软件名称 android修改应用程序名称
  14. 输出电容的ESR对DC_DC的影响——电感发烫排查思路
  15. 邪恶心理学-真实面对谎言的本质
  16. LEDMAN雷曼家庭巨幕成都首店正式开业
  17. pychram 配置清华镜像源_教你如何给树莓派更换软件源
  18. 【学习总结】数学-lucas定理
  19. Android自定义view摇杆,Android自定义摇杆
  20. 微众银行在联邦推荐算法上的探索及应用

热门文章

  1. 三、项目分工(华为项目管理法-孙科炎读书摘要)
  2. Springboot项目install打包-某些输入文件使用了未经检查或不安全的操作。分析与解决
  3. 数据预处理之特征选择(Feature Selections Methods)
  4. Linux常用备份恢复工具(1)
  5. 【QQ邮箱第三方客户端设置】Outlook登录QQ邮箱报错,解决方案。
  6. matlab分数约分,分母
  7. 全国大学生网络安全精英赛初赛(nisp一级)
  8. jieba分词库、WordCloud词云库、requests库
  9. 计算机毕业设计Python+uniapp养花助手小程序(小程序+源码+LW)
  10. element中设置5栏布局