实验二 存储管理与页面置换算法报告
页面置换算法模拟实验报告材料

实验编号4名称页面置换算法模拟实验目的通过请求页式存储管理中页面置换算法模拟设计,以便:1、了解虚拟存储技术的特点2、掌握请求页式存储管理中页面置换算法实验内容与步骤设计一个虚拟存储区和内存工作区,并使用FIFO和LRU算法计算访问命中率。
<程序设计>先用srand()函数和rand()函数定义和产生指令序列,然后将指令序列变换成相应的页地址流,并针对不同的算法计算相应的命中率。
<程序1>#include <windows.h> //Windows版,随机函数需要,GetCurrentProcessId()需要//#include <stdlib.h>//Linux版,随机函数srand和rand需要#include <stdio.h> //printf()需要#define TRUE 1#define FALSE 0#define INV ALID -1#define NULL 0#define total_instruction 320 //共320条指令#define total_vp 32 //虚存页共32页#define clear_period 50 //访问次数清零周期typedef struct{//定义页表结构类型〔页面映射表PMT〕int pn, pfn, counter, time;//页号、页框号(块号)、一个周期内访问该页面的次数、访问时间}PMT;PMT pmt[32];typedef struct pfc_struct{//页面控制结构int pn, pfn;struct pfc_struct *next;}pfc_type;pfc_type pfc[32];pfc_type *freepf_head,*busypf_head,*busypf_tail;//空闲页头指针,忙页头指针,忙页尾指针int NoPageCount; //缺页次数int a[total_instruction];//指令流数组int page[total_instruction], offset[total_instruction];//每条指令的页和页内偏移void initialize( int );void FIFO( int );//先进先出void LRU( int );//最近最久未使用void NRU( int );//最近最不经常使用/****************************************************************************main()*****************************************************************************/ void main(){int i,s;//srand(10*getpid());//用进程号作为初始化随机数队列的种子//Linux版srand(10*GetCurrentProcessId());//用进程号作为初始化随机数的种子//Windows版s=rand()%320;//在[0,319]的指令地址之间随机选取一起点mfor(i=0;i<total_instruction;i+=4){//产生指令队列if(s<0||s>319){printf("when i==%d,error,s==%d\n",i,s);exit(0);}a[i]=s;//任意选一指令访问点m。
LRU页面置换算法的设计实验报告

