第7次 常用页面置换算法模拟实验
页面置换算法模拟实验报告材料

实验编号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。
实验七 页面置换算法的模拟实现报告_川农

实验7页面置换算法的模拟实现三、实验内容与步骤1、定义相关数据#define InitPysiBlocks 4#define MaxPages 16:unsigned int PysicalBlocks[InitPysiBlocks] = { 0 };unsigned int PageSequence[30] = { 1,2,3,6,4,7,3,2,1,4,7,5,6,5,2,1};2、按照教材中FIFO、LRU算法描述进行算法设计unsigned FIFO(unsigned *py,unsigned *pg)unsigned LRU(unsigned *py,unsigned *pg)3、查看运行结果是否与手工计算一致。
四、实验材料的提交与成绩评定1.代码:#include<iostream>usingnamespace std;#define InitPysiBlocks 4#define MaxPages 16unsignedint PysicalBlocks[InitPysiBlocks] = { 0 };unsignedint PageSequence[30] = { 1,2,3,6,4,7,3,2,1,4,7,5,6,5,2,1 };//FIFO算法unsigned FIFO(unsigned *py, unsigned *pg){//初始化填满数据for (int i = 0; i <InitPysiBlocks; i++){py[i] = pg[i];}cout <<"FIFO置换过程如下:"<< endl;cout <<py[0] <<" "<<py[1] <<" "<<py[2] <<" "<<py[3] << endl;//判断新获取数据进来的时间int time[4] = { 3,2,1,0 };//开始检测for (int i = 4; i <MaxPages; i++){for (int j = 0; j <InitPysiBlocks; j++){//如果新获取的已存在,直接输出if (py[0] == pg[i] || py[1] == pg[i] || py[2] == pg[i] || py[3] == pg[i]){cout <<py[0] <<" "<<py[1] <<" "<<py[2] <<" "<<py[3] << endl;break;}else{for (int k = 0; k < 4; k++){if (time[k] == 3){time[k] = 0;py[k] = pg[i];}else{time[k]++;}}cout <<py[0] <<" "<<py[1] <<" "<<py[2] <<" "<<py[3] << endl;break;}}}cout <<"置换结束"<< endl;return 0;}//LRU算法//LRU辅助函数:返回除某一排下标后数组中最大元素下标int Max(unsigned *py, int te){int max = 0;int index = -1;for (int i = 0; i <InitPysiBlocks; i++){if (i == te){continue;}else{if (py[i] > max){max = py[i];index = i;}else{continue;}}}return index;}unsigned LRU(unsigned *py, unsigned *pg){//初始化填满数据for (int i = 0; i <InitPysiBlocks; i++){py[i] = pg[i];}cout <<"LRU置换过程如下:"<< endl;cout <<py[0] <<" "<<py[1] <<" "<<py[2] <<" "<<py[3] << endl;//判断新获取数据进来的时间unsigned time[4] = { 3,2,1,0 };//统计命中次数int count[4] = { 0 };//开始检测for (int i = InitPysiBlocks; i < 16; i++){for (int j = 0; j <InitPysiBlocks; j++){//如果新获取的已存在,直接输出,并将对应的命中变为1if (py[0] == pg[i] || py[1] == pg[i] || py[2] == pg[i] || py[3] == pg[i]){cout <<py[0] <<" "<<py[1] <<" "<<py[2] <<" "<<py[3] << endl;if (py[0] == pg[i]){count[0] = 1;}elseif (py[1] == pg[i]){count[1] = 1;}elseif (py[2] == pg[i]){count[2] = 1;}elseif (py[3] == pg[i]){count[3] = 1;}else{count[4] = { 0 };}break;}else{if (count[0] == 1){//返回数组中最大值int temp = Max(time, 0);py[temp] = pg[i];for (int k = 0; k <InitPysiBlocks; k++){time[k]++;}time[temp] = 0;count[0] = 0;}elseif (count[1] == 1){//返回数组中最大值int temp = Max(time, 1);py[temp] = pg[i];for (int k = 0; k <InitPysiBlocks; k++){time[k]++;}time[temp] = 0;count[1] = 0;}elseif (count[2] == 1){//返回数组中最大值int temp = Max(time, 2);py[temp] = pg[i];for (int k = 0; k <InitPysiBlocks; k++){time[k]++;}time[temp] = 0;count[2] = 0;}elseif (count[3] == 1){//返回数组中最大值int temp = Max(time, 3);py[temp] = pg[i];for (int k = 0; k <InitPysiBlocks; k++){time[k]++;}time[temp] = 0;count[3] = 0;}else{//返回数组中最大值int temp = Max(time, -1);py[temp] = pg[i];for (int k = 0; k <InitPysiBlocks; k++){time[k]++;}time[temp] = 0;}cout <<py[0] <<" "<<py[1] <<" "<<py[2] <<" "<<py[3] << endl;break;}}}cout <<"置换结束"<< endl;return 0;}int main(){FIFO(PysicalBlocks, PageSequence);LRU(PysicalBlocks, PageSequence);return 0;}2.运行截图:运行结果与手工计算结果一致。
页面置换算法模拟实验报告

