文档库 最新最全的文档下载
当前位置:文档库 › 操作系统内存管理模拟系统的实现完整版

操作系统内存管理模拟系统的实现完整版

操作系统内存管理模拟系统的实现完整版
操作系统内存管理模拟系统的实现完整版

操作系统内存管理模拟

系统的实现

HUA system office room 【HUA16H-TTMS2A-HUAS8Q8-HUAH1688】

摘要

操作系统的内存管理是指系统软件对其他应用程序使用内存时所作的管理,是一种统筹关系。本设计采用活动分区方案,但不采用紧凑算法。假设系统内存容量为100KB。能处理内存回收的时候上下邻合并的问题;对随机出现的进程i申请jKB内存,程序能判断是否能分配;释放随机的首地址为Handle的内存块;同时输出内存使用情况和空闲情况。

关键字:内存资源;分配;存储管理;回收

目录

1 概述 (5)

1.1设计任务 (5)

1.2 设计思想 (5)

1.3 基础知识 (5)

2 各模块伪码算法 (7)

2.1主程序 (7)

2.2 创建进程模块 (9)

2.3 进程信息模块 (11)

2.4 进程申请模块 (12)

2.5 分区创建模块 (13)

2.6 内存分配模块 (15)

2.7 低级调度模块 (17)

3函数关系调用图 (19)

4测试结果 (20)

4.1 主界面调试结果 (20)

4.2 创建进程调试结果 (21)

4.3 进程信息调试结果 (22)

4.4 进程申请调试结果 (23)

4.5 分区创建调试结果 (24)

4.6 内存分配调试结果 (25)

4.7 内存回收调试结果 (26)

4.8 打印分区调试结果 (27)

4.9 低级调度调试结果 (28)

5源程序 (29)

6总结 (68)

参考文献 (69)

致谢 (70)

摘要

操作系统的内存管理是指系统软件对其他应用程序使用内存时所作的管理,是一种统筹关系。本设计采用活动分区方案,但不采用紧凑算法。假设系统内存容量为100KB。能处理内存回收的时候上下邻合并的问题;对随机出现的进程i申请jKB内存,程序能判断是否能分配;释放随机的首地址为Handle的内存块;同时输出内存使用情况和空闲情况。

关键字:内存资源;分配;存储管理;回收

1 概述

1.1设计任务

应用内存管理实现内存管理的分配和回收。能处理内存回收的时候上下邻合并的问题以及输出内存使用情况和空闲情况。

采用活动分区方案,但不采用紧凑算法。假设系统内存容量为100KB。要能处理内存回收的时候上下邻合并的问题;对随机出现的进程i申请jKB内存,程序能判断是否能分配;释放随机的首地址为Handle的内存块;要求输出内存使用情况和空闲情况。

根据给定的动态分区分配算法流程图,用熟悉的计算机编程语言编写一程序,该程序实现内存的合理分配后回收。

1.2 设计思想

通过本次课程设计,学习如何进行内存的分区管理,强化了对首次适应分配算法和分区回收算法的理解。此课设需要随机产生进程或者由用户输入进程相应信息,实现动态内存管理:设计主界面以灵活选择某算法。主要实现的算法有:首次适应算法、最佳适应算法、最坏适应算法和循环适应算法。实现的主要功能有:创建进程,查看进程信息,进程申请,分区创建,内存分配,内存回收,打印分区,低级调度等。

分析设计要求,根据老师给出的要求,我们需创建进程和分区,然后申请进程,然后再进行内存的分配与回收。

1.3 基础知识

内存是现代计算机系统运转的核心.内存由一大片连续的字或字节组成,每个字或字节都有自己的地址,CPU根据程序计数器的值从内存中取出指令,而取出的指令可能引发额外的操作,例如读取或存储特定的内存地址.举个例子,一个典型的指令执行周期如下:首先从内存中读取一条指令,然后解码这条指令,解码时可能会从内存中读取这条指令(例如间接地址运算)的操作数(operand),当这条指令完成对操作数的运算后,运算结果可能被存储到内存中.

2 各模块伪码算法

图2.1为总体结构流程图

2.1主程序

主函数既是程序的入口,又是程序的出口,通常我们还可以指定一个exit code再退出,以表明程序最后的结果是什么样的。由于主函数肩负着入口和出口的重任,所以最好不要把太多的细节方面的逻辑直接放在主函数内,这样不利于维护和扩展。主函数应该尽量简洁,具体的实现细节应该封装到被调用的子函数里面去。此主函数中包括很多功能模块,其中各功能模块用菜单方式选择,为我们提供了九个功能选项。如图2.1所示

