页面置换算法课题实验报告

本实验报告详细介绍了页面置换算法的模拟实现,包括OPT、LRU、FIFO、PBA和改进的CLOCK算法。实验目标是设计和实现这些算法,并通过随机生成的页面访问序列进行性能比较。每种算法的原理、流程图和代码实现均有详述,旨在加深对操作系统内存管理的理解。
摘要由CSDN通过智能技术生成

页面置换算法

说明:本实验在加深理解的基础上有参考孙汉武同学实验结果

实验目的以及基本要求

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

一、概要设计

1.1模块

我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮

1.2功能

(1)随机生成页面访问序列

(2)模拟运行OPT页面替换算法

(3)模拟运行LRU页面替换算法

(4)模拟运行FIFO页面替换算法

(5)模拟运行PBA页面替换算法

(6)模拟运行改进CLOCK页面替换算法

二、实现

2.1数据结构设计

typedef struct WorkItem
{
   
	int seq;
	int priority;
	char Used;//访问位
	char Modified;//修改位
}WorkItem;

按照实验要求的固定属性
16位,1k页面大小
模拟的物理内存32块

typedef struct MemSchedule
{
   
	WorkItem* WorkSpace = NULL;
	int *VisitSeq = NULL;
	int N = 64;
	int p = 0;
	//工作集大小
	int e = 5;
	int m = 1;
	//定义访问序列长度o
	int length;
	//当前已使用物理块数
	int work_len = 0;
	//发生替换的物理块号
	int change = 0;
	float t, r;
	//   队列长度
	int queue_free_len = 0;
	int queue_modified_len = 0;
	WorkItem free[2];
	WorkItem Modified[2];
}MemSchedule;

2.2随机生成页面访问序列

生成访问页面序列

MemSchedule GeneVisitSeq(int l)
{
   
	MemSchedule schedule1;
	schedule1.t = rand() % 1000 / 1000.0;
	schedule1.VisitSeq = (int *)malloc(l * sizeof(schedule1.m));
	printf("生成随机内存访问序列:\n");
	for (int i = 0; i<l; i++)
	{
   
		for (int j = 0; j<schedule1.m; j++)
		{
   
			schedule1.VisitSeq[i*schedule1.m + j] = rand() % schedule1.e + schedule1.p;
			printf("%d ", schedule1.VisitSeq[i*schedule1.m + j]);
		}
		schedule1.r = rand() % 1000 / 1000.0;
		if (schedule1.r<schedule1.t)
		{
   
			schedule1.p = (schedule1.p + 1) % schedule1.N;
		}
	}
	printf("\n");
	schedule1.length = l*schedule1.m;
	schedule1.WorkSpace = (WorkItem *)malloc(schedule1.e * sizeof(WorkItem));
	return schedule1;
}

2.3模拟运行OPT页面替换算法

有关算法的分析
当要调入一页而必须淘汰旧页时,应该淘汰以后不再访问的页,或距现在最长时间后要访问的页面。它所产生的缺页数最少,然而,却需要预测程序的页面引用串,这是无法预知的,不可能对程序的运行过程做出精确的断言,不过此理论算法可用作衡量各种具体算法的标准。
算法流程图如下
在这里插入图片描述

代码如下

int Opt(MemSchedule s1)
{
   
	//start和finish用于记录时间
	clock_t start, finish;
	//num表示优先级,每访问一个指令加一,所以优先级最低的就是最久没有被访问的到的,选择其替换
	int miss = 0;
	start = clock();
	printf("***************最佳置换算法*****************\n");
	printf("seq\t");
	for (int i = 0; i<s1.e; i++)
	{
   
		printf("%d\t", i + 1);
	}
	printf("\n");
	for (int i = 0; i<s1.length; i++)
	{
   
		int pointer = s1.VisitSeq[i];
		printf("%d:\t", pointer);
		//判断当前是否还有空闲物理块
		if (s1.work_len<s1.e)
		{
   
			//此处的flag用于判断当前访问的序列是已经在内存中
			int flag = 0;
			//扫描一遍当前的内存块,进行更新优先级操作和查询下一个访问的页号是否在内存中
			for (int m = 0; m<s1.work_len; m++)
			{
   
				if (s1.WorkSpace[m].seq == pointer)
					//若序列在内存中则将flag置为1
					flag = 1;
			}
			if (flag == 1)
			{
   
				//若下一个访问的页号在内存中,则没有发生缺页,不需要发生替换,change值表示这一次没有
				//缺页
				s1.change = -1;
			}
			if (flag == 0)
			{
   
				//如下一个要访问的页号不在内存中,则发生缺页,需要直接将新的页号放入下一个空闲块中
				//首先更新全部优先级
				//直接将下一个空闲快替换
				s1.WorkSpace[s1.work_len].seq = pointer;
				//将替换变化了的内存块号写入
				s1.change = s1.work_len;
				//将已使用的内存数量加一
				s1.work_len++;
			}
			//打印信息
			for (int k = 0; k<s1.work_len; k++)
			{
   
				//如果发生了页面置换,则打印带@的信息
				if (k == s1.change)
				{
   
					printf("%d@\t", s1.WorkSpace[k].seq);
					//缺页率加一
					miss++;
				}
				else
					printf("%d\t", s1.WorkSpace[k].seq);
			}
			//剩下空闲的页面全部打印*
			for (int j = 0; j<s1.e - s1.work_len; j++)
			{
   
				printf("*\t");
			}

		}
		else
		{
   
			//表示没有空闲内存块
			//还是使用flag表示当前物理块在内存中是否出现
			int flag = 0;
			for (int m = 0; m<s1.work_len; m++)
			{
   
				if (s1.WorkSpace[m].seq == pointer)
					flag = 1;
			}
			if (flag == 1)
			{
   
				//表示内存块已经出现过
				s1.change = -1;
			}
			if (flag == 0)
			{
   
				//min表示最小优先级的那个内存块号
				int min_pri = 0xffffff;
				for (int m = 0; m<s1.work_len; m++)
				{
   
					int n = SearchVisitSqe(s1.VisitSeq, i - 1, s1.WorkSpace[m].seq, 0, s1.length - s1
一、实验题目:页面置换算法(请求分页) 二、实验目的: 进一步理解父子进程之间的关系。 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、付费专栏及课程。

余额充值