if(block[i].timer >= block[pos].timer)
pos = i;//找到应予置换页面,返回BLOCK中位置
return pos;
}
void PRA::display(void)
{
for(int i=0; i<Bsize; i++)
}
}
int PRA::findSpace(void)
{
for(int i=0; i<Bsize; i++)
if(block[i].content == -1)
return i;//找到空闲内存,返回BLOCK中位置
return -1;
}
int PRA::findExist(int curpage)
{
if(exist != -1)
{
cout<<"不缺页"<<endl;
}
else
{
space = findSpace();
if(space != -1)
{
block[space] = page[i];
display();
}
else
{
for(int k=0; k<Bsize; k++)
for(int j=i; j<Psize; j++)
int findReplace(void); //查找应予置换的页面
void display(void); //显示
void FIFO(void);//FIFO算法
【精品】页面置换算法实验报告

【精品】页面置换算法实验报告一、实验目的了解操作系统中的页面置换算法,并实现FIFO、LRU和Clock算法。
二、实验原理页面置换算法是操作系统中用到的一种算法,其作用是在内存不够用时,选择牺牲已经在内存中的一些页,腾出更多的空间给新的内容。
本次实验主要实现了FIFO、LRU和Clock算法。
1、FIFO算法FIFO算法是最简单的页面置换算法,它采用先进先出的原则,即最先进入内存的页面应该最早被替换出去。
该算法的实现非常简单,只需要维护一个队列即可。
当需要置换页面时,选择队列的第一个页面进行替换即可。
2、LRU算法LRU算法是Least Recently Used的缩写,即最近最少使用算法。
该算法的核心思想是选择最久没有被使用的页面进行替换。
为了实现该算法,需要维护记录页面使用时间的链表、栈或队列等结构。
3、Clock算法Clock算法也叫做二次机会算法,是一种改良的FIFO算法。
它是基于FIFO算法的思想,并且每个页面都设置了一个使用位(use bit),用于记录该页面是否被使用过。
当需要置换一个页面时,检查该页面的使用位,如果该页面的使用位为1,则将该页面的使用位设置为0并移到队列的末尾,表示该页面有“二次机会”继续待在内存中;如果该页面的使用位为0,则选择该页面进行替换。
三、实验过程本次实验采用Python语言实现页面置换算法,并使用样例进行测试。
1、FIFO算法实现FIFO算法的实现非常简单,只需要用一个队列来维护已经在内存中的页面,当需要置换页面时,选择队列的第一个元素即可。
代码如下:```pythonfrom collections import dequeclass FIFO:def __init__(self, frame_num):self.frame_num = frame_numself.frames = deque(maxlen=frame_num)def access(self, page):if page in self.frames:return Falseif len(self.frames) >= self.frame_num:self.frames.popleft()self.frames.append(page)return True```2、LRU算法实现LRU算法的实现需要维护一个记录页面使用时间的链表或队列。
页面置换算法

《操作系统原理》课程设计任务书题目:常用页面置换算法模拟实验学生姓名:学号:班级:计算机科学与技术(2)班题目类型:软件工程(R)指导教师:一、设计目的学生通过该题目的设计过程,可以初步掌握操作系统中有关文件系统的原理、软件开发方法并提高解决实际问题的能力。
二、设计任务设计一个虚拟存储区和内存工作区,并使用最佳淘汰算法(OPT)、先进先出算法(FIFO)、最近最久未使用算法(LRU)计算访问命中率。
(命中率=1-页面失效次数/页地址流长度)三、设计要求1、分析设计要求,给出解决方案(要说明设计实现所用的原理、采用的数据结构)。
2、设计合适的测试用例,对得到的运行结果要有分析。
3、设计中遇到的问题,设计的心得体会。
4、文档:课程设计打印文档每个学生一份,并装在统一的资料袋中,资料袋前面要贴有学校统一的资料袋封面。
5、光盘:每个学生文档和程序资料分别建在一个以自己学号和姓名命名的文件夹下,并要求每班负责人汇总每个学生的文件放在以班级名命名的文件夹下,刻录成5寸光盘,并复制四份(共五张内容相同的光盘),放在一个专门的资料袋中。
四、提交的成果1、设计任务书一本(学校统一格式)2、设计说明书一份,内容包括:1)中文摘要100字;关键词3-5个;2)设计思想;3)各模块的伪码算法;4)函数的调用关系图;5)测试结果;6)涉及总结;7)参考文献、致谢等。
五、各阶段时间安排(共2周)周次日期内容地点完成情况第1周星期一~二教师讲解课设要求查找参考资料教室2D302图书馆星期三~五检查总体及各模块流程图教室2D302第2周星期一~二检查源程序调试情况及文档排版教室2C417星期三~五检查程序,答辩教室2C417指导教师签字:______________日期:2011年12月30日摘要在地址映射过程中,若在页面中发现所要访问的页面不再内存中,则产生缺页中断。
当发生缺页中断时操作系统必须在内存选择一个页面将其移出内存,以便为即将调入的页面让出空间。
《FIFO算法来模拟实现页面的置换》实验报告

