315-置换策略时钟算法的实现

置换策略时钟算法的实现

#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
#define Maxblocks 3

int blocks[Maxblocks] = {};
int access[Maxblocks] = {};
int modify[Maxblocks] = {};
int pages_in_blocks = 0;
int is_modified = 0;
int aimed_i=-1;

bool is_aimed(int pn)//判断是否击中时钟环中的目标 
{
	aimed_i=-1;
	for(int i=0;i<pages_in_blocks;i++)
	{
		if(blocks[i]==pn)
		{
			aimed_i=i;
			return true;
		}
	}
	return false;
}

void loop()//时钟环圈 
{
	int taotaip=0;
	for(int j=0;j<2;j++)
	{
		for(int i=0;i<pages_in_blocks;i++)
		{
			if(!access[i]&&!modify[i])
			{
				taotaip=blocks[i];
				for(;i<pages_in_blocks;i++)
				{blocks[i]=blocks[i+1];access[i]=access[i+1];modify[i]=modify[i+1];}
				if(!j) printf("第一圈有(0,0)的,是页面  %d,淘汰!把新页面放入队尾\n",taotaip);
				else printf("第三圈有(0,0)的,是页面  %d,淘汰!把新页面放入队尾\n",taotaip);
				return;
			}
		}
		if(!j)
		{
		    printf("第一圈没有(0,0)的,接着找(0,1)的\n");
		} 
		else 
		{
		    printf("第三圈没有(0,0)的,即上一圈(第二圈)全为(0,1)\n");
		} 
		for(int i=0;i<pages_in_blocks;i++)
		{
			if(!(!access[i]&&modify[i]))
			{
				access[i]=0;
			}
			else
			{
				taotaip=blocks[i];
				for(;i<pages_in_blocks;i++)
				{blocks[i]=blocks[i+1];access[i]=access[i+1];modify[i]=modify[i+1];}
				if(!j) printf("第二圈有(0,1)的,是页面  %d,淘汰!第一个(0,1)之前的页面访问位全部置为0,并把新页面放入队尾\n",taotaip);
				else printf("第四圈必有(0,1)的,将第一个(0,1)的,即页面%d淘汰!把新页面放入队尾\n",taotaip);
				return;
			}
		}
		printf("第二圈没有(0,1)的,但把所有访问位置为0了,接着第三圈找(0,0)的\n");
	}
}

void clock_pro(int pn)//对时钟进行调整 
{
	if(pages_in_blocks<Maxblocks)
		{
			if(is_aimed(pn))
			{
				access[aimed_i]=1;
				printf("输入页面是否被修改%d	(0/1)\n",pn);
				scanf("%d",&is_modified);
				if(is_modified) modify[aimed_i]=1;
			}
			else
			{
				blocks[pages_in_blocks]=pn;
				access[pages_in_blocks]=1;
				modify[pages_in_blocks]=0;
				pages_in_blocks++;
			}
		}
	else
	{
		if(is_aimed(pn))
		{
			access[aimed_i]=1;
			printf("输入页面是否被修改%d	(0/1)\n",pn);
			scanf("%d",&is_modified);
			if(is_modified) modify[aimed_i]=1;
		}
		else
		{
			loop();
			blocks[Maxblocks-1]=pn;
			access[Maxblocks-1]=1;
			modify[Maxblocks-1]=0;
		}
	}
}

void print_blocks()//打印时钟 
{
	int cato=0;
	printf("此时内存块里状态为:\n");
	for(int i=0;i<pages_in_blocks;i++)
	{
		if(!access[i] && !modify[i]) cato=1;
		if(!access[i] &&  modify[i]) cato=2;
		if( access[i] && !modify[i]) cato=3;
		if( access[i] &&  modify[i]) cato=4;
		printf("%d	%d	%d  ,对应第%d类型页面\n",blocks[i],access[i],modify[i],cato);
	}
	printf("\n");
}

int main()//主程序运行 
{
	for(int i=0;i<Maxblocks;i++){ blocks[i]=-1;access[i]=0;modify[i]=0;}
	int n=0;
	while(n>=0)
	{
		is_modified=0;
		printf("输入此时进程对哪个页面访问,输入-1结束程序\n");
		scanf("%d",&n);
		if(n>=0)
		{
			clock_pro(n);
			print_blocks();
		}
	}
	return 0;
}

运行截图

在这里插入图片描述

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
本实验使用一下算法 使用rand()函数随机产生页面号,用数组装入页面号,模拟页面调入内存中发生页面置换的过程。 整个过程,都是使用数组来实现每个算法,模拟队列,模拟堆栈的功能,实现每一个置换算法。 页面置换算法 最佳置换算法(OPT):选择永不使用或是在最长时间内不再被访问(即距现在最长时间才会被访问)的页面淘汰出内存。用于算法评价参照。 随机置换算法 (S):产生一个取值范围在0和N-1之间的随机数,该随机数即可表示应被淘汰出内存的页面。 先进先出置换算法(FIFO):选择最先进入内存即在内存驻留时间最久的页面换出到外存。 最近最久未使用置换算法(LRU): 以“最近的过去”作为“最近的将来”的近似,选择最近一段时间最长时间未被访问的页面淘汰出内存 Clock置换算法:为进入内存的页面设置一个访问位,当内存中某页被访问,访问位置一,算法在选择一页淘汰时,只需检查访问位,若为0,则直接换出,若为1,置该访问位为0,检测内存中的下一个页面的访问位。 改进型Clock置换算法: ①从查寻指针当前位置起扫描内存分页循环队列,选择A=0且M=0的第一个页面淘汰;若未找到,转② ② 开始第二轮扫描,选择A=0且M=1的第一个页面淘汰,同时将经过的所有页面访问位置0;若不能找到,转①
时钟置换算法也叫最近未用算法(NRU),是一种页面置换算法。它试图在最近未使用的页面中选择一个牺牲页。下面是一个简单的 C++ 实现代码: ```c++ #include <iostream> #include <vector> using namespace std; struct Page { int id; // 页面编号 bool ref; // 是否被引用 }; int main() { int n, m, id, cnt = 0, fault = 0; cin >> n >> m; // n为物理块数,m为页面序列长度 vector<Page> buffer(n); // 物理块缓冲区 for (int i = 0; i < n; ++i) buffer[i].id = -1; // 初始化页面编号为-1 for (int i = 0; i < m; ++i) { cin >> id; // 读入页面编号 bool found = false; // 查找是否已经在物理块缓冲区中 for (int j = 0; j < n; ++j) { if (buffer[j].id == id) { buffer[j].ref = true; // 标记为已引用 found = true; break; } } if (!found) { int k = cnt % n; // 从当前位置开始顺时针查找 while (buffer[k].ref) { buffer[k].ref = false; // 清除引用位 k = (k + 1) % n; } buffer[k].id = id; buffer[k].ref = true; ++cnt; // 物理块缓冲区中页面数量加1 ++fault; // 未命中次数加1 } } cout << fault << endl; // 输出未命中次数 return 0; } ``` 该算法的关键在于如何选择牺牲页。时钟置换算法使用了一个引用位(ref)来标记页面是否被引用过。在缺页发生时,算法从当前位置开始顺时针查找,找到第一个未被引用过的页面进行替换。如果当前位置的页面被引用过,则清除其引用位,继续查找下一个页面。这样一直查找下去,直到找到一个未被引用过的页面。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

林林林ZEYU

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值