页面置换算法实验报告_16281100_雷兵

该博客是页面置换算法实验报告,设计并实现最佳、先进先出、最近最久未使用、页面缓冲置换算法,通过随机发生器测试。假设虚拟内存地址16位、页面大小1K等,从缺页率、算法开销等比较各算法,还给出程序流程和代码,分析不同虚拟内存尺寸下的运行结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

页面置换算法实验报告

1实验题目

设计和实现最佳置换算法、先进先出置换算法、最近最久未使用置换算法、页面缓冲置换算法;通过页面访问序列随机发生器实现对上述算法的测试及性能比较。

2实验要求

  1. 假设前提
  1. 模拟的虚拟内存的地址为16位,页面大小为1K,模拟的物理内存有32K;
  2. 页表用整数数组或结构数组来表示;
  3. 页面访问序列串是一个整数序列,整数的取值范围为0到N - 1。页面访问序列串中的每个元素p表示对页面p的一次访问。

 

  1. 性能测评及问题说明

测试不同的页面访问序列及不同的虚拟内存尺寸,并从缺页率、算法开销等方面对各个算法进行比较。(同时请给出在给定页面访问序列的情况下,发生页面置换次数的平均值)

 

3概要设计

3.1模块设计

总模块图

3.2功能

  1. 随机访问序列生成
  1. 确定虚拟内存的尺寸N,工作集的起始位置p,工作集中包含的页数e,工作集移动率m(每处理m个页面访问则将起始位置p +1),以及一个范围在0和1之间的值t;
  2. 生成m个取值范围在p和p + e间的随机数,并记录到页面访问序列串中;
  3. 生成一个随机数r,0 ≤ r ≤ 1;
  4. 如果r < t,则为p生成一个新值,否则p = (p + 1) mod N;
  5. 如果想继续加大页面访问序列串的长度,请返回第2步,否则结束。

 

  1. 最佳置换算法OPT

选择永不使用或是在最长时间内不再被访问(即距现在最长时间才会被访问)的页面淘汰出内。

 

  1. 先进先出置换算法FIFO

选择最先进入内存即在内存驻留时间最久的页面换出到外存。

进程已调入内存的页面按进入先后次序链接成一个队列,并设置替换指针以指向最老页面。

 

  1. 最近最久未使用置换算法LRU

以“最近的过去”作为“最近的将来”的近似,选择最近一段时间最长时间未被访问的页面淘汰出内存。

 

  1. 改进型Clock置换算法CLO

① 从查寻指针当前位置起扫描内存分页循环队列,选择A=0且M=0的第一个页面淘汰;若未找到,转②

② 开始第二轮扫描,选择A=0且M=1的第一个页面淘汰,同时将经过的所有页面访问位置0;若不能找到,转①

 

4详细设计

4.1程序流程

程序总流程图

先进先出页面置换算法流程图

 

最近久未使用置换算法流程图

最佳置换算法流程图

 

改进型Clock置换算法流程图

4.3程序代码

#include<stdio.h>
#include<string.h>
#include<iostream>
#include<stdlib.h>
#include<time.h>
#define N 64   //虚拟内存大小
#define MAX 2000    //引用串的长度
#define P 32  //物理内存大小

using namespace std;
int result;  //置换次数
int RS[100] = {};  //RS串
int M[P] = {0};   // 物理内存大小

void PRS()
{
	int p = 1;//工作集的起始位置p
	int e = 40;//工作集中包含的页数e
	int m = 64;//工作集移动率m
	double t = 0.5;
	int judge = 1;
	int count = 0;
	double r;
	while(judge == 1)
	{
		srand((unsigned)time(NULL));
		for(int i = 0;i < m;i++)
		{
			RS[count] = rand()%e+p;
			count++;
		}
		r = (rand()%9+1)/10;
		if(r < t)
		{
			p = rand()%N+1;
		}
		else
		{
			p = (p+1)%N;
		}
		if(count >= MAX){
            printf("以下是生成的引用串:\n");
            for(int i = 0;i < count;i++)
            {
                printf("%d ",RS[i]);
            }
            printf("\n");
            break;
		}
	}
}

void print(int c)
{
	printf("以下为物理内存情况:\n");
	for(int i = 0;i < c;i++)
	{
		printf("%d ",M[i]);
	}
	printf("\nend**********************\n");
}

