操作系统存储器管理
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
存储器管理(固定分区、可变分区与分页式分配算法)
一、目的
本课题实验的目的是,使学生实验存储器管理系统的设计方法;加深对所学各种存储器管理方案的了解;要求采用一些常用的存储器分配算法,设计一个存储器管理模拟系统并调试运行。
二、实验内容
模拟固定分区分内存的动态分配和回收,并编程实现。
三、要求及提示
(1)建立相关的数据结构,作业控制块、已分配分区及未分配分区
(2)实现一个固定分区分配算法(实现多个分区只设置一个后备作业队列, 而每个分区设置一个后备作业队列 ,留给大家实现)
(3)实现一个分区回收算法
(4)要求采用一种常用的存储器分配算法,设计一个存储器管理模拟系统。允许进行多次的分配和释放,并可向用户反馈分配和释放情况及当前内存的情况;采用“命令菜单”选择和键盘命令输入的会话方式,根据输入请求调用分配模块,或回收模块,或内存查询模块,或最终退出系统。
(5)编程实现。
(6)工具:C语言或其它高级语言
四、实验报告
1、列出调试通过程序的清单,并附上文档说明。
2、总结上机调试过程中所遇到的问题和解决方法及感想。
五参考代码:
// memdos.cpp : 定义控制台应用程序的入口点。
//以下代码为4种分区,8K分区四块,16K分区3块,32分区2块, 64分区1块, 共10块
#include "stdafx.h"
#include
#include
//#include
#define TRUE 1
#define FALSE 0
void InitCSolid( );
void ExitSolid();
int MallocArea(int nSize,char* sName);//申请一个分区函数
int FreeArea(char *sName); //释放一个分区函数
void ShowArea( );//显示所有分区状态函数
{
char *pmem; //每分区内存的起始地址
int size; // 每分区的大小
int useSize; //已使用大小,若为0 ,表示此分区尚未使用
char jobName[20]; //此分区的作业(进程)名
};
int nSizes[4];//共4种分区,每种分区的大小为 8k,16k,32k,64k ,每K为1024字节
char *pmems; //起始分区内存地址
Solid *psolids;
int snum; //定义总的内存分区数
int main( )
{
int jobCount=1; //已申请的作业个数
char str[100];
char jobName[14];
int nSize; //申请的作业大小
InitCSolid( ); //初始化数据
while(1)
{
ShowArea( ); //显示内存的分配与使用情况
printf(" 固定分区内存管理\n x退出 1申请内存 2释放内存\n");
scanf("%s",str);
if(strlen(str)!=1) continue;
if(str[0]=='x' || str[0]=='X')
break; //退出
if(str[0]=='1') //申请内存
while(1)
{
printf("请输入申请内存的大小 (按x退出,按0返回上一级): ");
scanf("%s",str);
if(strlen(str)==1)
{
if(str[0]=='x' || str[0]=='X')
goto exit; // 退出
if(str[0]=='0')
break; //返回上一级
}
nSize=atoi(str);//获取申请的内存大小 (atoi函数功能为字符串转换成数字类型)
if(nSize<=0) { printf("输入错误! ");continue;}
sprintf(jobName,"作业%03d",jobCount); //自动定义一个作业名
if( !MallocArea(nSize,jobName)) //分配内存,并判断是否成功
{
printf( "申请内存大小为%d,但没有空间可分配,请重新输入\n",nSize);
}
jobCount++; //已申请的作业个数
ShowArea(); //显示内存的分配与使用情况
}
if(str[0]=='0')
continue; //返回上一级
}
if(str[0]=='2') //释放内存
{
printf("请输入释放内存的作业名 (按x退出,按0返回上一级): ");
while(1)
scanf("%s",str);
if(strlen(str)==1)
{
if(str[0]=='x' || str[0]=='X')
goto exit; // 退出
if(str[0]=='0')
break; //返回上一级
}
if(strlen(str)==3)
sprintf(jobName,"作业%s",str); //获取作业名
else strcpy(jobName,str);
if(FreeArea(jobName)) //根据作业名释放内存,并判断是否释放成功
{
printf("已释放%s所占用的内存\n\n\n",str);
ShowArea();
printf("请输入释放内存的作业名 (按x退出,按0返回上一级): ");
}
else printf("无此作业,请重新输入释放内存的作业名 (按x退出,按0返回上一级): ");
}
if(str[0]=='0')
continue;
}
}
exit:ExitSolid(); //释放资源
//
//getchar();
return 0;
}