struct pageInfor
{
int content;//页面号
int timer;//被访问标记
};
class PRA
{
public:
PRA(void);
int findSpace(void); //查找是否有空闲内存
int findExist(int curpage); //查找内存中是否有该页面
FIFO算法总是淘汰最先进入内存的页面,即选择在内存中驻留时间最久的页面予以淘汰。该算法实现简单,只需把一个进程已调入内存的页面,按照先后次序连接成一个队列,并设置一个替换指针,使它总指向最老的页面。
pageInfor * page; //页面号串
private:
}
运行界面:
总结
在进程运行过程中,若其所访问的页面不存在内存而需要把它们调入内存,但内存已无空闲时,为了保证该进程能够正常运行,系统必须从内存中调出一页程序或数据送磁盘的对换区中。但应调出哪个页面,需根据一定的算法来确定,算法的好坏,直接影响到系统的性能。
int findReplace(void); //查找应予置换的页面
void display(void); //显示
void FIFO(void); //FIFO算法
void BlockClear(void);//BLOCK清空,以便用另一种方法重新演示
pageInfor * block; //物理块
《FIFO算法来模拟实现页面的置换》实验报告
实验
时间
2011年05月16日
实验人
虎胆英侠
专业
计算机
学号
实验
名称
FIFO算法来模拟实现页面的置换
目的
常用页面置换算法模拟实验

目录一、摘要 (3)二、正文 (4)三、设计总结 (8)四、参考文献 (10)五、附录:源程序代码 (11)摘要Windows中,为了提高内存利用率,提供了内外存进程对换机制;内存空间的分配和回收均以页为单位进行;一个进程只需将其一部分(段或页)调入内存便可运行;还支持请求调页的存储管理方式。
当进程在运行中需要访问某部分程序和数据时,发现其所在页面不在内存,就立即提出请求(向CPU发出缺页中断),由系统将其所需页面调入内存。
这种页面调入方式叫请求调页,为实现请求调页,核心配置了四种数据结构:页表、页框号、访问位、修改位、有效位、保护位等。
此设计为了了解Windows XP的操作接口及系统调用方式,熟悉Windows XP常用操作的实现过程,练习并掌握Visual C++开发环境。
利用Windows SDK(System Development Kit)提供的API(应用程序接口)设计一个虚拟存储管理程序,并使用最佳淘汰算法(OPT)、先进先出算法(FIFO)、最近最久未使用算法(LRU)计算访问命中率。
(命中率=1-页面失效次数/页地址流长度)。
关键字Windows;请求调页;数据结构;存储管理正文一、设计思路页面置换算法:当CPU接收到缺页中断信号,中断处理程序先保存现场,分析中断原因,转入缺页中断处理程序。
该程序通过查找页表,得到该页所在外存的物理块号。
如果此时内存未满,能容纳新页,则启动磁盘I/O将所缺之页调入内存,然后修改页表。
如果内存已满,则须按某种置换算法从内存中选出一页准备换出,是否重新写盘由页表的修改位决定,然后将缺页调入,修改页表。
利用修改后的页表,去形成所要访问数据的物理地址,再去访问内存数据。
整个页面的调入过程对用户是透明的。
此设计为了了解Windows XP的操作接口及系统调用方式,熟悉Windows XP常用操作的实现过程,练习并掌握Visual C++开发环境。
利用Windows SDK(System Development Kit)提供的API(应用程序接口)设计一个虚拟存储管理程序,并使用最佳淘汰算法(OPT)、先进先出算法(FIFO)、最近最久未使用算法(LRU)计算访问命中率。
页面置换算法实验报告