//判断物理内存是否已满
int full(int c,int j)
{
	int judge = 0;
	for(int i = 0;i < c;i++)
	{
		if(RS[j] == M[i])
		{
			judge = 1;
			break;
		}
	}
	if(!judge)
	{
		M[c] = RS[j];
		c++;
	}
	return c;
}

//判断是否为缺页
int lack(int c, int j)
{
	int judge = 0;
	for(int i = 0;i < c;i++)
	{
		if(RS[j] == M[i])
		{
			judge = 1;
			break;
		}
	}
	return judge;
}


//最佳置换算法
int OPT()
{
	result = 0;
	int count = 0;
	for(int j = 0;j < MAX;j++)
	{
		int judge = 0;
		if(count < P)
		{
			count = full(count,j);
		}
		else
		{
			int number;
			judge = lack(count,j);
			if(!judge)   //没有找到,需进行置换
			{
				result++;
				int s;  //用于存放没有找到的页面的数组下标
				for(int k = 0;k < count;k++)
				{
					number = -1;
					for(int i = j+1;i < MAX;i++)
					{
						if(M[k] == RS[i])
						{
							if(number < i)
							{
								number = i;
								s = k;
							}
							break;
						}
					}
					//没有找到,说明此页面不会再被使用,所以直接进行替换
					if(number == -1)
					{
						s = k;
						break;
					}
				}
				M[s] = RS[j];
			}
		}
	}
	return result;
}

//先进先出置换算法
int FIFO()
{
	result = 0;
	int p = 0;
	int count = 0;
	for(int j = 0;j < MAX;j++)
	{
		int judge = 0;
		if(count < P)
		{
			count = full(count,j);
		}
		else
		{
			//判断是否是缺页
			judge = lack(count,j);
			//是缺页,进行置换
			if(!judge)
			{
				result++;
				M[p] = RS[j];
				p = (p+1)%P;
			}
		}
	}
	return result;
}

//最近最久未使用置换算法
int LRU()
{
	result = 0;
	int a[P];  //辅组数组,队尾为最近访问页面
	int count = 0;
	for(int j = 0;j < MAX;j++)
	{
		int judge = 0;
		if(count < P)
		{
			for(int i = 0;i < count;i++)
			{
				if(RS[j] == M[i])
				{
					judge = 1;
					//将页面提到队尾
					int change = M[i];
					for(int k = i;k < count-1;k++)
					{
						a[k] = a[k+1];
					}
					a[count-1] = change;

					break;
				}
			}
			if(!judge)
			{
				a[count] = RS[j];
				M[count] = RS[j];
				count++;
			}
		}
		else
		{
			//判断是否是缺页
			for(int i = 0;i < count;i++)
			{
				if(RS[j] == M[i])
				{
					judge = 1;
					//将页面提到队首
					int change = M[i];
					for(int k = i;k < P-1;k++)
					{
						a[k] = a[k+1];
					}
					a[P-1] = change;

					break;
				}
			}
			//是缺页,进行置换
			if(!judge)
			{
				result++;
				for(int i = 0;i < P;i++)
				{
					if(a[0] == M[i])
					{
						M[i] = RS[j];
						for(int k = 0;k < P-1;k++)
						{
							a[k] = a[k+1];
						}
						a[P-1] = RS[j];

						break;
					}
				}
			}
		}
	}
	return result;
}

//Clock置换算法
int CLO()
{
	result = 0;
	int p = 0;
	int a[MAX];   //辅助数组
	int count = 0;
	for(int j = 0;j < MAX;j++)
	{
		int judge = 0;
		if(count < P)
		{
			for(int i = 0;i < count;i++)
			{
				if(M[i] == RS[j])
				{
					a[i] == 1;
					judge = 1;
					break;
				}
			}
			if(!judge)
			{
				a[count] = 1;
				M[count] = RS[j];
				count ++;
			}
		}
		else
		{
			for(int i = 0;i < count;i++)
			{
				if(M[i] == RS[j])
				{
					judge = 1;
					a[i] = 1;
					break;
				}
			}
			//是缺页,进行置换
			if(!judge)
			{
				result++;
				while(1)
				{
					if(a[p] == 1)
					{
						a[p] = 0;
						p = (p+1)%P;
					}
					else
					{
						a[p] = 1;
						M[p] = RS[j];
						p = (p+1)%P;
						break;
					}
				}
			}
		}
	}
	return result;
}

