存储器管理课程设计.docx

上传人:b****6 文档编号:16626075 上传时间:2023-07-15 格式:DOCX 页数:27 大小:611.93KB
下载 相关 举报
存储器管理课程设计.docx_第1页
第1页 / 共27页
存储器管理课程设计.docx_第2页
第2页 / 共27页
存储器管理课程设计.docx_第3页
第3页 / 共27页
存储器管理课程设计.docx_第4页
第4页 / 共27页
存储器管理课程设计.docx_第5页
第5页 / 共27页
存储器管理课程设计.docx_第6页
第6页 / 共27页
存储器管理课程设计.docx_第7页
第7页 / 共27页
存储器管理课程设计.docx_第8页
第8页 / 共27页
存储器管理课程设计.docx_第9页
第9页 / 共27页
存储器管理课程设计.docx_第10页
第10页 / 共27页
存储器管理课程设计.docx_第11页
第11页 / 共27页
存储器管理课程设计.docx_第12页
第12页 / 共27页
存储器管理课程设计.docx_第13页
第13页 / 共27页
存储器管理课程设计.docx_第14页
第14页 / 共27页
存储器管理课程设计.docx_第15页
第15页 / 共27页
存储器管理课程设计.docx_第16页
第16页 / 共27页
存储器管理课程设计.docx_第17页
第17页 / 共27页
存储器管理课程设计.docx_第18页
第18页 / 共27页
存储器管理课程设计.docx_第19页
第19页 / 共27页
存储器管理课程设计.docx_第20页
第20页 / 共27页
亲,该文档总共27页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

存储器管理课程设计.docx

《存储器管理课程设计.docx》由会员分享,可在线阅读,更多相关《存储器管理课程设计.docx(27页珍藏版)》请在冰点文库上搜索。

存储器管理课程设计.docx

存储器管理课程设计

 

存储器管理课程设计

课程设计报告

 

课程:

操作系统

学号:

03

姓名:

班级:

计算机科学与技术08本科师范

教师:

殷荣庆

时间:

2010年12月28日

 

计算机科学与技术系

 

设计名称:

存储器管理

日期:

2010年12月28日

设计内容:

存储器是计算机系统的重要组成部分。

近年来,存储器的容量虽然一直在不断扩大,但仍然不能满足现代软件发展的需要,因此,存储器仍然是一种宝贵而紧俏的资源。

如何对它加以有效的管理,不仅直接影响到存储器的利用率,而且还对系统性能有很大影响。

页面置换算法是虚拟存储管理实现的关键,通过本次课程设计,我们能够理解页面是换算法的机制,在模拟实现FIFO,LRU,NRU和OPT几种经典页面置换算法的基础上,比较各种置换算法的效率以及优点,从而了解虚拟存储实现的过程。

对比下列几种算法的命中率:

(1)先进先出算法(FirstinFirstOut,FIFO)。

(2)最近最少使用的算法(LeastRecentlyUsed,LRU)。

(3)最近未使用算法(NeverUsedRecently,NUR)。

(4)最佳置换算法(OptimalReplacement,OPT)。

设计目的与要求:

1、设计目的:

本次课程设计主要为了了解内存的各种管理方式,要求掌握分区式、页式、段式、段页式存储管理方式,以及虚拟存储器的基本概念和请求调页、请求调段存储管理方式。

明白一些基本概念和计算机的相关工作方式,如:

处理机调度的基本概念、调度算法、实时调度、多处理机系统中的调度、死锁的基本概念、处理死锁的基本方法。

通过动态优先权算法的模拟加深对进程概念和进程调度过程的理解。

重点研究一下四点内容:

(1)理解内存页面调度的机理。

(2)掌握几种理论页面置换算法的实现方法。

(3)了解HASH表数据结构的使用。

(4)通过具体的上级操作与数据对比,比较各种各种调度算法的优劣。

2、设计要求:

自己编写代码,用各种不同的调度算法(先进先出算法、最近最少使用的算法、最近未使用算法、最佳置换算法)让计算机调度,计算出各种算法得出的命中率,根据计算机给出的命中率统计数据,比较各种调度算法的优劣。

课程设计报告中要给出计算机统计出来的各种算法命中率的数据,然后说明对数据的具体分析步骤,最后总结出各种调度算法的优劣。

设计环境或器材、原理与说明:

一、设计环境:

windowsxp操作系统、虚拟机、红帽Linux操作系统。

