操作系统存储器管理

上传人:ch****o 文档编号:142496132 上传时间:2022-08-25 格式:DOC 页数:8 大小:25.51KB
返回 下载 相关 举报
操作系统存储器管理_第1页
第1页 / 共8页
操作系统存储器管理_第2页
第2页 / 共8页
操作系统存储器管理_第3页
第3页 / 共8页
点击查看更多>>
资源描述
存储器管理(固定分区、可变分区与分页式分配算法)一、目的本课题实验的目的是,使学生实验存储器管理系统的设计方法;加深对所学各种存储器管理方案的了解;要求采用一些常用的存储器分配算法,设计一个存储器管理模拟系统并调试运行。二、实验内容模拟固定分区分内存的动态分配和回收,并编程实现。三、要求及提示(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 0void InitCSolid( );void ExitSolid();int MallocArea(int nSize,char* sName);/申请一个分区函数int FreeArea(char *sName); /释放一个分区函数void ShowArea( );/显示所有分区状态函数struct Solid /每分区作业的数据结构 char *pmem; /每分区内存的起始地址 int size; / 每分区的大小 int useSize; /已使用大小,若为0 ,表示此分区尚未使用 char jobName20; /此分区的作业(进程)名;int nSizes4;/共4种分区,每种分区的大小为 8k,16k,32k,64k ,每K为1024字节char *pmems; /起始分区内存地址Solid *psolids; int snum; /定义总的内存分区数int main( ) int jobCount=1; /已申请的作业个数 char str100; char jobName14; int nSize; /申请的作业大小InitCSolid( ); /初始化数据while(1) ShowArea( ); /显示内存的分配与使用情况 printf( 固定分区内存管理n x退出 1申请内存 2释放内存n); scanf(%s,str); if(strlen(str)!=1) continue; if(str0=x | str0=X) break; /退出 if(str0=1) /申请内存 while(1) printf(请输入申请内存的大小 (按x退出,按0返回上一级): );scanf(%s,str);if(strlen(str)=1) if(str0=x | str0=X) goto exit; / 退出 if(str0=0)break; /返回上一级 nSize=atoi(str);/获取申请的内存大小 (atoi函数功能为字符串转换成数字类型) if(nSizesnum=sNum; int i,ntotalSize=0; snum=10; /总共分成10分区 psolids=(Solid *)malloc(sizeof(Solid)*snum); /new Solidsnum;/申请堆内存 nSizes0=8192;nSizes1=16384;nSizes2=32768;nSizes3=65536; /nSizes4=165536; psolids0.size=nSizes0; psolids0.useSize=0; /其中8K分区4块 ,并设置其大小与使用标志为0, 表示未使用 psolids1.size=nSizes0; psolids1.useSize=0; psolids2.size=nSizes0; psolids2.useSize=0; psolids3.size=nSizes0; psolids3.useSize=0; psolids4.size=nSizes1; psolids4.useSize=0; /其中16K分区3块 psolids5.size=nSizes1; psolids5.useSize=0; psolids6.size=nSizes1; psolids6.useSize=0; psolids7.size=nSizes2; psolids7.useSize=0;/其中32K分区2块 psolids8.size=nSizes2; psolids8.useSize=0; psolids9.size=nSizes3; psolids9.useSize=0; /其中64K分区1块 for(i=0;isnum;i+) ntotalSize+=psolidsi.size; /获取总的内存大小 pmems=(char *)malloc(ntotalSize); psolids0.pmem=pmems; /设置每分区的起始地址 for(i=1;isnum;i+) psolidsi.pmem=psolidsi-1.pmem +psolidsi-1.size; void ExitSolid() /释放 / delete psolids; free(psolids);/释放内存free(pmems); /申请内存函数 ,参数nrSize为要申请的内存大小 ,参数sName为申请的作业名称,申请成功返回TRUE, 否则返回FALSEint MallocArea(int nrSize,char *sName)int i;for(i=0;inSizesi) continue; /根据要申请的nrSize内存大小,判断落在哪个分区(8k,16k,32k,64k分区) break;if(i=4) return false; /申请的nrSize内存 太大,没有大内存分配int n=i; /记住要分配的分区 /循环查找可用分区for(i=0;isnum;i+) if(psolidsi.sizenSizesn) /找出分区位置 continue;if(psolidsi.useSize!=0) /此分区块已分配出去否? continue; /是,寻找下一分区块psolidsi.useSize=nrSize; /否,分配此块分区strcpy(psolidsi.jobName,sName);/保存作业名break;if(i=snum) return FALSE; /申请不成功 return TRUE;/申请成功/根据作业名释放内存,找到作业名并成功释放返回TRUE ,否则返回FALSEint FreeArea(char *sName) int i; for(i=0;isnum;i+) if( strcmp(sName,psolidsi.jobName)=0) /是否由此作业名? if(psolidsi.useSize!=0) psolidsi.useSize=0; /是 ,释放内存,即设置此块分区为未使用 return TRUE; return FALSE;void ShowArea( )/显示int i=0;printf(n); for(i=0;isnum;i+) /循环显示每一块分区的状态if(psolidsi.useSize=0) /此分区块是否已使用 /否printf(空闲区间 起始地址%dK t内存大小%dKn, (psolidsi.pmem - psolids0.pmem)/1024 ,psolidsi.size/1024 );else /是printf(%s 起始地址%dK t内存大小%dK 已使用%dK%d字节n,psolidsi.jobName, (psolidsi.pmem - psolids0.pmem)/1024, psolidsi.size/1024,psolidsi.useSize/1024,psolidsi.useSize%1024 );printf(n);
展开阅读全文
相关资源
相关搜索

最新文档


当前位置:首页 > 建筑环境 > 建筑资料


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!