return-1;
}
intfindReplace(intBsize)
{//查找应予置换的页面
intpos = 0;
for(inti=0; i<Bsize; i++)
if(block[i].timer >= block[pos].timer)
for(i=0;i<20;i++)
{
QString[i] = rand()%10 ;
}
cout<<"页面号引用串: ";
for(i=0;i<20;i++)
{
cout<<QString[i]<<" ";
}
cout<<endl<<"------------------------------------------------------"<<endl;
四、实验结果(含程序、数据记录及分析和实验总结等)
#include<iostream>
#include<string>
#include<stdlib.h>
#include<ctime>
usingnamespacestd;
constintBsize=10;
constintPsize=20;
structp
Bsize = 3;
Init(QString,Bsize);
cout<<"LRU算法结果如下:<<endl;
操作系统页面置换实验报告

实习三内存页面置换算法的设计一、实验目的实现最近最久未使用(LRU)置换算法为了提高内存利用率,提供了内外存进程对换机制,内存空间的分配和回收均以页为单位进行,一个进程只需将其一部分(段或页)调入内存便可运行,还支持请求调页的存储管理方式。
当进程在运行中需要访问某部分程序和数据时,发现其所在页面不在内存,就立即提出请求(向CPU发出缺中断),由系统将其所需页面调入内存。
这种页面调入方式叫请求调页。
当CPU接收到缺页中断信号,中断处理程序先保存现场,分析中断原因,转入缺页中断处理程序。
该程序通过查找页表,得到该页所在外存的物理块号。
如果此时内存未满,能容纳新页,则启动磁盘I/O将所缺之页调入内存,然后修改页表。
如果内存已满,则须按某种置换算法从内存中选出一页准备换出,是否重新写盘由页表的修改位决定,然后将缺页调入,修改页表。
利用修改后的页表,去形成所要访问数据的物理地址,再去访问内存数据。
整个页面的调入过程对用户是透明的。
本实习要求学生通过请求页式存储管理中页面置换算法模拟设计,了解虚拟存储技术的技术特点,掌握请求页式存储管理的页面置换算法。
二、实验环境VC++6.0 MFC三、实验内容为了提高内存利用率,提供了内外存进程对换机制,内存空间的分配和回收均以页为单位进行,一个进程只需将其一部分(段或页)调入内存便可运行,还支持请求调页的存储管理方式。
当进程在运行中需要访问某部分程序和数据时,发现其所在页面不在内存,就立即提出请求(向CPU发出缺中断),由系统将其所需页面调入内存。
这种页面调入方式叫请求调页。
当CPU接收到缺页中断信号,中断处理程序先保存现场,分析中断原因,转入缺页中断处理程序。
该程序通过查找页表,得到该页所在外存的物理块号。
如果此时内存未满,能容纳新页,则启动磁盘I/O将所缺之页调入内存,然后修改页表。
如果内存已满,则须按某种置换算法从内存中选出一页准备换出,是否重新写盘由页表的修改位决定,然后将缺页调入,修改页表。
存储管理实训报告

一、实训目的1. 通过本次实训,加深对存储管理方案的理解,掌握虚拟存储器的管理方式,熟悉虚存管理的各种页面淘汰算法。
2. 通过编写和调试地址转换过程的模拟程序,加强对地址转换过程的理解。
3. 培养编程能力和问题解决能力,提高实际操作水平。
二、实训环境1. 操作系统:Windows 102. 编程语言:C++3. 开发环境:Visual Studio 20194. 硬件配置:CPU:Intel Core i5,内存:8GB,硬盘:256GB SSD三、实训原理1. 虚拟存储器:虚拟存储器是一种将内存与外存相结合的存储管理技术,可以扩大程序可访问的存储空间。
2. 页面置换算法:页面置换算法是虚拟存储器中的一种内存管理技术,用于确定在内存中保留哪些页面,淘汰哪些页面。
3. 地址转换过程:地址转换过程是将逻辑地址转换为物理地址的过程。
四、实训内容1. 设计一个请求页式存储管理方案,并编写模拟程序实现。
2. 产生一个需要访问的指令地址流,其中50%的指令是顺序执行的,25%的指令均匀地散布在前地址部分,25%的地址是均匀地散布在后地址部分。
3. 指定内存页表的最大长度,并对页表进行初始化。
4. 每访问一个地址时,计算该地址所在的页的页号,然后查页表,判断该页是否在主存。
5. 如果该页已在主存,则打印页表情况;如果该页不在主存,则采用FIFO页面淘汰算法淘汰一页,并将该页在页表中抹去。
6. 编写代码实现上述功能,并进行测试。
五、实训过程1. 确定虚拟存储器的大小、内存大小、页面大小和页面置换算法。
2. 设计数据结构存储页面信息,包括页号、是否在内存中、是否被修改等。
3. 编写函数实现地址转换过程,包括计算页号、判断页是否在内存中等。
4. 编写FIFO页面淘汰算法,淘汰不在内存中的页面。
5. 编写测试程序,生成指令地址流,并调用相关函数进行测试。
六、实训结果1. 成功实现了请求页式存储管理方案,并编写了相应的模拟程序。
页面置换算法的模拟实现及命中率对比实验报告

页面置换算法的模拟实现及命中率对比实验报告-CAL-FENGHAI.-(YICAI)-Company One 1页面置换算法的模拟实现及命中率对比实验报告一、问题描述课程设计LI的(1)、通过请求页式管理方式中页面置换算法的模拟设计,了解虚拟存储术的特点,掌握请求页式存储管理中的页面置换算法。
(2)、课程设计内容模拟实现OFT (最佳置换)、FIFO和LRU算法,并计算命中率。
(3)、课程设计要求:a)首先用随机数生成函数产生“抬令”序列,然后将指令序列变换成相应的页地址流,再计算不同算法下的命中率。
b)通过随机数产生一个指令序列,共产生400条。
其中50%的指令是顺序执行的(灵位50%就是非顺序),且25%的指令分布在前半部分地址空间,25%的指令分布在后半部分地址空间。
c)将指令地址流变换成页地址流d)循环运行,使用户内存容量从4到40,。
计算每个内存容量下不同页面置换算法的命中率。
二、概要设计1.程序的数据结构:#def ine total_instruction 100 / * 指令流长*/ttdefine M 100 /* 实际页数*/#define N 5 //可用页面数struct Pro{int num, time;};int a[total_instructionj:int page[N];2.程序的主函数:int main(){Pro p[total_instruction];Pro *page=new Pro[N]; char c;int t二0, i;float n=0;Input(p);do{for( i=0; i<N; i++) //初试化页面基本悄况{page[i]・ num二T;page[i]・ time二2-i;}printff系统产生的随机数为:");for (int e二0;e〈M;e++) cout<<p[e].n“;cout<<endl;i 二0; cout«zz f:FIF0 页面置换,z«endl;cout«,,l:LRU 页面置换,,«endl;cout«"o:0PT 页面置换,,«endl;cout«"按其它键结束,,<<endl;cin>>c;辻(c二二'f J) //FIFO页面置换{n=0;cout«"页面置换惜况:"《endl;while( i< total_instruction){if (Search (p[i ]・ num, page) >二0)i++;//找到相同的页面else{if (t~N)t=O;else{n++;//page[t]・ num二p[i]・ num;print(page);t++;}}}cout«,z缺页次数:/z«n«z,命中率:z,«l-n/total_instruction<<endl;} if(c=‘r)//LRU 页面置换n二0;cout«/,页面置换情况:"〈〈endl;while (i〈tot al_instruction){int k;k=t=Search(p[i]・ num, page);if(t>=0)page[t]・ time=0;else{n++;t=Max(page);page[t]・ num二p[i]・ num;page[t]・ time=0;}for(int j二O;j<\;j++){if(j!二t)page[j]・ time++;}/*if(t二二0){page[t+l]・ time++;page[t+2]・ time++;} if(t==l){page[2]・time++;page[0]・ time++;} if(t==2){page[1]・ time++;page[0]・ time++;}*/ if(k 二二-1) print(page);i++;}cout«,z缺页次数:z/«n«z,命中率:z,«l-n/total_instruction<<endl;}辻(c二M o')//OPT页面置换{n二0;while(i<total_instruction){if(Search(p[i]・ num, page)>=0)i++;else{if(page[N~l]・ num二二-1){for (int g=0;g<N;g++)if (page [g]・ num二二T)page[g]・ num二p[i]・ num;i++;n++; print(page);break;}}else{int temp=-l, cn;for(t=0;t<N;t++){if (temp<Compfu(page, i, t, p)){temp=Compfu(page, i, t, p);cn=t;}}pageEcn]=p[i];n++;print(page);i++;}}}cout«,z缺页次数:/z«n«z,命中率:z,«l- n/total_instruction<<endl;}}while (c二二,f,c~ r c~ o');return 0;}三、详细设计程序代码如下:#include<stdlib. h>#include<iostream>#include<time・ h>#include<stdio. h>using namespace std;#define total_instruction 100 /* 指令流长*/^define M 100 /* 实际页数*/#define X 5 //可用页面数struct Pro{int num, time;};int a[total_instruction]:int page[X];void Input(Pro p[total_instruction]){int m, i, ml, m2;srand( (unsigned int )time(NULL));m=rand ( )%400; //for(i=0; i<total_instruction;) /*产生指令队列*/{辻(m〈0 m>399){printf ("When i==%d, Error, m==%d\n/z, i, m); exit(O);}a[i]=m; /*任选一指令访问点m*/ a[i+l]=a[i]+l;a[i+2]二d[i]+2; /*顺序执行两条指令*/int ml=rand( )%m; /*执行前地址指令ml */a[i+3]=ml;a[i+4]=ml+l;a[i+5]=ml + 2 ;/*顺序执行两条指令*/// s=(158-a[i+5])*rand( )/32767/32767/2+a[i+5]+2;m2 = rand () % (157-ml) +ml+3;a[i+6]=m2;辻((m2+2) > 159 ){a[i+7] = m2+l;i +二8;}else{a[i+7] = m2+l;a[i+8] = m2+2;i 二i+9;}m = rand () %m2;}for (i=0; i<total_instruction; i++) /*将指令序列变换成页地址流*/ { p[i]・ num二a[i]/10;p[i]・ time 二0;}}void print (Pro *pagel)//打印当前的页面{Pro *page=new Pro[N];page二page1;for(int i二0;i〈N;i++)printf(“%-4d〃, page[i]・ num);//cout<<page[i]・num«" “;cout<<endl;//free(page);} int Search (int e,Pro *pagel ){Pro *page=new Pro[N];page=pagel;for(int i=0;i<N;i++)if(e==page[i]・num)return i; return T; }int Max(Pro *pagel){Pro *page=new Pro[N];page=pagel;int e=page[0]・ time, i二0;while (i<X)//找出离现在时间最长的页面{if(e<page[i]・ time)e=page[i]・ time;i++;}for ( i=0; i<N; i++) if (e~page [i]・ time)return i;return T;}int Compfu(Pro *pagel,int i,int t,Pro p[M]) {Pro *page=new Pro[N];page=pagel;int count二0;for(int j二i;j〈M;j++){if (page [t].nu m==p[ j ].nuni ) break;else count++;}return count;}int mdin(){Pro p[totdl_inst:ruction];Pro *page=new Pro[N];char c;int t=0,i;float n二0;Input (p);do{for( i=0; i<N; i++) //初试化页面基本悄况{page[i]・ num二T;page[i]・ time二2-i;}printff系统产生的随机数为:");for (int e二0;e〈M;e++) cout〈<p[e].nu“; cout<<endl;i 二0; cout«z,f:FIF0 页面置换,z«endl;cout«"l:LRU 页面置换z/«endl; cout«"o:0PT 页面置换z,«endl; cout«"按其它键结束"《endl; cin>>c;if (c二二'f')//FIF0 页面置换cout<<z,页面置换悄况:"<〈endl;while( i< total_instruction){if (Search (p[i ]・ num, page) >=0)i++;//找到相同的页面else{if(t==N)t=0;n二0;else{n++;//page[t]・ num二p[i]・ num;print(page);t++;}}}cout«"缺页次数:"«n<<" 命中率:"«1-n/total_instruction<<endl” }辻(c二二'l')//LRU页面置换{n二0;cout<</,页面置换情况:"《endl;while (i<total_instruction){int k;k=t=Search(p[i]・ num, page);if(t>=0)page[t]・ time=0;else{n++;t=Max(page);page[t]・ num二p[i]・ num;page[t]・ time=0;}for(int j=O;j<N;j++){if(j!二t)page[j]・ time++;}/*if(t二二0){page[t+l]・ time++;page[t+2]・ time++;} if(t==l){page[2]・time++;page[0]・ time++;} if(t二二2){page[1]・ time++;page[0]・ time++;}*/ if(k==-l) print(page);i++;}cout«/z缺页次数:/z«n«/z命中率:z,«l-n/total_instruction<<endl; }辻(c=‘ o')//OPT页面置换{n二0;while (i<total_instruction){if(Search(p[i]・ num, page)>=0)i++;else{if(page[N-l]・ num二二-1){for (int g=0;g<N:g++)if (page [g]・ num二二T){page[g]・ num二p[i]・ num;i++;n++;print(page); break;}}else{int temp=-l, cn;for(t=0;t<N;t++){if (temp<Compfu(page, i, t, p)){temp=Compfu(page, i,t,p);cn=t;}}pageEcn] =p[i];n++;print(page);i++;}}}cout«"缺页次数:〃《n«〃命中率:/z«l-n/total_instruction<<endl; } }wh订e(c二二,f,c~ r c~ o,);return 0;四、调试与分析程序的主界面:I r^LVJ I"B这里测试用的数据是MMO, N=5,三种算法置换结果如以下的图: FIFO算法:LRU算法:OPT算法:多运行儿次,产生不同的随机数组,查看对比结果。
存储管理实验报告

