虚拟存储器管理 页面置换算法模拟实验

虚拟存储器管理 页面置换算法模拟实验
虚拟存储器管理 页面置换算法模拟实验

淮海工学院计算机工程学院实验报告书

课程名:《操作系统原理A 》

题目:虚拟存储器管理

页面置换算法模拟实验

班级:软件***

学号:20**1228**

姓名:****

一、实验目的与要求

1.目的:

请求页式虚存管理是常用的虚拟存储管理方案之一。通过请求页式虚存管理中对页面置换算法的模拟,有助于理解虚拟存储技术的特点,并加深对请求页式虚存管理的页面调度算法的理解。

2.要求:

本实验要求使用C语言编程模拟一个拥有若干个虚页的进程在给定的若干个实页中运行、并在缺页中断发生时分别使用FIFO和LRU算法进行页面置换的情形。其中虚页的个数可以事先给定(例如10个),对这些虚页访问的页地址流(其长度可以事先给定,例如20次虚页访问)可以由程序随机产生,也可以事先保存在文件中。要求程序运行时屏幕能显示出置换过程中的状态信息并输出访问结束时的页面命中率。程序应允许通过为该进程分配不同的实页数,来比较两种置换算法的稳定性。

二、实验说明

1.设计中虚页和实页的表示

本设计利用C语言的结构体来描述虚页和实页的结构。

在虚页结构中,pn代表虚页号,因为共10个虚页,所以pn的取值范围是0—9。pfn代表实

页号,当一虚页未装入实页时,此项值为-1;当该虚页已装入某一实页时,此项值为所装入的实页

的实页号pfn。time项在FIFO算法中不使用,在LRU中用来存放对该虚页的最近访问时间。

在实页结构中中,pn代表虚页号,表示pn所代表的虚页目前正放在此实页中。pfn代表实页号,

取值范围(0—n-1)由动态指派的实页数n所决定。next是一个指向实页结构体的指针,用于多个实页以链表形式组织起来,关于实页链表的组织详见下面第4点。

2.关于缺页次数的统计

为计算命中率,需要统计在20次的虚页访问中命中的次数。为此,程序应设置一个计数器count,来统计虚页命中发生的次数。每当所访问的虚页的pfn项值不为-1,表示此虚页已被装入某实页内,此虚页被命中,count加1。最终命中率=count/20*100%。

3.LRU算法中“最近最久未用”页面的确定

为了能找到“最近最久未用”的虚页面,程序中可引入一个时间计数器countime,每当要访问一个虚页面时,countime的值加1,然后将所要访问的虚页的time项值设置为增值后的当前countime 值,表示该虚页的最后一次被访问时间。当LRU算法需要置换时,从所有已分配实页的虚页中找出time值为最小的虚页就是“最近最久未用”的虚页面,应该将它置换出去。

4.算法中实页的组织

因为能分配的实页数n是在程序运行时由用户动态指派的,所以应使用链表组织动态产生的多个实页。为了调度算法实现的方便,可以考虑引入free和busy两个链表:free链表用于组织未分配出去的实页,首指针为free_head,初始时n个实页都处于free链表中;busy链表用于组织已分配出去的实页,首指针为busy_head,尾指针为busy_tail,初始值都为null。当所要访问的一个虚页不在实页中时,将产生缺页中断。此时若free链表不为空,就取下链表首指针所指的实页,并分配给该虚页。若free链表为空,则说明n个实页已全部分配出去,此时应进行页面置换:对于FIFO算法要将busy_head 所指的实页从busy链表中取下,分配给该虚页,然后再将该实页插入到busy链表尾部;对于LRU算法则要从所有已分配实页的虚页中找出time值为最小的虚页,将该虚页从装载它的那个实页中置换出去,并在该实页中装入当前正要访问的虚页。

三、程序流程图

FIFO算法

LRU算法四、主要程序清单

#include

#include

#include

#include

#define M 10 //10个虚页

#define N 20 //20个页面的访问序列//定义虚页的结构

typedef struct VirtualPage

{

int pn;

int pfn;

int time;

}VirtualPage;

//定义实页的结构

typedef struct Page

{

int pn;

int pfn;

struct Page* next;

}Page;

struct VirtualPage vp[M]; // 定义存放10个虚页的数组

int queue[N]; //定义一个数组,存放随机生成的20个数,表示访问虚页的次序,里面的数值不能超过9

int count; //存放缺页次数,用来统计缺页率。本算法没有考虑预调页,只要该页不在内存,就认为缺页一次。

int countime; //用于LRU算法中,找出要淘汰的页。每当要访问一个虚页面时,countime的值加1,然后将所要访问的虚页的time项值设置为增值后的当前countime值

int NotInMemory[N]; //表示每次虚页访问是否在内存

struct Page *Free,*Free_head,*Busy,*Busy_tail,*Busy_head,*temp;

void init(Page pp[],int MemoryStatus[][N],int L)