页面置换算法实验报告页面置换算法实验报告一、引言在计算机操作系统中,页面置换算法是一种重要的内存管理策略。
当物理内存不足以容纳所有需要运行的进程时,操作系统需要根据一定的算法将部分页面从内存中换出,以便为新的页面腾出空间。
本实验旨在通过实际操作,对比不同的页面置换算法在不同场景下的性能表现。
二、实验背景在计算机系统中,每个进程都有自己的虚拟内存空间,而物理内存空间是有限的。
当进程需要访问某个页面时,如果该页面不在物理内存中,就会发生缺页中断,操作系统需要根据页面置换算法选择一个页面将其换出,然后将需要访问的页面换入。
常见的页面置换算法有先进先出(FIFO)、最近最久未使用(LRU)、时钟(Clock)等。
三、实验目的本实验旨在通过模拟不同的页面置换算法,比较它们在不同情况下的缺页率和效率。
通过实验结果,评估各个算法在不同场景下的优劣,为实际系统的内存管理提供参考。
四、实验设计与方法本实验选择了三种常见的页面置换算法进行比较:FIFO、LRU和Clock。
我们使用C++编程语言模拟了一个简单的内存管理系统,并通过产生不同的访存序列来模拟不同的场景。
实验中,我们设置了不同的物理内存大小,访存序列长度和页面大小,以模拟不同的系统环境。
五、实验结果与分析在实验中,我们分别测试了FIFO、LRU和Clock算法在不同的系统环境下的表现。
通过统计不同算法的缺页率和运行时间,得出以下结论:1. FIFO算法FIFO算法是最简单的页面置换算法,它按照页面进入内存的顺序进行置换。
实验结果表明,FIFO算法在缺页率方面表现一般,特别是在访存序列具有局部性的情况下,其性能明显下降。
这是因为FIFO算法无法区分不同页面的重要性,可能会将经常使用的页面换出,导致缺页率升高。
2. LRU算法LRU算法是一种基于页面访问时间的置换算法,它认为最近被访问的页面很可能在未来会被再次访问。
实验结果表明,LRU算法在缺页率方面表现较好,特别是在访存序列具有较强的局部性时,其性能明显优于FIFO算法。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
操作系统课程实验报告断。
当发生缺页中断时操作系统必须在内存选择一个页面将其移出内存,以便为即将调入的页面让出空间。
而用来选择淘汰哪一页的规则叫做页面置换算法。
最简单的页面置换算法是先入先出(FIFO)法。
2、算法流程图3、步骤说明(1)初始化void init(){//初始化int i;for (i = 0; i < page_frame_number; i++){page_table[i].page_id = -1;page_table[i].load_time = -1;page_table[i].last_visit_time = -1;}}(2)选择算法,输入插入页面号。
进入判断函数int judge(){//判断页框是否满,或者页框里面是否已存在页面int i;for (i = 0; i < page_frame_number; i++){if (page_table[i].page_id == -1 || page_table[i].page_id == page_id)return i;}return -2;}之后根据返回数的不同决定了不同类型返回-2则说明页框满且页框里面没有存在要插入的页面。
返回-1则说明页框未满返回其它数则说明页框里存在相同的页面(3)//当没有空页框,并且页面本身也没有存在,则执行一下代码qsort(page_table, page_frame_number, sizeof(struct Page_table), cmp);//按照装入时间从小到大排序page_table[0].page_id = page_id;page_table[0].load_time = counter;page_table[0].last_visit_time = counter;page_interrupt_number++;将页框号为0的页面置换成最新插入的页面。
int cmp(const void *p, const void *q){//按照装入时间从小到大排序int c = (*(struct Page_table*)p).load_time - (*(struct Page_table*)q).load_time;if (c > 0)return 1;elsereturn -1;}排序函数,将页面按装入时间从小到大排序(4)//如果页面未满,则将页面替换在空页框里if (page_table[j].page_id == -1){page_table[j].page_id = page_id;page_table[j].load_time = counter;page_table[j].last_visit_time = counter;page_interrupt_number++;则将页面替换在页框号最小的空页框里(5)//如果页面本身存在页框中,则执行一下代码page_table[j].last_visit_time = counter;则更新页面的最近访问时间(6)qsort(page_table, page_frame_number, sizeof(struct Page_table), cmp3);//按照装入时间从小到大排序print(2);打印出页表详细信息printf("页表信息:\n页号页框号装入时间最近访问时间\n");for (j = 0; j < page_frame_number; j++){printf("%4d%8d%7d%7d\n", page_table[j].page_id, j, page_table[j].load_time,page_table[j].last_visit_time);}; break;排序函数int cmp3(const void *p, const void *q){//按照装入时间从小到大排序,,并且不要排序没页面的部分if ((*(struct Page_table*)p).page_id != -1 && (*(struct Page_table*)q).page_id != -1){ int c = (*(struct Page_table*)p).load_time - (*(struct Page_table*)q).load_time;if (c > 0)return 1;elsereturn -1;}}(7)并计算出中断页面次数及命中概率,并打印页表出来int sum;sum = ((virtual_page_number - page_interrupt_number) * 100 / virtual_page_number);printf("缺页中断次数:%d\n", page_interrupt_number);printf("中断命中率:%d%%\n", sum);printf("打印出页面\n");for (int i = 0; i < page_frame_number; i++){for (int g = 1; g <= virtual_page_number; g++){printf("%4d", pr[i][g]);}printf("\n");}4、实现(1)选择FIFO算法(2)输入页面号,列出页表详细信息(3)输入-1,结束输入,显示统计结果及页表二、最近最少使用页面置换算法1、基本思想:在前面几条指令中使用频繁的页面很可能在后面的几条指令中频繁使用。
反过来说,已经很久没有使用的页面很可能在未来较长的一段时间内不会被用到。
这个,就是著名的局部性原理——比内存速度还要快的cache,也是基于同样的原理运行的。
因此,我们只需要在每次调换时,找到最近最久使用的那个页面调出内存。
2、算法流程图3、步骤说明:(1)初始化void init(){//初始化int i;for (i = 0; i < page_frame_number; i++){page_table[i].page_id = -1;page_table[i].load_time = -1;page_table[i].last_visit_time = -1;}}(2)选择算法,输入插入页面号。
进入判断函数int judge(){//判断页框是否满,或者页框里面是否已存在页面int i;for (i = 0; i < page_frame_number; i++){if (page_table[i].page_id == -1 || page_table[i].page_id == page_id) return i;}return -2;}之后根据返回数的不同决定了不同类型返回-2则说明页框满且页框里面没有存在要插入的页面。
返回-1则说明页框未满返回其它数则说明页框里存在相同的页面(3)//当没有空页框,并且页面本身也没有存在,则执行一下代码qsort(page_table, page_frame_number, sizeof(struct Page_table), cmp1);//按照最后访问时间从小到大排序page_table[0].page_id = page_id;page_table[0].load_time = counter;page_table[0].last_visit_time = counter;page_interrupt_number++;将页框号为0的页面置换成最新插入的页面。
int cmp1(const void *p, const void *q){//按照最后访问时间从小到大排序int c = (*(struct Page_table*)p).last_visit_time - (*(structPage_table*)q).last_visit_time;if (c > 0)return 1;elsereturn -1;}排序函数,将页面按最后访问时间从小到大排序(4)//如果页面未满,则将页面替换在空页框里if (page_table[j].page_id == -1){page_table[j].page_id = page_id;page_table[j].load_time = counter;page_table[j].last_visit_time = counter;page_interrupt_number++;则将页面替换在页框号最小的空页框里(5)//如果页面本身存在页框中,则执行一下代码page_table[j].last_visit_time = counter;则更新页面的最近访问时间(6)qsort(page_table, page_frame_number, sizeof(struct Page_table), cmp2);//按照最后访问时间从小到大排序print(2);打印出页表详细信息printf("页表信息:\n页号页框号装入时间最近访问时间\n");for (j = 0; j < page_frame_number; j++){printf("%4d%8d%7d%7d\n", page_table[j].page_id, j, page_table[j].load_time, page_table[j].last_visit_time);}; break;排序函数int cmp2(const void *p, const void *q){//按照最后访问时间从小到大排序,,并且不要排序没页面的部分if ((*(struct Page_table*)p).page_id != -1 && (*(struct Page_table*)q).page_id != -1){ int c = (*(struct Page_table*)p).last_visit_time - (*(structPage_table*)q).last_visit_time;if (c > 0)return 1;elsereturn -1;}}(7)并计算出中断页面次数及命中概率,并打印页表出来int sum;sum = ((virtual_page_number - page_interrupt_number) * 100 / virtual_page_number);printf("缺页中断次数:%d\n", page_interrupt_number);printf("中断命中率:%d%%\n", sum);printf("打印出页面\n");for (int i = 0; i < page_frame_number; i++){for (int g = 1; g <= virtual_page_number; g++){printf("%4d", pr[i][g]);}printf("\n");}4、实现(1)选择LRU算法(2)输入页面号,并打印出详细页表(3)输入-1,结束输入,显示统计结果及页表三、代码// ConsoleApplication2.cpp : 定义控制台应用程序的入口点。