int main()
{
	int condition = 1;
	while(condition)
	{
		//先调用函数生成引用串
		PRS();

		//对于生成的引用串用各个算法进行效率的测试
		char a[4][30] = {"最佳置换算法","先进先出置换算法",\
					     "最近最久未使用置换算法","Clock置换算法"};
		int r[5];
		r[0] = OPT();
		r[1] = FIFO();
		r[2] = LRU();
		r[3] = CLO();
		printf("\n****************************\n");
		printf("最终结果:\n");
		for(int i = 0;i < 4;i++)
		{
		    double q=(float)r[i]/MAX;
			printf("%s置换次数:%d,缺页率:%.3f\n",a[i],r[i],q);
		}
		printf("1.继续;\n");
		printf("0.退出;\n");
		scanf("%d",&condition);
	}
	return 0;
}

5运行结果及分析

虚拟内存64

 

算法

平均置换次数

最佳置换

305

先进先出置换

389

最近未使用置换

1045

Clock置换

227

 

虚拟内存128

算法

平均置换次数

最佳置换

164

先进先出置换

1002

最近未使用置换

1028

Clock置换

636

 

 

一、实验题目:页面置换算法(请求分页) 二、实验目的: 进一步理解父子进程之间的关系。 1) 理解内存页面调度的机理。 2) 掌握页面置换算法的实现方法。 3) 通过实验比较不同调度算法的优劣。 4) 培养综合运用所学知识的能力。 页面置换算法是虚拟存储管理实现的关键,通过本次试验理解内存页面调度的机制,在模拟实现FIFO、LRU等经典页面置换算法的基础上,比较各种置换算法的效率及优缺点,从而了解虚拟存储实现的过程。将不同的置换算法放在不同的子进程中加以模拟,培养综合运用所学知识的能力。 三、实验内容及要求 这是一个综合型实验,要求在掌握父子进程并发执行机制和内存页面置换算法的基础上,能综合运用这两方面的知识,自行编制程序。 程序涉及一个父进程和两个子进程。父进程使用rand()函数随机产生若干随机数,经过处理后,存于一数组Acess_Series[]中,作为内存页面访问的序列。两个子进程根据这个访问序列,分别采用FIFO和LRU两种不同的页面置换算法对内存页面进行调度。要求: 1) 每个子进程应能反映出页面置换的过程,并统计页面置换算法的命中或缺页情况。 设缺页的次数为diseffect。总的页面访问次数为total_instruction。 缺页率 = disaffect/total_instruction 命中率 = 1- disaffect/total_instruction 2)将为进程分配的内存页面数mframe 作为程序的参数,通过多次运行程序,说明FIFO算法存在的Belady现象。
本实验使用一下算法 使用rand()函数随机产生页面号,用数组装入页面号,模拟页面调入内存中发生页面置换的过程。 整个过程,都是使用数组来实现每个算法,模拟队列,模拟堆栈的功能,实现每一个置换算法。 页面置换算法 最佳置换算法(OPT):选择永不使用或是在最长时间内不再被访问(即距现在最长时间才会被访问)的页面淘汰出内存。用于算法评价参照。 随机置换算法 (S):产生一个取值范围在0和N-1之间的随机数,该随机数即可表示应被淘汰出内存的页面。 先进先出置换算法(FIFO):选择最先进入内存即在内存驻留时间最久的页面换出到外存。 最近最久未使用置换算法(LRU): 以“最近的过去”作为“最近的将来”的近似,选择最近一段时间最长时间未被访问的页面淘汰出内存 Clock置换算法:为进入内存的页面设置一个访问位,当内存中某页被访问,访问位置一,算法在选择一页淘汰时,只需检查访问位,若为0,则直接换出,若为1,置该访问位为0,检测内存中的下一个页面的访问位。 改进型Clock置换算法: ①从查寻指针当前位置起扫描内存分页循环队列,选择A=0且M=0的第一个页面淘汰;若未找到,转② ② 开始第二轮扫描,选择A=0且M=1的第一个页面淘汰,同时将经过的所有页面访问位置0;若不能找到,转①
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值