{

int i,j;

count=0;

countime=0;

//初始化10个虚页

for(i=0;i

{

vp[i].pn=i;

vp[i].pfn=-1;

vp[i].time=0;

}

//初始化5个实页,并将其串成链表形式for(i=0;i

{

pp[i].pn=-1;

pp[i].pfn=i;

pp[i].next=NULL;

}

//将5个实页依次相连,形成Free链表Free=&pp[0];

for(i=0;i

{

pp[i].next=&pp[i+1];

}

pp[L-1].next=NULL;

Free_head=Free;

//初始化Busy链表

Busy=NULL;

Busy_head=NULL;

Busy_tail=NULL;

//初始化MemoryStatus数组

for(i=0;i

for(j=0;j

{

MemoryStatus[i][j]=-1;

}

//初始化NotInMemory数组

for(i=0;i

{

NotInMemory[i]=1;

}

}

void FIFO(int L,int MemoryStatus[][N]) //先入先出算法的具体实现。

{

count=0;

int i,j,k,currentpage; //一些临时变量

for(i=0;i

{

//当前访问的虚页是哪一页?由数组queue[i]中的值表示

currentpage=queue[i];

//判断该虚页是否已经调入内存

if(vp[currentpage].pfn!=-1) //表示该页已经在内存中,可以直接访问。同时记录访问该页时对应的实页信息(和前一页相同)

{

for(j=0;j

{

MemoryStatus[j][i]=MemoryStatus[j][i-1];

}

NotInMemory[i]=0;

}

else //该页不在内存,需要请求调页

{

count=count+1; //缺页数加1

if(Free!=NULL) //如果Free链表不为空,表示内存中还有空的实页,故从Free链表中取队首元素,装入该虚页,并修改相关信息。

{

temp=Free_head; //本程序中用Free表示链表的起始地址,Free_head表示链表中的第一个元素地址。实际上两者的值永远相等。

Free_head=Free_head->next;

Free=Free_head;

//将虚页currentpage装入temp指向的实页,该实页的编号为temp->pfn

vp[currentpage].pfn=temp->pfn;

temp->pn=currentpage;

//将temp指向的实页插入Busy链表的末尾

temp->next=NULL;

if(Busy==NULL) //如果是第一次把虚页装入实页,则temp就是Busy链表的第一个元素。

{

Busy=temp;

Busy_head=Busy;

Busy_tail=Busy;

}

else //如果不是第一次把虚页装入实页,则将temp插入Busy链表的队尾。

{

Busy_tail->next=temp;

Busy_tail=temp;

}

//修改内存状态

for(k=0;k

{

MemoryStatus[k][i]=MemoryStatus[k][i-1];

}

MemoryStatus[temp->pfn][i]=currentpage; //虚页currentpage装入了temp->pfn表示的那个实页里

}

else //如果Free链表为空,需要置换一页出去。由于采用FIFO算法,故取busy链表的队首元素,将其置换出去,修改信息后插入队尾。

{

//将Busy首元素取出,赋给temp

temp=Busy;

Busy_head=Busy->next;

Busy=Busy_head;

//将当前虚页currentpage装入temp指向的实页,修改其信息

vp[temp->pn].pfn=-1; //该页被置换出去了,所以其pfn字段要设置成-1,表示其已经不再内存。

vp[currentpage].pfn=temp->pfn; //currentpage被装入内存,更新其pfn字段为temp指向的实页。

temp->pn=currentpage; //temp指向的实页,装入了currentpage虚页

//将temp指向的实页插入Busy链表的末尾,此时不用再考虑Busy是否为空了。

temp->next=NULL;

Busy_tail->next=temp;

Busy_tail=temp;

//修改内存状态

for(k=0;k

{

MemoryStatus[k][i]=MemoryStatus[k][i-1];

}

MemoryStatus[temp->pfn][i]=currentpage; //虚页currentpage装入了temp->pfn表示的那个实页里

}

}

}

}

void LRU(Page pp[],int MemoryStatus[][N],int L)

{

int i,j,k,currentpage;

for(i=0;i

{

currentpage=queue[i];

if(vp[currentpage].pfn!=-1)

{

for(j=0;j

{

MemoryStatus[j][i]=MemoryStatus[j][i-1];

}

NotInMemory[i]=0;

}

else

{

count=count+1;

if(Free!=NULL)

{

temp=Free_head;

Free_head=Free_head->next;

Free=Free_head;

vp[currentpage].pfn=temp->pfn;

temp->pn=currentpage;

temp->next=NULL;

if(Busy==NULL)

{

Busy=temp;

Busy_head=Busy;

Busy_tail=Busy;

}

else

{

Busy_tail->next=temp;

Busy_tail=temp;

}

for(k=0;k

MemoryStatus[k][i]=MemoryStatus[k][i-1];

}

MemoryStatus[temp->pfn][i]=currentpage;

}

else

{

int min=vp[pp[0].pn].time;

temp=&pp[0];

for(k=1;k

{

if(vp[pp[k].pn].time

{

min=vp[pp[k].pn].time;

temp=&pp[k];

}

}

vp[temp->pn].pfn=-1;

.

vp[currentpage].pfn=temp->pfn;

temp->pn=currentpage;

for(k=0;k

{

MemoryStatus[k][i]=MemoryStatus[k][i-1];

}

MemoryStatus[temp->pfn][i]=currentpage;

}

}

countime++;

vp[currentpage].time=countime;

}

}

int main()

{

int i,j,flag=1,L;

while(flag)

{

printf("请输入实页的个数:");

scanf("%d",&L);

struct Page pp[L]; //定义一个存放5个实页的数组,在底下还要将其串成链表

int MemoryStatus[L][N];

init(pp,MemoryStatus,L);

printf("FIFO算法:\n");

srand(time(0));

for(i=0;i

{

queue[i]=rand()%10;

printf("|%3d",queue[i]);

}

printf("\n");

FIFO(L,MemoryStatus); //运行FIFO() 算法

//显示依次访问20个虚页时对应的内存状态,即MemoryStatus数组的值。

for(i=0;i

{

for(j=0;j

{

if(NotInMemory[j]==1) //当访问的这个虚页不在内存时,显示将其调入内存后的详细内存信息

printf("|%3d",MemoryStatus[i][j]);

else

printf("|%3c",32); //当访问的这个虚页在内存时,内存状态未发生改变,故无需再显示一遍。本例用空格代替,其中32 是空格的ASCII码

}

}

printf("\n 缺页数为:%3d",count);

float rate=count/(float)N*100;

printf("缺页率为:%g%%\n",rate);

rate=0;

init(pp,MemoryStatus,L);

printf("\n");

printf("LRU算法:\n");

for(i=0;i

{ printf("|%3d",queue[i]); }

printf("\n");

LRU(pp,MemoryStatus,L);

for(i=0;i

{

for(j=0;j

{

if(NotInMemory[j]==1) //当访问的这个虚页不在内存时,显示将其调入内存后的详细内存信息

printf("|%3d",MemoryStatus[i][j]);

else

printf("|%3c",32); //当访问的这个虚页在内存时,内存状态未发生改变,故无需再显示一遍。本例用空格代替,其中32 是空格的ASCII码

}

}

printf("\n 缺页数为:%3d",count);

rate=count/(float)N*100;

printf("缺页率为:%g%%\n",rate);

printf("继续操作? 1---->继续0---->停止\n");

scanf("%d",&flag);

printf("\n");

}

return 0;

}

五、程序运行结果

六、实验体会

本次实验是为了熟悉页面调度的两种算法即FIFO算法和LRU算法,首先老师已经给出了FIFO算法,要求我们给出LRU算法,并将程序中的实页数改为由用户自行输入的为准,这就有两种方式,其一:是将L作为全局变量,将其大小设为100,使其满足输入的输入的数字,这样做的缺点是浪费空间,但在编程实现上十分便利,其二,将L改有键盘输入,之后再分配相应的空间,这样做的优点是节约空间,但在编程时比较麻烦。

总体来说,由于老师已经将FIFO算法实现,所以本次试验比较简单,相对容易实现。

如有侵权请联系告知删除,感谢你们的配合!

页面置换算法模拟程序-附代码

目录 1.问题的提出 (2) 1.1关于页面置换算法模拟程序问题的产生 (2) 1.2任务分析 (2) 2.需求分析 (2) 3.方案设计 (3) 4.总体设计 (4) 4.1程序N-S图 (4) 4.2主要的函数 (4) 4.3主要流程图及代码 (5) 4.3.1 FIFO(先进先出) (5) 4.3.2 LRU(最近最久未使用) (6) 4.3.3 OPT(最佳置换算法) (8) 4.4实现结果 (11) 5.程序测试 (14) 5.1设计测试数据 (14) 5.2测试结果及分析 (15) 摘要 随着计算机的普及人们的物质生活得到了极大的满足,人们在精神生活方面同样也需要

提高,所以越来越多的人进行着各种各样的学习。操作系统是计算机教学中最重要的环节之一,也是计算机专业学生的一门重要的专业课程。操作系统质量的好坏,直接影响整个计算机系统的性能和用户对计算机的使用。一个精心设计的操作系统能极大地扩充计算机系统的功能,充分发挥系统中各种设备的使用效率,提高系统工作的可靠性。由于操作系统涉及计算机系统中各种软硬件资源的管理,内容比较繁琐,具有很强的实践性。要学好这门课程,必须把理论与实践紧密结合,才能取得较好的学习效果. 本课程设计是学生学习完《操作系统教程》课程后,进行的一次全面的综合训练,通过课程设计,让学生更好地掌握操作系统的原理及实现方法,加深对操作系统基础理论和重要算法的理解,加强学生的动手能力。 熟悉页面置换算法及其实现,引入计算机系统性能评价方法的概念。 关键词:编制页面置换算法模拟程序、打印页面、FIFO页面算法、LRU页面置换算法、OPT页面置换算法。

最佳置换算法

/*-------------最佳置换算法(OPtimal Replacement Algorithm,ORA)-------------*/ /*算法描述:所选择的淘汰页,是以后永不使用,或最长时间内不使用的页面*/ /*---------------------------------writen by Xu Zhuozhuo-----------------------------------*/ C++代码示例: #include #define MaxSize 20 #define Num_Block 3 using namespace std; int max(int a,int b,int c) //返回三者的最大值 { if(a>num_ref; //输入引用字符串的数目 }while(num_ref>MaxSize); cout <<"Please input the queue of reference chars:" <>ref_arr[i]; for(int j=0;j

操作系统课程设计-页面置换算法C语言

操作系统课程设计-页面置换算法C语言

5、根据方案使算法得以模拟实现。 6、锻炼知识的运用能力和实践能力。 三、设计要求 1、编写算法,实现页面置换算法FIFO、LRU; 2、针对内存地址引用串,运行页面置换算法进行页面置换; 3、算法所需的各种参数由输入产生(手工输入或者随机数产生); 4、输出内存驻留的页面集合,页错误次数以及页错误率; 四.相关知识: 1.虚拟存储器的引入: 局部性原理:程序在执行时在一较短时间内仅限于某个部分;相应的,它所访问的存储空间也局限于某个区域,它主要表现在以下两个方面:时间局限性和空间局限性。 2.虚拟存储器的定义: 虚拟存储器是只具有请求调入功能和置换功能,能从逻辑上对内存容量进行扩充的一种存储器系统。 3.虚拟存储器的实现方式: 分页请求系统,它是在分页系统的基础上,增加了请求调页功能、页面置换功能所形成的页面形式虚拟存储系统。

请求分段系统,它是在分段系统的基础上,增加了请求调段及分段置换功能后,所形成的段式虚拟存储系统。 4.页面分配: 平均分配算法,是将系统中所有可供分配的物理块,平均分配给各个进程。 按比例分配算法,根据进程的大小按比例分配物理块。 考虑优先的分配算法,把内存中可供分配的所有物理块分成两部分:一部分按比例地分配给各进程;另一部分则根据个进程的优先权,适当的增加其相应份额后,分配给各进程。 5.页面置换算法: 常用的页面置换算法有OPT、FIFO、LRU、Clock、LFU、PBA等。 五、设计说明 1、采用数组页面的页号 2、FIFO算法,选择在内存中驻留时间最久的页 面予以淘汰; 分配n个物理块给进程,运行时先把前n个不同页面一起装入内存,然后再从后面逐一比较,输出页面及页错误数和页错误率。3、LRU算法,根据页面调入内存后的使用情况 进行决策; 同样分配n个物理块给进程,前n个不同页面一起装入内存,后面步骤与前一算法类似。 选择置换算法,先输入所有页面号,为系统分

实验报告三-虚拟内存页面置换算法

实验报告三-虚拟内存页面置换算法

实验报告三虚拟内存页面置换算法 班级学号姓名 一、实验目的 通过这次实验,加深对虚拟内存页面置换概念的理解,进一步掌握先进先出FIFO,最佳置换OPI和最近最久未使用LRU页面置换算法的实现方法。 二、实验的开发环境 1. 硬件设备:PC机一台 2. 软件环境:安装Windows操作系统或者Linux 操作系统,并安装相关的程序开发环境,如 C \C++\Java 等编程语言环境。 三、实验设计思路 问题描述: 设计程序模拟先进先出FIFO,最佳置换OPI 和最近最久未使用LRU页面置换算法的工作过程。假设内存中分配给每个进程的最小物理块数为m,在进程运行过程中要访问的页面个数为n,页面访问序列为P1, … ,Pn,分别利用不同的页面置换算法调度进程的页面访问序列,给出页面访问序列的置换过程,计算每种算法缺页次数和缺页率。 四、实验内容及结果 程序要求如下:

1)利用先进先出FIFO,最佳置换OPI和最近最久未使用LRU三种页面置换算法模拟页面访问过程。 2)模拟三种算法的页面置换过程,给出每个页面访问时的内存分配情况。 3)输入:最小物理块数m,页面个数n,页面访问序列P1, …,Pn,算法选择1-FIFO,2-OPI,3-LRU。 4)输出:每种算法的缺页次数和缺页率。 程序源码如下: #include "iostream.h" const int DataMax=100; const int BlockNum = 10; int DataShow[BlockNum][DataMax]; // 用于存储要显示的数组 bool DataShowEnable[BlockNum][DataMax]; // 用于存储数组中的数据是否需要显示 //int Data[DataMax]={4,3,2,1,4,3,5,4,3,2,1,5,6,2,3,7,1,2,6,1}; // 测试数据 //int N = 20; // 输入页面个数 int Data[DataMax]; // 保存数据 int Block[BlockNum]; // 物理块 int count[BlockNum]; // 计数器 int N ; // 页面个数 int M;//最小物理块数 int ChangeTimes; void DataInput(); // 输入数据的函数 void DataOutput(); void FIFO(); // FIFO 函数 void Optimal(); // Optimal函数 void LRU(); // LRU函数 ///* int main(int argc, char* argv[]) { DataInput();// DataInput(); // FIFO(); // Optimal(); // LRU(); // return 0; int menu; while(true)

虚拟存储器管理 页面置换算法模拟实验

淮海工学院计算机工程学院实验报告书 课程名:《操作系统原理A 》 题目:虚拟存储器管理 页面置换算法模拟实验 班级:软件*** 学号:20**1228** 姓名:****

一、实验目的与要求 1.目的: 请求页式虚存管理是常用的虚拟存储管理方案之一。通过请求页式虚存管理中对页面置换算法的模拟,有助于理解虚拟存储技术的特点,并加深对请求页式虚存管理的页面调度算法的理解。 2.要求: 本实验要求使用C语言编程模拟一个拥有若干个虚页的进程在给定的若干个实页中运行、并在缺页中断发生时分别使用FIFO和LRU算法进行页面置换的情形。其中虚页的个数可以事先给定(例如10个),对这些虚页访问的页地址流(其长度可以事先给定,例如20次虚页访问)可以由程序随机产生,也可以事先保存在文件中。要求程序运行时屏幕能显示出置换过程中的状态信息并输出访问结束时的页面命中率。程序应允许通过为该进程分配不同的实页数,来比较两种置换算法的稳定性。 二、实验说明 1.设计中虚页和实页的表示 本设计利用C语言的结构体来描述虚页和实页的结构。 在虚页结构中,pn代表虚页号,因为共10个虚页,所以pn的取值范围是0—9。pfn代表实页号,当一虚页未装入实页时,此项值为-1;当该虚页已装入某一实页时,此项值为所装入的实页的实页号pfn。time项在FIFO算法中不使用,在LRU中用来存放对该虚页的最近访问时间。 在实页结构中中,pn代表虚页号,表示pn所代表的虚页目前正放在此实页中。pfn代表实页号,取值范围(0—n-1)由动态指派的实页数n所决定。next是一个指向实页结构体的指针,用于多个实页以链表形式组织起来,关于实页链表的组织详见下面第4点。 2.关于缺页次数的统计 为计算命中率,需要统计在20次的虚页访问中命中的次数。为此,程序应设置一个计数器count,来统计虚页命中发生的次数。每当所访问的虚页的pfn项值不为-1,表示此虚页已被装入某实页内, 此虚页被命中,count加1。最终命中率=count/20*100%。 3.LRU算法中“最近最久未用”页面的确定 为了能找到“最近最久未用”的虚页面,程序中可引入一个时间计数器countime,每当要访问 一个虚页面时,countime的值加1,然后将所要访问的虚页的time项值设置为增值后的当前

页面置换算法课程设计

专业计算机科学与技术

目录 1.设计目的 (2) 2.课设要求 (2) 3.系统分析 (3) 4.系统设计 (3) 4.1问题分析 (3) 4.2程序整体框图 (5) 4.3 FIFO算法 (5) 4.4 LRU算法 (6) 4.5 OPT算法 (7) 5.功能与测试 (8) 5.1开始界面 (8) 5.2 FIFO算法 (9) 5.3 LRU算法 (10) 5.4 OPT算法 (10) 6.结论 (11) 7.附录 (12)

1.设计目的 1、存储管理的主要功能之一是合理地分配空间。请求页式管理是一种常用的虚拟存储管理技术。本次设计的目的是通过请求页式存储管理中页面置换算法模拟设计,了解虚拟存储技术的特点,掌握请求页式管理的页面置换算法。 2、提高自己的程序设计能力、提高算法设计质量与程序设计素质; 2.课设要求 设计一个请求页式存储管理方案。并编写模拟程序实现之。要求包含: 1.过随机数产生一个指令序列,共320条指令。其地址按下述原则生成: ①50%的指令是顺序执行的; ②25%的指令是均匀分布在前地址部分; ③25%的指令是均匀分布在后地址部分; 具体的实施方法是: 在[0,319]的指令地址之间随机选区一起点M; 顺序执行一条指令,即执行地址为M+1的指令; 在前地址[0,M+1]中随机选取一条指令并执行,该指令的地址为M’; 顺序执行一条指令,其地址为M’+1; 在后地址[M’+2,319]中随机选取一条指令并执行; 重复A—E,直到执行320次指令。 2.指令序列变换成页地址流 设:(1)页面大小为1K; 用户内存容量为4页到32页; 用户虚存容量为32K。 在用户虚存中,按每K存放10条指令排列虚存地址,即320条指令在虚存中的存放方式为:

实验四页面置换算法代码

实验四页面置换算法模拟(2)一.题目要求: 设计一个虚拟存储区和内存工作区,编程序演示下述算法的具体实现过程,并计算访问命中率: 要求设计主界面以灵活选择某算法,且以下算法都要实现 1) 最佳置换算法(OPT):将以后永不使用的或许是在最长(未来)时间内不再 被访问的页面换出。 2) 先进先出算法(FIFO):淘汰最先进入内存的页面,即选择在内存中驻留 时间最久的页面予以淘汰。 3) 最近最久未使用算法(LRU):淘汰最近最久未被使用的页面。 4) 最不经常使用算法(LFU) 二.实验目的: 1、用C语言编写OPT、FIFO、LRU,LFU四种置换算法。 2、熟悉内存分页管理策略。 3、了解页面置换的算法。 4、掌握一般常用的调度算法。 5、根据方案使算法得以模拟实现。 6、锻炼知识的运用能力和实践能力。

三.相关知识: 1.虚拟存储器的引入: 局部性原理:程序在执行时在一较短时间内仅限于某个部分;相应的,它所访问的存储空间也局限于某个区域,它主要表现在以下两个方面:时间局限性和空间局限性。 2.虚拟存储器的定义: 虚拟存储器是只具有请求调入功能和置换功能,能从逻辑上对内存容量进行扩充的一种存储器系统。 3.虚拟存储器的实现方式: 分页请求系统,它是在分页系统的基础上,增加了请求调页功能、页面置换功能所形成的页面形式虚拟存储系统。 请求分段系统,它是在分段系统的基础上,增加了请求调段及分段置换功能后,所形成的段式虚拟存储系统。 4.页面分配: 平均分配算法,是将系统中所有可供分配的物理块,平均分配给各个进程。 按比例分配算法,根据进程的大小按比例分配物理块。 考虑优先的分配算法,把内存中可供分配的所有物理块分成两部分:一部分按比例地分配给各进程;另一部分则根据个进程的优先权,适当的增加其相应份额后,分配给各进程。 5.页面置换算法: 常用的页面置换算法有OPT、FIFO、LRU、Clock、LFU、PBA等。

页面置换算法代码实现(完整版)

实验原理: 在内存运行过程中,若其所要访问的页面不在内存而需要把他们调入内存,但内存已经没有空闲空间时,为了保证该进程能正常运行,系统必须从内存中调出一页程序或数据送磁盘的对换区中。但应将那个页面调出,需根据一定的算法来确定。通常,把选择换出页面的算法成为页面置换算法。置换算法的好坏,将直接影响到系统的性能。 一个好的页面置换算法,应具有较低的页面更换频率。从理论上讲,应将那些以后不再会访问的页面置换出,或者把那些在较长时间内不会在访问的页面调出。目前存在着许多种置换算法(如FIFO,OPT,LRU),他们都试图更接近理论上的目标。 实验目的: 1.熟悉FIFO,OPT和LRU算法 2.比较三种算法的性能优劣 实验内容: 写出FIFO,OPT和LRU算法的程序代码,并比较它们的算法性能。 实验步骤: 代码如下: #include #define M 4 //物理页数 #define N 20 //需要调入的页数 typedef struct page { int num; int time; }Page; //物理页项,包括调入的页号和时间 Page mm[M]; //4个物理页

int queue1[20],queue2[20],queue3[20]; //记录置换的页int K=0,S=0,T=0; //置换页数组的标识 int pos=0;//记录存在最长时间项 //初始化内存页表项及存储内存情况的空间 void INIT(){ int i; for(i=0;i max){ max=mm[i].time ; pos=i; } } return pos; } //检查最长时间不使用页面 int longesttime(int fold)

页面置换算法模拟实验报告

实验编号4 名称页面置换算法模拟 实验目的 通过请求页式存储管理中页面置换算法模拟设计,以便: 1、了解虚拟存储技术的特点 2、掌握请求页式存储管理中页面置换算法 实验容与步骤 设计一个虚拟存储区和存工作区,并使用FIFO和LRU算法计算访问命中率。 <程序设计> 先用srand()函数和rand()函数定义和产生指令序列,然后将指令序列变换成相应的页地址流,并针对不同的算法计算相应的命中率。 <程序1> #include //Windows版,随机函数需要,GetCurrentProcessId()需要 //#include //Linux版,随机函数srand和rand需要 #include //printf()需要 #define TRUE 1 #define FALSE 0 #define INVALID -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]的指令地址之间随机选取一起点m for(i=0;i319){ printf("when i==%d,error,s==%d\n",i,s); exit(0); } a[i]=s;//任意选一指令访问点m。(将随机数作为指令地址m) a[i+1]=a[i]+1;//顺序执行下一条指令 a[i+2]=rand()%(s+2);//在[0,m+1]的前地址之间随机选取一地址,记为m' a[i+3]=a[i+2]+1;//顺序执行一条指令 s = a[i+2] + (int)rand()%(320-a[i+2]);//在[m',319]的指令地址之间随机选取一起点m if((a[i+2]>318)||(s>319)) printf("a[%d+2,a number which is:%d and

LRU页面调度算法实现

LRU页调度算法实现 学院计算机科学与技术专业计算机科学与技术学号 学生姓名 指导教师姓名

2014年3月15日 一、设计目的、内容与要求 (一)目的: 操作系统课程设计是计算机专业重要的教学环节,为学生提供了一个既动手又动脑,将课本上的理论知识和实际有机的结合起来,独立分析和解决实际问题的机会。 (1)进一步巩固和复习操作系统的基础知识。 (2)培养学生结构化程序、模块化程序设计的方法和能力。 (3)提高学生调试程序的技巧和软件设计的能力。 (4)提高学生分析问题、解决问题以及综合利用C语言进行程序设计的能力。(二)内容: 程序应模拟实现LRU算法思想,对n个页面实现模拟调度。 (三)要求: 1.不同的功能使用不同的函数实现(模块化),对每个函数的功能和调用接口要 注释清楚。对程序其它部分也进行必要的注释。 2.对系统进行功能模块分析、画出总流程图和各模块流程图。

3.用户界面要求方便、简洁明了、美丽大方、格式统一。所有功能可以反复使 用,最好使用菜单。 4.通过命令相应选项能直接进入某个相应菜单选项的功能模块。 所有程序需调试通过。 二、算法的基本思想 LRU是Least Recently Used 近期最少使用算法。 内存管理的一种页面置换算法,对于在内存中但又不用的数据块(内存块)叫做LRU,Oracle会根据哪些数据属于LRU而将其移出内存而腾出空间来加载另外的数据。 什么是LRU算法?LRU是Least Recently Used的缩写,即最少使用页面置换算法,是为虚拟页式存储管理服务的。关于操作系统的内存管理,如何节省利用容量不大的内存为最多的进程提供资源,一直是研究的重要方向。而内存的虚拟存储管理,是现在最通用,最成功的方式——在内存有限的情况下,扩展一部分外存作为虚拟内存,真正的内存只存储当前运行时所用得到信息。这无疑极大地扩充了内存的功能,极大地提高了计算机的并发度。虚拟页式存储管理,则是将进程所需空间划分为多个页面,内存中只存放当前所需页面,其余页面放入外存的管理方式。 程序中用到了if,switch选择语句,和for循环语句进行编程。 If语句基本格式为: If (表达式) 语句1 else

页面置换算法实验报告

一、实验目的 通过模拟实现请求页式存储管理的几种基本页面置换算法,了解虚拟存储技术的特点,掌握虚拟存储请求页式存储管理中几种基本页面置换算法的基本思想和实现过程,并比较它们的效率。 二、实验内容 基于一个虚拟存储区和内存工作区,设计下述算法并计算访问命中率。 1、最佳淘汰算法(OPT) 2、先进先出的算法(FIFO) 3、最近最久未使用算法(LRU) 4、简单时钟(钟表)算法(CLOCK) 命中率=1-页面失效次数/页地址流(序列)长度 三、实验原理 UNIX中,为了提高内存利用率,提供了内外存进程对换机制;内存空间的分配和回收均以页为单位进行;一个进程只需将其一部分(段或页)调入内存便可运行;还支持请求调页的存储管理方式。 当进程在运行中需要访问某部分程序和数据时,发现其所在页面不在内存,就立即提出请求(向CPU发出缺中断),由系统将其所需页面调入内存。这种页面调入方式叫请求调页。为实现请求调页,核心配置了四种数据结构:页表、页帧(框)号、访问位、修改位、有效位、保护位等。 当CPU接收到缺页中断信号,中断处理程序先保存现场,分析中断原因,转入缺页中断处理程序。该程序通过查找页表,得到该页所在外存的物理块号。如果此时内存未满,能容纳新页,则启动磁盘I/O将所缺之页调入内存,然后修改页表。如果内存已满,则须按某种置换算法从内存中选出一页准备换出,是否重新写盘由页表的修改位决定,然后将缺页调入,修改页表。利用修改后的页表,去形成所要访问数据的物理地址,再去访问内存数据。整个页面的调入过程对用户是透明的。 四、算法描述 本实验的程序设计基本上按照实验内容进行。即使用srand( )和rand( )函数定义和产生指令序列,然后将指令序列变换成相应的页地址流,并针对不同的算法计算出相应的命中率。 (1)通过随机数产生一个指令序列,共320条指令。指令的地址按下述原则生成:A:50%的指令是顺序执行的 B:25%的指令是均匀分布在前地址部分 C:25%的指令是均匀分布在后地址部分 具体的实施方法是: A:在[0,319]的指令地址之间随机选取一起点m B:顺序执行一条指令,即执行地址为m+1的指令 C:在前地址[0,m+1]中随机选取一条指令并执行,该指令的地址为m’ D:顺序执行一条指令,其地址为m’+1

(流程图)页面置换算法课程设计

操作系统课程设计报告题目:页面置换算法模拟程序 学院名称: 专业班级: 学生姓名: 指导教师: 成绩:

目录 一、设计目的 (3) 二、设计题目 (3) 2.1设计内容 (3) 2.2设计要求 (3) 三、设计过程 (4) 3.1 FIFO(先进先出) (4) 3.2 LRU(最近最久未使用) (5) 3.3 OPT(最佳置换算法) (6) 3.4 随机数发生器 (7) 四、完整代码 (7) 五、运行结果演示 (13) 六、设计心得 (16) 七、参考文献 (16)

操作系统是计算机教学中最重要的环节之一,也是计算机专业学生的一门重要的专业课程。操作系统质量的好坏,直接影响整个计算机系统的性能和用户对计算机的使用。一个精心设计的操作系统能极大地扩充计算机系统的功能,充分发挥系统中各种设备的使用效率,提高系统工作的可靠性。由于操作系统涉及计算机系统中各种软硬件资源的管理,内容比较繁琐,具有很强的实践性。要学好这门课程,必须把理论与实践紧密结合,才能取得较好的学习效果。 本课程设计是学生学习完《计算机操作系统》课程后,进行的一次全面的综合训练,通过课程设计,让学生更好地掌握操作系统的原理及实现方法,加深对操作系统基础理论和重要算法的理解,加强学生的动手能力。 熟悉页面置换算法及其实现,引入计算机系统性能评价方法的概念。 二、设计题目:页面置换算法模拟程序 2.1设计内容 编制页面置换算法的模拟程序。 2.2设计要求 1).用随机数方法产生页面走向,页面走向长度为L(15<=L<=20),L由控制台输入。 2).根据页面走向,分别采用Optinal、FIFO、LRU算法进行页面置换,统计缺页率。 3).假定可用内存块为m(3<=m<=5),m由控制台输入,初始时,作业页面都不在内存。 4).要求写出一份详细的设计报告。课程设计报告内容包括:设计目的、设计内容、设计原理、算法实现、流程图、源程序、运行示例及结果分析、心得体会、参考资料等。

操作系统 虚拟内存页面置换算法 java版

实验五虚拟内存页面置换算法 1、实验目的 通过这次实验,加深对虚拟内存页面置换概念的理解,进一步掌握先进先出FIFO、最佳置换OPI和最近最久未使用LRU页面置换算法的实现方法。 2、试验内容 问题描述: 设计程序模拟先进先出FIFO、最佳置换OPI和最近最久未使用LRU页面置换算法的工作过程。假设内存中分配给每个进程的最小物理块数为m,在进程运行过程中要访问的页面个数为n,页面访问序列为P1, … ,P n,分别利用不同的页面置换算法调度进程的页面访问序列,给出页面访问序列的置换过程,计算每种算法缺页次数和缺页率。 3、程序要求: 1)利用先进先出FIFO、最佳置换OPI和最近最久未使用LRU 三种页面置换算法模拟页面访问过程。 2)模拟三种算法的页面置换过程,给出每个页面访问时的内存分配情况。 3)输入:最小物理块数m,页面个数n,页面访问序列P1, … ,P n,算法选择1-FIFO,2-OPI,3-LRU。 4)输出:每种算法的缺页次数和缺页率。 4、需求分析

(1) 输入的形式和输入值的范围算法选择 物理块数 页面个数 页面访问序列P1, …,Pn (2) 输出的形式 每种算法的缺页次数和缺页率(3)测试用例 引用率 70 77 01 7 1 2 2 1 03 2 3 04 2 4 3 230321 2 1 2017 7 1 01 页框(物理块)2 0 3 引用率 70 77 01 7 1 2 2 1 03 2 3 1 04 4 3 230321 1 3 2017 7 2 01 页框2 3 4 2 4 2 3 2 3 1 2 7 1 2 7 1 1 引用率 70 77 01 7 1 2 2 1 03 2 3 04 4 3 230321 1 3 2 2017 1 7 01 页框4 2 4 3 2 3 2 1 2

第7次 常用页面置换算法模拟实验

操作系统课程实验报告

断。当发生缺页中断时操作系统必须在内存选择一个页面将其移出内存,以便为即将调入的页面让出空间。而用来选择淘汰哪一页的规则叫做页面置换算法。最简单的页面置换算法是先入先出(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; else return -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,

《操作系统》实验五页面置换算法模拟

实验五. 请求页式存储管理的模拟 [实验内容]: 熟悉虚拟存储管理的各种页面置换算法,并编写模拟程序实现请求页式存储管理的页面置换算法----最近最久未使用算法(LRU),要求在每次产生置换时显示页面分配状态和缺页率。 [实验要求]: 1、运行给出的实验程序,查看执行情况,进而分析算法的执行过程,在理解FIFO页面置换算法和最近最久未使 用算法(LRU)置换算法后,给出最佳置换算法的模拟程序实现,并集成到参考程序中。 2、执行2个页面置换模拟程序,分析缺页率的情况。最好页框数和访问序列长度可调节,在使用同一组访问序 列数据的情况下,改变页框数并执行2个页面置换模拟程序,查看缺页率的变化。 3、在每次产生置换时要求显示分配状态和缺页率。程序的地址访问序列通过随机数产生,要求具有足够的长度。 最好页框数和访问序列长度可调节。 实验的执行结果如下图所示(左下图为FIFO执行结果,右下图为LRU执行结果):

程序源代码: #include #include "windows.h" #include #include #include #include #include #include void initialize(); //初始化相关数据结构 void createps(); //随机生成访问序列 void displayinfo(); //显示当前状态及缺页情况 void fifo(); //先进先出算法 int findpage(); //查找页面是否在内存 void lru(); //最近最久未使用算法 int invalidcount = 0; // 缺页次数 int vpoint; //页面访问指针 int pageframe[10]; // 分配的页框 int pagehistory[10]; //记录页框中数据的访问历史 int rpoint; //页面替换指针 int inpflag; //缺页标志,0为不缺页,1为缺页 struct PageInfo //页面信息结构 { int serial[100]; // 模拟的最大访问页面数,实际控制在20以上 int flag; // 标志位,0表示无页面访问数据 int diseffect; // 缺页次数 int total_pf; // 分配的页框数 int total_pn; // 访问页面序列长度 } pf_info; //////////////////////////////////////////////////////////////////////// //初始化相关数据结构 void initialize() { int i,pf; inpflag=0; //缺页标志,0为不缺页,1为缺页 pf_info.diseffect =0; // 缺页次数 pf_info.flag =0; // 标志位,0表示无页面访问数据 printf("\n请输入要分配的页框数:"); // 自定义分配的页框数 scanf("%d",&pf); pf_info.total_pf =pf; for(i=0;i<100;i++) // 清空页面序列 { pf_info.serial[i]=-1; }

页面置换算法模拟设计

课程设计报告 课程名称操作系统 课题名称页面置换算法模拟设计 专业通信工程 班级 学号 姓名 指导教师 2014年6 月29 日

湖南工程学院 课程设计任务书 课程名称操作系统 课题页面置换算法模拟设计 专业班级 学生姓名 学号 指导老师 审批 任务书下达日期2014 年 6 月23 日 任务完成日期2014 年 6 月29 日

目录 1课题概述 (4) 1.1设计要求 (4) 1.2 理论分析 (4) 2系统分析 (6) 3程序实现 (8) 4程序测试 (13) 5心得体会 (15) 6附录 (16) 7 评分表 (30)

课题:页面置换算法模拟设计 1课题概述 1.1设计要求 计算并输出下述各种算法在不同内存容量下的命中率。 A. FIFO先进先出的算法 B. LRR最近最少使用算法 C. OPT最佳淘汰算法(先淘汰最不常用的页地址) D. LFR最少访问页面算法 E. NUR最近最不经常使用算法 设计技术参数: (1)命中率=1-页面失效次数/页地址流长度 (2)本实验中,页地址流长度为320,页面失效次数为每次访问相应指令时,该指令所对应的页不在内存的次数。 (3)随机数产生方法,采用系统提供函数SRAND()和RAND ()来产生 1.2 理论分析 在进程运行过程中,若其所要访问的页面不在内存所需把他们调入内存,但内存已无空闲时,为了保证进程能够正常运行,系统必须从内存中调入一页程序或数据送磁盘的对换区中。但应将那个页面调出,须根据一定的算法来确定。通常,把选择换出页面的算法称为页面置换算法。置换算法的好坏,将直接影响到系统的性能。 一个好的页面置换算法,应具有较低的页面更换频率。从理论上将讲,应将那些以后不再访问的页面换出,或把那些较长时间内不再访问的页面调出。目前存在着不同的算法,他们都试图更接近与理论上的目标。

操作系统实验4(虚拟内存页面置换算法)

操作系统实验报告四 【实验题目】 虚拟内存页面置换算法 【实验目的】 通过这次实验,加深对虚拟内存页面置换概念的理解,进一步掌握先进先出FIFO,最佳置换OPI和最近最久未使用LRU页面置换算法的实现方法。 【实验内容】 问题描述: 设计程序模拟先进先出FIFO,最佳置换OPI和最近最久未使用LRU页面置换算法的工作过程。假设内存中分配给每个进程的最小物理块数为m,在进程运行过程中要访问的页面个数为n,页面访问序列为P1, …,Pn,分别利用不同的页面置换算法调度进程的页面访问序列,给出页面访问序列的置换过程,计算每种算法缺页次数和缺页率。 程序要求如下: 1)利用先进先出FIFO,最佳置换OPI和最近最久未使用LRU三种页面置换算法模拟页面访问过程。 2)模拟三种算法的页面置换过程,给出每个页面访问时的内存分配情况。 3)输入:最小物理块数m,页面个数n,页面访问序列P1, … ,Pn,算法选择1-FIFO,2-OPI,3-LRU。 4)输出:每种算法的缺页次数和缺页率。 【实验要求】 1) 上机前认真复习页面置换算法,熟悉FIFO,OPI,LRU三种页面分配和置换算法的过程; 2) 上机时独立编程、调试程序; 3) 根据具体实验要求,完成好实验报告(包括实验的目的、内容、要求、源程序、实例运行结果截图)。 【源代码】 //--------------- YeMianZhiHuan.cpp ----------------- #include "iostream.h" const int DataMax=100; const int BlockNum = 10; int DataShow[BlockNum][DataMax]; // 用于存储要显示的数组 bool DataShowEnable[BlockNum][DataMax]; // 用于存储数组中的数据是否需要显示

