操作系统存储器管理

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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;

}

相关文档
最新文档