2.2 创建进程模块

进程的创建也就有两种方式:一是由操作系统创建,二是由父进程创建。在系统启动时,操作系统会创建一些进程,他们承担着管理和分配系统资源的任务,这些进程通常被称为系统进程。系统允许一个进程创建新进程,新进程即为子进程,子进程还可以创建新的子进程,形成进程树结构。此创建进程模块可以输入自己想创建的进程数进而实现进程创建。如图2.2所示

图2.2 创建进程流程图

cout<<"输入进程数目:";cin>>ProcessNum;

tapplyIndex=new in[ProcessNum];初始化进程申请队列

assignPointer=new int[ProcessNum];//初始化进程分配队列

maxApplyNum=ProcessNum;

pro=randomCreatPro(ProcessNum);创建成功

2.3 进程信息模块

进程又称任务,是一个动态的使用系统资源、处于活动状态的应用程序。进程的管理由进程控制块PCB、进程调度、中断管理、任务队列等组成,它是linux文件系统、存储管理、设备管理和驱动程序的基础。进程控制块PCB中包含了进程的所有信息,主要包括进程PID、进程所占有的内存区域、文件描述符和进程环境等信息。如图2.3所示

图2.3 进程信息流程图

Ifpro==NULL

return ERROR

Forint i=0;i

Ifpro->status==0

cout<<"创建"

else if pro->status==1//进程状态

cout<<"执行"

}else ifpro->status==-1

}else ifpro->status==2

cout<<"就绪"

}else ifpro->status==-2

cout<<"未就绪"

cout<

}

pro-=ProcessNum

创建成功

end

2.4 进程申请模块

图2.4 进程申请模块图

进程申请模块实现进程申请进入分区,但实现进程申请的进程必须先被创建。实现根据输入进程申请的个数,判断进程是否可以进入内存,修改进程状态。申请进程,可以先输入申请进程的数目,进而查看申请进程的信息。如图2.4所示

nt applyProcessNum=0;//每次申请进程数目

nt maxApplyNum=0;//最大可申请数目

int *applyIndex=NULL;//申请进程队列

int totalApplyNum=0;//申请总数

int *assignPointer=NULL;//已分配内存的进程队

2.5 分区创建模块

创建分区之前首先要确定准备创建的分区类型。有三种分区类型,它们是“主分区”、“扩展分区”和“逻辑分区”。主分区是指直接建立在硬盘上、一般用于安装及启动操作系统的分区。由于分区表的限制,一个硬盘上最多只能建立四个主分区,或三个主分区和一个扩展分区;扩展分区是指专门用于包含逻辑分区的一种特殊主分区。可以在扩展分区内建立若干个逻辑分区;逻辑分区是指建立于扩展分区内部的分区。没有数量限制。如图2.5所示

begin

Node p

if(head==NULL){

Cout分区未创建,请先创建分区ndl

return ERROR

else

p=head->next

cout.fill(' ')

Whilep!=NULL

cout.width(3)

cout分区的大小

p=p->next;}

return 创建成功

end

2.6 内存分配模块

常见内存分配算法如下:首次适应算法,从空闲分区链首开始查找。循环适应算法,从上次找到的空闲分区开始查找。最佳适应算法,是最小的空闲分区分配给作业。最差适应算法,最差适应算法中,该算法按大小递减的顺序形成空闲区链,内存分配,第一次分配,从头结点开始,其他重上次分配的节点开始,然后从分配资源的进程开始分配,若分配的进程进已分配进程队列,则申请进程的偏移指针回首址,修改分配数。如图2.6所示

伪代码

Node p=head->next

返回最大空闲结点

计数 count

if(p==NULL) 则

cout 空闲链表不存在

否则 do{

if(p->status==0) 则

Cout++

if(count==1) 则 p=q

否则 if(p->subarea.subareaSize>q->subarea.subareaSize)

图2.6内存分配模块流程图

2.7 低级调度模块

低级调度又称为进程调度、短程调度,它决定就绪队列中的哪个进程将获得处理机,然后由分派程序执行把处理机分配给该进程的操作。在批处理,分时,实时三类系统中,进程调度必须被配置,因而是一种最基本的调度。与中级调度——交换,高级调度——作业调度相对应。低级调度的功能:保存处理机的现场信息。按某种算法选取进程。把处理器分配给进程。如图2.7所示

图2.7低级调度模块流程图

相关文档