操作系统页面置换算法模拟实验

淮海工学院计算机科学系实验报告书 课程名:《操作系统原理A 》 题目:虚拟存储器管理 页面置换算法模拟实验 班级: 学号: 姓名:

一、实验目的与要求 1.目的: 请求页式虚存管理是常用的虚拟存储管理方案之一。通过请求页式虚存管理中对页面置换算法的模拟,有助于理解虚拟存储技术的特点,并加深对请求页式虚存管理的页面调度算法的理解。 2.要求: 本实验要求使用C语言编程模拟一个拥有若干个虚页的进程在给定的若干个实页中运行、并在缺页中断发生时分别使用FIFO和LRU算法进行页面置换的情形。其中虚页的个数可以事先给定(例如10个),对这些虚页访问的页地址流(其长度可以事先给定,例如20次虚页访问)可以由程序随机产生,也可以事先保存在文件中。要求程序运行时屏幕能显示出置换过程中的状态信息并输出访问结束时的页面命中率。程序应允许通过为该进程分配不同的实页数,来比较两种置换算法的稳定性。 二、实验说明 1.设计中虚页和实页的表示 本设计利用C语言的结构体来描述虚页和实页的结构。 在虚页结构中,pn代表虚页号,因为共10个虚页,所以pn的取值范围是0—9。pfn代表实页号,当一虚页未装入实页时,此项值为-1;当该虚页已装入某一实页时,此项值为所装入的实页的实页号pfn。time项在FIFO算法中不使用,在LRU中用来存放对该虚页的最近访问时间。 在实页结构中中,pn代表虚页号,表示pn所代表的虚页目前正放在此实页中。pfn代表实页号,取值范围(0—n-1)由动态指派的实页数n所决定。next是一个指向实页结构体的指针,用于多个实页以链表形式组织起来,关于实页链表的组织详见下面第4点。 2.关于缺页次数的统计 为计算命中率,需要统计在20次的虚页访问中命中的次数。为此,程序应设置一个计数器count,来统计虚页命中发生的次数。每当所访问的虚页的pfn项值不为-1,表示此虚页已被装入某实页内, 此虚页被命中,count加1。最终命中率=count/20*100%。 3.LRU算法中“最近最久未用”页面的确定 为了能找到“最近最久未用”的虚页面,程序中可引入一个时间计数器countime,每当要访问 一个虚页面时,countime的值加1,然后将所要访问的虚页的time项值设置为增值后的当前

相关文档
最新文档