二、设计器材:

微型计算机

三、设计原理:

下面分别叙述各种页面调度机制的原理:

1:

FIFO页面置换算法:

原理简述:

(1)在分配内存页面数(AP)小于进程页面数(PP)时,当然是最先运行的AP个页面放入内存。

(2)这时有需要处理的新页面,则将原来在内存中的AP个页面中最先进入的调出。

(所以成为FIFO),然后将新页面放入。

(3)以后如果再有新页面需要调入,则都按

(2)的规则进行。

算法特点:

所使用的内存页面构成一个队列。

图标描述:

假设某个进程在硬盘上被划为5个页面(PP=5),以1,2,3,4,5分别表示,处理机调度他们的顺序(这取决于进程的本身)为:

1,4,2,5,3,3,2,4,2,5.

如果内存可以控制的页面数位3(AP=3),那么在使用FIFO算法时,这三个页面的内存使用情况如图所示:

 

队列第1位

1

4

2

5

3

3

3

4

2

5

队列第2位

1

4

2

5

5

5

3

4

2

队列第3位

1

4

2

2

2

5

3

4

 

不难看出本例子共患处页面8次,若用变量diseffect表示页面换入的次数,则diseffect=8.

算法实现提示:

要得到命中率,必须应该有一个常熟total_instructrion来记录页面总共使用的次数;此处需要一个变量记录总共换入页面的次数(需要换出页面,总是因为缺页中断而产生)diseffect.。

(1)初始化。

设置两个数组page[ap]和pagecontrol[pp]分别表示进程页面数和内存分配的页面数,并产生一个随机数序列main[total_instruction](当然这个序列由page[]的下标随机构成),表示待处理的进程页面序列,diseffect置零。

(2)看main[]中是否有下一个元素,有就由main[]中获取该页面下标,并转到(3);没有就转到(7)。

(3)如果该page页已经在内存中,就转到

(2);否则就转到(4),同时未命中的diseffect加1.

(4)观察pagecontrol是否占满,如果占满需将使用队列((6)中建立的)中最先进入的(就是队列的第一个单元)pagecontrol单元清干净,同时将对应的page[]单元置为不在内存中。

