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

页面置换算法

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

实验目的以及基本要求

设计和实现最佳置换算法、先进先出置换算法、最近最久未使用置换算法、页面缓冲置换算法以及改进的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
  • 3
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
一、实验题目:页面置换算法(请求分页) 二、实验目的: 进一步理解父子进程之间的关系。 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现象。
页面置换算法操作系统中用于管理内存的一种算法。它的主要目的是在有限的物理内存中,尽可能多地运行进程。页面置换算法通过将内存中不常用的页面移出物理内存,以便为新的页面腾出空间。下面是一个页面置换算法模拟实验的例子: ```python # 定义一个函数,模拟页面置换算法 def page_replacement_algorithm(pages, capacity): # 初始化一个空的物理内存列表 memory = [] # 初始化一个计数器,用于记录页面置换次数 page_faults = 0 # 遍历所有页面 for page in pages: # 如果页面已经在物理内存中,跳过本次循环 if page in memory: continue # 如果物理内存未满,将页面添加到物理内存中 if len(memory) < capacity: memory.append(page) # 如果物理内存已满,使用页面置换算法将页面替换出去 else: # 初始化一个空的字典,用于记录每个页面最后一次出现的位置 last_occurrence = {} # 遍历物理内存中的所有页面,记录它们最后一次出现的位置 for i, p in enumerate(memory): if p not in last_occurrence: last_occurrence[p] = i # 找到最久未使用的页面,将其替换出去 page_to_replace = min(last_occurrence, key=last_occurrence.get) memory[memory.index(page_to_replace)] = page # 增加页面置换次数 page_faults += 1 # 返回页面置换次数 return page_faults # 测试页面置换算法模拟实验 pages = [7, 0, 1, 2, 0, 3, 0, 4, 2, 3, 0, 3, 2] capacity = 4 page_faults = page_replacement_algorithm(pages, capacity) print("页面置换次数:", page_faults) ``` 上述代码中,我们定义了一个名为`page_replacement_algorithm`的函数,它接受两个参数:`pages`表示所有页面的列表,`capacity`表示物理内存的容量。函数的返回值是页面置换的次数。在函数内部,我们首先初始化一个空的物理内存列表`memory`和一个计数器`page_faults`,然后遍历所有页面。如果页面已经在物理内存中,我们就跳过本次循环;如果物理内存未满,我们就将页面添加到物理内存中;如果物理内存已满,我们就使用页面置换算法将页面替换出去。在本例中,我们使用了最久未使用算法(LRU)来进行页面置换。最后,我们返回页面置换的次数。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值