综合性实验报告专业:网络工程年级:12级班级:网络工程2014—2015学年第一学一、实验目的通过请求页式存储管理中页面置换算法模拟设计,了解虚拟存储技术的特点,掌握请求页式管理的页面置换算法。
页面置换算法是虚拟存储管理实现的关键,通过本次实验理解内存页面调度的机制,在模拟实现FIFO、LRU、OPT、LFU、NUR几种经典页面置换算法的基础上,比较各种置换算法的效率及优缺点,从而了解虚拟存储实现的过程。
二、总体设计1、编写函数计算并输出下述各种算法的命中率①OPT页面置换算法OPT所选择被淘汰的页面是已调入内存,且在以后永不使用的,或是在最长时间内不再被访问的页面。
因此如何找出这样的页面是该算法的关键。
可为每个页面设置一个步长变量,其初值为一足够大的数,对于不在内存的页面,将其值重置为零,对于位于内存的页面,其值重置为当前访问页面与之后首次出现该页面时两者之间的距离,因此该值越大表示该页是在最长时间内不再被访问的页面,可以选择其作为换出页面。
②FIFO页面置换算法FIFO总是选择最先进入内存的页面予以淘汰,因此可设置一个先进先出的忙页帧队列,新调入内存的页面挂在该队列的尾部,而当无空闲页帧时,可从该队列首部取下一个页帧作为空闲页帧,进而调入所需页面。
③LRU页面置换算法LRU是根据页面调入内存后的使用情况进行决策的,它利用“最近的过去”作为“最近的将来”的近似,选择最近最久未使用的页面予以淘汰。
该算法主要借助于页面结构中的访问时间time来实现,time记录了一个页面上次的访问时间,因此,当须淘汰一个页面时,选择处于内存的页面中其time值最小的页面,即最近最久未使用的页面予以淘汰。
④LFU页面置换算法LFU要求为每个页面配置一个计数器(即页面结构中的counter),一旦某页被访问,则将其计数器的值加1,在需要选择一页置换时,则将选择其计数器值最小的页面,即内存中访问次数最少的页面进行淘汰。
页面置换实习报告
页面置换实习报告在计算机系统中,页面置换是一项至关重要的内存管理技术。
为了更深入地理解和掌握这一技术,我进行了相关的实习。
一、实习目的页面置换的目的在于当内存空间不足时,将一些暂时不使用的页面换出到外存,以腾出空间给当前需要的页面。
通过这次实习,我希望能够:1、深入理解页面置换算法的工作原理和特点。
2、掌握不同算法在实际应用中的性能差异。
3、提高自己的编程能力和问题解决能力。
二、实习环境本次实习使用的编程语言为 Python,开发环境为 PyCharm。
操作系统为 Windows 10。
三、页面置换算法简介1、先进先出(FIFO)算法FIFO 算法是最简单的页面置换算法之一。
它总是淘汰最先进入内存的页面。
这种算法实现简单,但可能会导致一些频繁使用的页面被过早置换出去。
2、最近最久未使用(LRU)算法LRU 算法根据页面最近的使用情况来决定置换。
即淘汰最长时间未被使用的页面。
该算法性能较好,但实现相对复杂,需要记录页面的使用时间。
3、最优置换(OPT)算法OPT 算法是一种理论上的最优算法,它淘汰未来最长时间内不会被使用的页面。
然而,由于在实际中无法准确预测未来的页面使用情况,所以该算法更多地用于理论分析。
四、实习过程1、算法实现首先,我使用 Python 实现了上述三种页面置换算法。
在实现过程中,我使用了数据结构来存储页面的相关信息,并通过模拟页面的调入和调出过程来计算缺页次数。
以 FIFO 算法为例,我使用一个队列来存储页面进入内存的顺序。
当需要置换页面时,将队首的页面淘汰。
2、性能测试为了比较不同算法的性能,我设计了一系列的测试用例。
测试用例包括不同的页面访问序列和不同的内存大小。
通过运行测试用例,我记录了每种算法在不同情况下的缺页次数。
3、结果分析对测试结果进行分析是实习的重要环节。
我发现,在不同的页面访问模式下,不同算法的表现差异较大。
例如,当页面访问序列具有局部性时,LRU 算法的表现通常优于FIFO 算法。
存储管理实验报告总结
存储管理实验报告总结本次实验主要是针对存储管理进行的。
存储管理是操作系统中非常重要的一部分,它负责管理计算机系统的内存空间,为进程提供必要的存储资源。
通过本次实验,我对存储管理的相关概念和技术有了更加深入的了解。
在实验中,我首先学习了存储管理的基本原理。
操作系统将内存分为若干个大小相等的页框,而进程的内存空间则被划分为若干个大小相等的页。
通过页表的映射关系,操作系统可以将进程的页映射到物理内存的页框上。
这样,进程就可以方便地访问内存中的数据。
在实验中,我还学习了虚拟内存的概念和实现方法。
虚拟内存是一种扩展内存的方法,它允许进程访问超出物理内存容量的数据。
虚拟内存通过将进程的页映射到磁盘上的页面文件中,实现了内存的扩展。
当进程需要访问某个页面时,操作系统会将该页面从页面文件中加载到物理内存中,并更新页表的映射关系。
在实验中,我还学习了页面置换算法的原理和实现。
页面置换算法是虚拟内存中非常重要的一部分,它负责决定哪些页面需要被置换出去。
常见的页面置换算法有FIFO算法、LRU算法和Clock算法等。
不同的算法有着不同的性能特点和适用场景,我们需要根据具体的应用场景选择合适的页面置换算法。
在实验中,我还学习了内存分配和回收的方法。
操作系统通过内存分配算法为进程分配内存空间,而通过内存回收算法回收进程不再使用的内存空间。
内存分配算法的选择会影响到系统的性能和资源利用率,我们需要根据具体的应用场景选择合适的内存分配算法。
通过本次实验,我深入了解了存储管理的相关概念和技术。
存储管理是操作系统中非常重要的一部分,它直接影响到系统的性能和资源利用率。
合理地管理存储资源可以提高系统的运行效率和稳定性,从而提升用户的体验。
在今后的学习和工作中,我将进一步深化对存储管理的理解,不断提升自己的技术水平。
操作系统页面置换算法实验报告
学生实验报告姓名:年级专业班级学号成绩【实验结果或总结】(对实验结果进行相应分析,或总结实验的心得体会,并提出实验的改进意见1.程序的执行结果如下:(1)先进先出页面置换算法(2)最佳页面置换法(3)最近最久未使用置换算法2.以上三个程序通过数组和排序语句实现页面的三种基本调度算法。
(1)先进先出算法事先设定标志k=3,页面每发生一次置换k值增加1。
通过取k对3的余数来确定被置换的内存中的页面,当被访问页面存在于内存时,不置换,而直接输出原内存中的3个页面。
(2)最佳置换算法通过设定c1,c2,c3来记录当前内存中的页面被下一次访问的位置(时间),通过对c1,c2,c3的大小比较确定内存中需要被置换的页面。
三者中值最大的对应的内存页面选择被置换。
即实现了未来最长时间未访问的机制,即最佳置换算法。
(3)最近最久未使用置换算法的原理跟最佳置换算法类似。
初始设定变量c1,c2,c3记录当前内存中的以前的最近一次未被访问的位置(时间),比较三者的大小来确定需要被置换的页面。
三者中至最小的对应的内存页面选择被置换。
即实现了最近最久未使用的机制,即最近最久未使用置换算法。
3.上述三个程序分别能较好的模拟页面的基本调度算法,实现页面的置换,保证进程的正常执行。
但也分别存在一些不足。
(1)当内存中三个页面有部分相同时,程序不能很好的实现调度。
即c1,c2,c3中有部分变量值相等,源程序可能不能准确的找到调度顺序,如图所示。
(LRU算法)改进的方法为在c1,c2,c3间的大小比较判断语句中增加关系语句的默认处理办法,当三者间有部分相同时,默认选择按从前到后的顺序执行。
比如当c2=c3的时候选择页面a[2]进行置换。
当c1=c2=c3时则选择页面a[0]进行置换。
也就相当于无法运用LRU算法调用的时候折衷采取先进先出置换算法,以实现页面的合理调度,提高页面的利用效率。
指导教师签名:20 年月日【备注】。
分页置换实验报告
一、实验目的1. 理解分页置换算法的基本原理及其在虚拟内存管理中的作用。
2. 掌握几种常见的分页置换算法(如FIFO、LRU等)的模拟实现方法。
3. 分析不同分页置换算法的性能差异,并评估其在实际应用中的适用性。
二、实验原理分页置换算法是虚拟内存管理中的一种关键技术,其主要目的是在有限的物理内存中模拟更大的内存空间,以满足程序对内存的需求。
当物理内存不足时,系统会根据一定的置换算法选择某些页面进行淘汰,以腾出空间给新的页面。
常见的分页置换算法包括:1. FIFO(先进先出)算法:根据页面进入内存的顺序进行淘汰,即先进入内存的页面先被淘汰。
2. LRU(最近最少使用)算法:淘汰最近一段时间内最长时间未被访问的页面。
3. OPT(最佳置换)算法:淘汰未来最长时间内不再被访问的页面。
三、实验内容1. FIFO算法实现:模拟FIFO算法,记录缺页中断次数和缺页率。
2. LRU算法实现:模拟LRU算法,记录缺页中断次数和缺页率。
3. 性能对比分析:对比FIFO和LRU算法的性能差异,分析其适用场景。
四、实验步骤1. 数据准备:生成一系列页面访问序列,用于模拟分页置换过程。
2. FIFO算法模拟:- 初始化一个固定大小的内存缓冲区。
- 遍历页面访问序列,对于每个页面:- 检查是否已在内存缓冲区中。
- 如果不在,则将内存缓冲区中最先进入的页面淘汰,并将当前页面加入内存缓冲区。
- 记录缺页中断次数。
3. LRU算法模拟:- 初始化一个内存缓冲区,并维护一个访问顺序链表。
- 遍历页面访问序列,对于每个页面:- 检查是否已在内存缓冲区中。
- 如果不在,则将内存缓冲区中最少访问的页面淘汰,并将当前页面加入内存缓冲区。
- 更新访问顺序链表。
- 记录缺页中断次数。
4. 性能对比分析:- 对比FIFO和LRU算法的缺页中断次数和缺页率。
- 分析两种算法的性能差异及其适用场景。
五、实验结果与分析1. FIFO算法:FIFO算法简单易实现,但性能较差。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验二 存储管理与页面置换算法
一、实验目的
通过模拟页式虚拟存储管理中地址转换和页面置换,了解页式虚拟存储管理的思想,掌
握页式地址转换过程和缺页中断处理过程。
二、实验内容
单机模拟页式虚拟存储管理中地址转换和页面置换过程。首先对页表进行初始化;输入
要访问的逻辑地址(可为16进制或10进制),程序分离出逻辑地址的页号,查找页表,根
据页表完成地址转换,输出转换后的地址;若缺页则提示中断发生,按某种页面置换算法
(FIFO,LRU,LFU)进行页面置换,并修改和输出页表,输出绝对地址。最后输出置换情况
和缺页次数。
三、算法描述
1 内存的分配和管理方案
在进程创建时必须为它分配一定的内存资源,内存资源的分配与管理有很多方法,从动
态性分有静态的和动态的分配方法,从连续性上分有连续的和不连续的分配方案。连续的分
配方案是程序的执行速度加快但会使内存出现碎片而不能得到应用,而不连续的分配方案可
以使内存碎片得到充分的应用,但由于访问内存次数的增多使程序执行的速度下降。
2 内存的分配的过程
在作业执行前,向系统提供内存的请求表,在系统为作业创建进程时,要为进程分配内
存资源。以分页系统为例,系统首先确定进程需要的页面数量,然后顺序查找位图(系统为
每一个页面分配一位内存中的各个页面组成一个数组,如果该位为1说明该位所指示的页正
在被使用,如果该位为0说明该位指示的页面空闲)若存在所需要的空闲页面则此次分配成
功,否则分配失败,若分配成功系统首先把分配出去的页面所属的位置为1,然后形成进程
所需的页表。
3算法思想
本程序有两个功能:一是地址转换;二是模拟页面置换情况。
(1)地址转换:add_tran
将逻辑地址中的页号分离出来,查找页表,将查找到的块号与逻辑地址中的页内偏移量
合成实际地址,若查找不到则产生缺页中断,按FIFO的方法置换页面。
(a)数据结构:
array[max][2]为页表,其中array[n][0]为页号,array[n][1]为块号,size_PT表示
系统分配给进程的块数,即页表中的页数。
(b)地址转换算法思想
首先初始化页表:输入分配的块数(页表的大小),然后输入初始页表中的页号和相对应
的块号,初始化完成后程序输出初始化后的页表。
然后是地址转换:输入16进制逻辑地址,程序分离出逻辑地址的页号,然后查找页表,
若缺页则提示中断发生,并修改页表,然后输出转换后的地址,输出页表。
(c)执行情况
程序提示“please input size of the page table:”,要求输入分配的块数s_PT,
即页表的大小。然后根据size_PT,循环输入初始化页表里的页号和对应的块号。用j来表
示下一个将会被置换的页面存放位置,初始指向页表中最后一个页面,按照(j+1)%size_PT
循环。然后程序输出页表情况:页号和对应的块号。至此初始化完成。
程序提示“input the adderss wanted to be translated (0 exit):”,要求输入要转
换的逻辑地址。程序分离出页号后查找页表,查找到则直接输出转换后的地址。否则提示
“intermittence occurred, page A has been replaced with page B”。(A代表被置换的
页号,B代表置换后的页号。)然后再输出转换后的地址(16进制)。输出转换后的地址后,
程序还把转换后的页表显示出来,可以清楚地了解页表是否被置换和置换情况。
(d)结果举例
设size_PT为3,初始化页表为Page:1 block:2 ,page:3 block:5,page:6 block:
3。输入逻辑地址4ff(程序假设页面大小为1k即1024)。则其页号为1,查找页表,不产生
缺页中断,块号为2,则输出转换后的地址为8FF,页表不变。输入逻辑地址81a,则其页
号为2,查找页表,产生缺页中断,此时j指向page 6,将page6置换为page 2,块号为3。
则输出转换后的地址为c1a,页表变为Page:1 block:2,page:3,block:5.page:2 block:
3。置换后j变成(2+1)%size_PT:0,指向页表中第一项page 1。
(2)页面置换模拟:page_si
(a)算法思想
输入页面序列,缺页时按FIFO的策略进行页面置换,输出置换情况和缺页次数。假设
页表大小不超过max,输入的页面数不超过max*lO。
(b)数据结构
arrayl[max]表示简化了的页表,只包含页号,array2[max*lO]存放页面序列。
size_PT表示分配给该进程的块数,size2表示页面序列长度。
page_rep指向下一个将被置换的页面,初始为O,指向页表的第一项。
Sum_int用来计算中断次数。
(c)程序执行流程
初始化:输入分配的块数size_PT,然后对页表共size_PT向赋值-1,表示空。输入页
面序列,存放于数组array2中。按照size2循环,依次查找页面是否存在于页表中,不存
在则置换页面,page_rep初始为0,变化同上。格式化依次输出访问下一个页面后的页表,
然后输出缺页中断总次数。
(d)执行结果举例
输入size_PT为2
输入页面序列为1,3,5,4,5,-1(-1表示输入结束)
输出为1,1 3,5 3,5 4,5 4
there has been 4 intermittences occurred
表示有4次中断发生
四、完成情况
void page_si()
{
int page_rep=0;
int size_PT,count1=0;
int x=0,b,count=0;//size_PT;
int array2[max];
int array1[max];
printf("Please enter size of PT:");
scanf( "%d",&size_PT);
printf( "请输入页面序列:");
do{
scanf( "%d",&array1[x]);
count1++;
x++;
}while(array1[x-1]!=-1);
for(b=0;b
array2[b]=array1[b];
}
printf("%3d",array2[0]);
printf(",");
for(b=0;b
printf(",");
for(x=size_PT;x
for(b=0;b
{
array2[page_rep]=array1[x];
page_rep++;
page_rep=page_rep%size_PT;
count++;
for(b=0;b
printf(",");
}
else
for(b=0;b
printf("%3d",array2[b]);
count++;
}
}
printf("\nthere has been %d intermittences occurred\n",count);
}
结果为:
五、实验出现的问题及其解决方案
1. 问题: 怎么初始化页表?
解决方案:输入分配的块数(页表的大小),然后输入初始页表中的页号和相对应的块号,初
始化完成后程序输出初始化后的页表。
2. 问题:怎么地址转换?
解决方案:输入16进制逻辑地址,程序分离出逻辑地址的页号,然后查找页表,若缺页则
提示中断发生,并修改页表,然后输出转换后的地址,输出页表。
3. 问题:怎么循环输入初始化页表里的页号和对应的块号?
解决方案:用j来表示下一个将会被置换的页面存放位置,初始指向页表中最后一个页面,
按照(j+1)%size_PT循环。然后程序输出页表情况:页号和对应的块号。至此初始化完成。
六、实验感想
这次实验的目的是通过模拟页式虚拟存储管理中地址转换和页面置换,了解页式虚拟存
储管理的思想,掌握页式地址转换过程和缺页中断处理过程。通过这次实验,我达到了这些
目的,同时,认识到内存的分配和管理方案以及页面置换算法的思想和过程。
我现在对操作系统有了新的认识,他对我来说也不再那么神秘。我会更加努力学习,希
望可以通过实验和学习逐渐掌握这门学科。