(5)将该page[]与pagecontrol[]建立关系(可以改变pagecontrol.[]的标示位,也可以采用指针连接,总之至少要使对应的pagecontrol单元包含连个信息;一是他被使用了,二是哪个page[]单元使用的;page[]页包含两个信息;对应的pagecontrol单元号、本page[]单元已经在内存中。

(6)将用到的pagecontrol置入使用队列(这里的队列当然是一种先进先出的数据结构了,而不是泛指),返回

(2)。

(7)显示结果。

2、LRY页面置换算法:

原理简述:

(1)当分配内存页面数(AP)小于进程页面数(PP)时候,当然把最先执行的AP个页面放入内存。

(2)当需要调页面进入内存,而当前分配的内存页面全部不空闲时,选择将其中最长时间没有用到的那个页面调出,以空出内存来放置新调入的页面(称为LRU)

算法特点:

每个页面都有属性来表示有多长时间未被CPU使用的信息。

图标描述:

为了便于比较,我采用的例子和前面的一样。

某进程在硬盘上被化为5个页面,用1,2,3,4,5表示,处理机处理他们的顺序为:

“1,2,4,2,5,3,3,2,4,2,5.

而内存可以控制的页面数为3(AP=3),那么在使用LRU算法时候,这三个页面的内存使用情况如图所示:

最近1步使用

1

4

2

5

3

3

2

4

2

5

最近2步使用

1

4

2

5

5

3

2

4

2

最近3步使用

1

4

2

2

5

3

3

4

 

不难看出页面换入次数为7次,diseffect=7。

算法实现提示:

与前述算法一样,只有先得到diseffect才能获得最终的命中率。

(1)初始化。

主要是进出页面page[]和分配的内存页面pagecontrol[],同时产生随机序列main[],diseffect置零。

(2)看序列main[]是否有下一个元素,如果有就从main[]获取该page[]的下标,并转到(3);没有就转到(6)。

(3)如果该page[]单元在内存中便改变页面属性,使他保留最近使用的信息,转到

(2);否则转到(4),同时diseffect加

(1)。

(4)判断是否有空闲内存页面,如果有就返回页面指针,转到(5);否则在内存页面中找出最长时间没有使用的页面,将其清干净,并返回该页面指针。

(5)如果需要处理的page[]与(4)中得到的pagecontrol[]之间建立连接,同时应该让对应page[]单元保存最近使用的信息,返回

(2)。

(6)如果序列处理完成,就输出结果。

 

3、NUR页面置换算法:

原理简述:

所谓“最近未使用”首先是要对“近”作一个界定,比如CLEAR_PERIOD=50,便是指在CPU最近的50次进程页面处理工作中,都没有处理到的页面;那么可能会有以下几种情况。

(1)如果这样的页面只有一个,就将其换出,放入需要处理的新页面。

(2)如果有不止一个这样的页面,就在这些页面中任取一个换出(可以是下标最小的,或者是下标最大的),放入需要处理的页面。

(3)如果没有这样的一个页面,就随意换出一个页面(可以是下标最小的,也可以是下标最大的)。

算法特点:

有一个循环周期,每到达这个周期,所有的页面存放是否被CPU处理的信息的属性均被至于初始态(没有被访问)。

图标描述:

还是用前面的例子,某进程在硬盘上被划为5个页面,用1,2,3,4,5表示,而处理机处理他们的顺序为:

1,4,2,5,3,3,2,4,2,5.

而内存可以控制的页面数为3(AP=3),CLEAR_PERIOD取5;循环周期内如果所有内存页面均被CPU处理或者多个页面未被CPU处理,取页码最小的页面换出。

算法实现过程如下:

内存页1号

1

1

1

5

3

3

3

3

3

5

内存页2号

4

4

4

4

4

4

4

4

4

内存页3号

2

2

2

2

2

2

2

2

 

显示页面交换共6次,diseffect=6。

算法实现提示:

(1)初始化。

设置连个数组page[ap]和pagecontrol[pp]分别表示进程页面和内存分配的页面,并产生一个随机数序列main[total_instruction](当然这个序列由page[]的下标随机构成),表示待处理进程页面序列,diseffect置零,设定循环周期CLEZAR_PERIOD。

(2)看main[]是否有下一个元素,如果有,就从main[]中获得一个CPU将处理页面的序号;如果没有就转到(8)。

(3)如果待处理页面在内存中,就转到

(2);否则diseffect加

(1),并转到(4)。

(4)看是否有空闲页面存在,如果有,返回空闲页面内存指针,并转到(5);否则,在所有没有被访问且位于内存中的页面中按任意规则(或则取最近的一个页面;或者取下标最小的一个)取出一个,返回清空后的内存页面指针。

(5)在待处理进程页面与内存页面之间建立一个联系,并标注该页被访问。

(6)如果CPU业已处理了CLEAR_PERIOD个页面,就将所有页面设置为未访问。

(7)返回

(2)。

(8)如果CPU所有处理工作完成,就返回结果。

4、OPT页面置换算法:

原理简述:

讨论该算法的前提还是在分配给进程的内存页面不满足其所有逻辑页面的情况下进行。

所谓的最佳置换算法是一种理想状态下的算法,它要求先遍历所有的CPU待处理的进程页面序列(实际上由于待处理的页面有时取决于先前处理的页面,所以在很多情况下不可能得到完整的待处理页面序列。

在这个层面上才能说该算法是理想的),在这些页面中,如果有些已经在内存当中,而CPU不再处理的,就将其换出;而有些页面在内存中,并且CPU即将处理,就从当前位置算起,取最后才处理到的页面,将其换出,例如CPU待处理的页面序列为:

 

1

3

2

2

4

5

2

5

1

4

3

4

1

1

5

5

3

4

2

1

已经处理了5个页面(底纹为灰色),那么页面5是第一个待处理的页面;2是第二个;1是第四个;4是第五个;3是第六个。

这时如要将页面5调入内存,而在已经调入内存的1,3,2,4号页面中,页面3才上最后被处理的页面,因此将选择页面3换出。

图表描述:

还是用前面的例子,某进程在硬盘上被划分为5个页面,用1,2,3,4,5表示,而处理机处理他们的顺序为:

1,4,2,5,3,3,2,4,2,5.

而内存可以控制的页面数为3(AP=3),如果所示:

内存页1号

1

1

1

5

3

3

3

3

3

5

内存页2号

4

4

4

4

4

4

4

4

4

内存页3号

2

2

2

2

2

2

2

2

 

共发生页面交换6次,diseffect=6。

算法实现提示:

为了简易地实现OPT算法,可以为每个进程页面设置一个间隔属性cDistance表示CPU将在第几部处理该页面,如果页面不再被CPU处理,可以被设置为某个很大的值(例如32767),这样每次换出的就是page[ap]和pagecontrol[pp]分别表示内存页面数和内存分配的页面数,并产生一个随机数序列main[total_instruction](当然这个序列由page[]的下标随机构成),表示待处理的进程页面序列,diseffect置零。

然后扫描整个页面访问序列,对vDistance[TOTAL_VP]数组进行赋值,表示该页面将在第几步进行处理。

(2)看main[]是否有下一个元素,有,就从序列main[]中获取一个CPU待处理的页面号;没有,就转到(6)。

(3)如果该页面已经在内存中了,就转到

(2);否则转到(4)。

(4)看是否有空闲的页面存在,如果有就直接返回该页面指针;如果没有遍历所有未处理的进程页面序列,如果有位于内存中的页面,而以后CPU不再处理的,首先将其换出,返回页面指针;如果没有这样的页面,寻找出CPU最晚处理的页面,将其换出,返回该内存页面指针。

(5)在内存页面和待处理的进程页面之间建立联系,返回

(2)。

(6)输出结果。

结束。

四、说明:

相关概念阐述:

(1)调页策略:

系统将进程所需页面调入内存的同时,将其相邻的几个页面也调入内存。

进程发现所需页面不在内存时发出请求,由系统将缺页调入。

系统要是发现有足够的对换区空间,则全部从对换区调入所需页面。

如果系统缺少足够的对换区空间,凡是不会被修改的文件,直接从文件区调入;对可能修改的部分,换出到对换区,需要时再从对换区调入。

(2)UNIX的页面调入方式:

凡是未运行过的页面都从文件区调入,运行过的页面换出到对换区,需要时再从对换区调入。

(3)页面调入过程:

程序向CPU发出缺页中断请求,保留CPU环境,分析中断原因,执行缺页中断处理程序,查页表得缺页在外存的物理地址,若内存未满,则调入缺页并修改页表,选择一页换出,换出的页已被修改还需写入磁盘,再将缺页调入并修改页表,最后,利用修改后的页表进行地址变换。

(4)最佳置换算法(OPT):

选择以后不再使用或最久才使用的页面换出。

(5)先进先出页面置换算法(FIFO):

淘汰最先进入内存的页面

(6)最近最久未使用置换算法(LRU):

LRU置换算法的描述:

选择最近最久未使用的页面淘汰。

每个页面赋予一个访问字段,记录页面自上一次访问以来所经历的时间t,淘汰t值最大的页面。

(7)其它置换算法:

最少使用置换算法(LFU):

淘汰最近一段时间内使用次数最少的页面。

每个页面设置一移位寄存器,页面被访问时寄存器最高位置1,每隔一定时间寄存器右移一次,淘汰寄存器值最小的页面。

这种算法并不能真正反映页面使用的次数,因为,在一段时间内页被访问一次和被访问1000次是等效的。

(8)页面缓冲算法:

采用可变分配和局部置换,置换用算法FIFO,淘汰的页被放入内存两个链表中的一个,若淘汰页未修改,放入空闲页面链表,若淘汰页已修改,放入已修改页面的链表,当被修改页面达到一定数量时,将其一起写回磁盘。

(9)缺段中断机构:

当进程要访问的段不在内存时,产生缺段中断,由缺段中断处理程序将缺段调入内存。

有用页面交换机制的操作系统总是把当前进程中急需处理的部分页面换入到内存当中,而把更多暂时不需要处理的页面放置在外村当中。

由于进程需要处理的页面顺序不同,因此必须要在内存与外存之间进行页面交换,交换算法也就应运而生。

设计过程(步骤)或程序代码(可以加页):

一、设计过程:

打开计算机进入windowsxp操作系统,然后启动虚拟机,进入redhat的Linux操作系统,导入光盘镜像文件,将其复制到根目录下后打开终端,输入编译代码命令“g++-omain”对源程序进行编译,然后输入执行命令代码“./main”执行程序。

为了保证数据的科学性、准确性,减少偶然因素对实验结果产生的影响,就必须设置多组数值进行验算、分析结果,最后才能总结出结论。

因此在本次课程设计中,我将主函数中for(i=4;i<=N;i++)语句中的N取三个不同的值,分别为18、24和32,表示分别给程序分配18、24和32个页面,这样就可以得到三组不同的命中率数据,将三组数据进行比较,就能很容易地验证正确性,归纳出各种算法的优劣并总结出页面数的差别对命中率的影响。

说明:

改程序是用C++编写的,所以用g++编译。

程序中的循环控制变量从4到32是分别针对多种页面的分配情况对以上算法进行演示。

 

二、程序代码;

1、模块:

#ifndef_page_h

#define_page_h

classcpage

{public:

intm_npagenumber,

m_npagefacenumber,

m_ncounter,

m_ntime;

};

#endif

 

2、模块:

#ifndef_pagecontrol_h

#define_pagecontrol_h

classcpagecontrol{

public:

intm_npagenumber,m_npagefacenumber;

classcpagecontrol*m_pnext;

};

#endif

 

3、模块:

#ifndef_memory_h

#define_memory_h

classcmemory

{public:

cmemory();

voidinitialize(constintntotal_pf);

voidfifo(constintntotal_pf);

voidlru(constintntotal_pf);

voidnur(constintntotal_pf);

voidopt(constintntotal_pf);

private:

vector_vdiscpages;

vector_vmemorypages;

cpagecontrol*_pfreepf_head,*_pbusypf_head,*_pbusypf_tail;

vector_vmain,_vpage,_voffset;

int_ndiseffect;

};

cmemory:

:

cmemory():

_vdiscpages(total_vp),

_vmemorypages(total_vp),

_vmain(total_instruction),

_vpage(total_instruction),

_voffset(total_instruction){

ints,i,nrand;

srand(getpid()*10);

nrand=rand()%32767;

s=319*nrand/32767+1;

for(i=0;i<=total_instruction;i+=4)

{

_vmain[i]=s;

_vmain[i+1]=_vmain[i]+1;

nrand=rand()%32767;

_vmain[i+2]=_vmain[i]*nrand/32767;

_vmain[i+3]=_vmain[i+2]+1;

nrand=rand()%32767;

s=nrand*(318-_vmain[i+2])/32767+_vmain[i+2]+2;

}

for(i=0;i

{

_vpage[i]=_vmain[i]/10;

_voffset[i]=_vmain[i]%10;

_vpage[i]%=32;

}

}

voidcmemory:

:

initialize(constintntotal_pf){

intix;

_ndiseffect=0;

for(ix=0;ix<();ix++){

_vdiscpages[ix].m_npagenumber=ix;

_vdiscpages[ix].m_npagefacenumber=INVALID;

_vdiscpages[ix].m_ncounter=0;

_vdiscpages[ix].m_ntime=-1;

}

for(ix=1;ix

_vmemorypages[ix-1].m_pnext=&_vmemorypages[ix];

_vmemorypages[ix-1].m_npagefacenumber=ix-1;

}

_vmemorypages[ntotal_pf-1].m_pnext=NULL;

_vmemorypages[ntotal_pf-1].m_npagefacenumber=ntotal_pf-1;

_pfreepf_head=&_vmemorypages[0];

}

voidcmemory:

:

fifo(constintntotal_pf){

inti;

cpagecontrol*p;

initialize(ntotal_pf);

_pbusypf_head=_pbusypf_tail=NULL;

for(i=0;i

if(_vdiscpages[_vpage[i]].m_npagefacenumber==INVALID){

_ndiseffect+=1;

if(_pfreepf_head==NULL)

{

p=_pbusypf_head->m_pnext;

_vdiscpages[_pbusypf_head->m_npagenumber].m_npagefacenumber=INVALID;

_pfreepf_head=_pbusypf_head;

_pfreepf_head->m_pnext=NULL;

_pbusypf_head=p;

}

p=_pfreepf_head->m_pnext;

_pfreepf_head->m_pnext=NULL;

_pfreepf_head->m_npagenumber=_vpage[i];

_vdiscpages[_vpage[i]].m_npagefacenumber=_pfreepf_head->m_npagefacenumber;

if(_pbusypf_tail==NULL)

_pbusypf_head=_pbusypf_tail=_pfreepf_head;

else{

_pbusypf_tail->m_pnext=_pfreepf_head;

_pbusypf_tail=_pfreepf_head;

}

_pfreepf_head=p;

}

}

cout<<"FIFO:

"<<1-(float)_ndiseffect/320<<"\t";

}

voidcmemory:

:

lru(constintntotal_pf)

{inti,j,nmin,minj,npresenttime(0);

initialize(ntotal_pf);

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 自然科学 > 物理

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2