操作系统课程设计报告-内存管理

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

设计1 题目内存管理

一、问题描述与分析

1、虚拟存储技术

为了扩充内存容量,同时避免增加系统成本以及机器自身的限制,因此采取从逻辑上扩充内存容量的方法,即虚拟存储技术。

2、解决方法

程序运行之前,仅将当前需要运行的少数页面先装入内存便可继续运行,其余部分暂存在盘上。程序运行时,如果他所要访问的页面已调入内存,便可继续执行下去;但如果程序所要访问的页面尚未调入内存,此时程序应利用OS提供的请求调页功能,将他们调入内存,以是进程能继续执行下去。如果此时内存已满,无法再装入新的页面,则还需在利用页面的置换功能,将内存中暂时不用的页面调至盘上,腾出足够的内存空间,再将要访问的页面调入内存,使程序继续执行下去。

二、设计要求和目的

1、设计目的

在本课程设计中,通过对“请求分页存储管理方式”中“页面置换算法”的模拟实现,进一步了解虚拟存储的特点,掌握请求分页存储管理的页面置换算法、

2、设计要求

模拟页面置换设计中,分别利用最佳置换算法(OPT)、最近最久未使用置换算法(LUR)、先进先出置换算法(FIFO)。需要提供一定数量的页面序列,这些页面序列为了减少人工输入的麻烦,而采用随机产生。在执行程序时,只要改变页面的大小,就可以达到不用的页面序列。同时,记录页面置换次数,最后计算并输出OPT、LUR、FIFO 算法在不用页面数量下的缺页率。

三、背景知识

在学习了操作系统这本书之后,了解到:

为了扩充内存容量,采取虚拟存储技术,其中的核心思想就是从逻辑上扩充内存容量。所谓虚拟存储器,是指具有请求调入功能和置换功能,能从逻辑上对内存容量加以扩充的一种存储器系统。

在虚拟存储器中,允许讲一个作业分多次调入内存,因此虚拟内存气的实现都毫无例外的建立在离散分配的存储器方式的基础上。于是采用了分页请求系统来实现。即,增加了请求调页和页面置换功能的所形成的页面虚拟存储系统。

分页请求系统,它允许只装入少数页面的程序及数据,先启动运行。以后再通过调页功能及页面置换功能,陆续的把即将要运行的页面调入内存,同时把暂不运行的页面换出到外存上。置换时以页面为单位。为了能实现请求调页和置换功能,系统必须提供相应的硬件和软件支持。

硬件支持包括:请求分页的页表机制、缺页中断机构、地址变换机构。

软件支持在这里包括有用于实现请求调页的软件和实现页面置换的软件。他们在硬件的支持下,将程序正在运行时所需要的页面调入内存,再将内存中暂时不用的页面从内存置换到硬盘上。

在进程运行过程中,若其所要访问的页面不在内存而要把他们调入内存,但内存已无空闲空间时,为了保证该进程能正常运行,系统必须从内存中调出一页程序或数据送磁盘的对换区中,但应将哪个页面调出,需根据一定的算法来确定。

置换算法的好坏,将直接影响到系统的性能。一个好的页面置换算法,应具有较低的页面更换频率,从理论上讲,应将那些以后不再会访问的页面换出,或把那些在较长时间内不会在访问的页面调出。

四、概要设计

根据三种不同的置换算法,依据其不同的算法方式、算法思想,分别计算该算法在不同情况下的缺页率,并显示各页面的变化情况。

对于该课程设计中模拟的请求分页存储管理的页面置换过程,只要掌握其中最基本的三种算法,包括FIFO、LRU及OPT。同时要求产生随机序列。

在下图的主模块设计图中,只注重描绘了分页存储管理的三种主要算法,未描绘出细节部分。其中,在执行每种算法时都会要求输入你所需要的访问串长度以及不同内存容量(物理块数),如此就可以得出不同的缺页率。

请求分页存储管理的主模块设计图

五、详细设计

1、算法原理分析

OPT算法是一种理论上的算法。所选择的被淘汰的页面是未来最远出现,当当前内存中没有正要访问的页面时,置换出当前页面中在未来的访问页中最远出现的页面或再也不出现的页面。采取OPT算法,通常可保证获得最低的缺页率。

LRU算法是根据页面调入内存后的使用情况进行决策的。所选择的被淘汰的页面是最近最久未使用,当当前内存中没有正要访问的页面时,置换出在当前页面中最近最久没有使用的页面。

FIFO算法是最早出现的置换算法。该算法总是淘汰最先进入内存的页面,即选择在内存中驻留时间最久的页面进行淘汰。当当前内存中没有正要访问的页面时,置换出最先进来的页面。

2、核心代码

1)OPT算法:

private void opt(){ //理想型

int pos[] = new int[10];

int flag[] = new int[10];

boolean S = true;

while(S){

flag1=flag2=0;

for(int i = 0;i < length; i++){

if(!search(order[i])){

count++;

//result1[i]='*';

if(a[num_page-1]!=-1){ //表示当前页面已满要淘汰一个

for(int j=0 ;j<10; j++)

pos[j] = -1;

for(int j=0;j<10;j++)

flag[j] = 0;

for(int j=i;j

{

for(int k=0;k

{

if(order[j]==a[k]&&flag[k]==0)

{

pos[k]=j;

flag[k]=1;

}

}

}

int max=-10,max_pos = 0;

for(int k=0;k

{

if(pos[k]==-1)//未出现则跳出,替换该值

{

max_pos=k;

S = false;

break;

}

else if(max

{

max=pos[k];

max_pos=k;

}

}

a[max_pos]=order[i];

}

相关文档
最新文档