2020-06-06 操作系统CLOCK算C语言实现

本文档详细介绍了如何在Ubuntu虚拟机中使用C语言实现CLOCK页面替换算法,包括算法原理和代码实现。通过创建并运行程序,展示了CLOCK算法在内存管理中的应用,以及如何处理页面置换的情况。

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

操作系统CLOCK算法C语言实现

前言
本机为微软Surface pro4,为64位,所用操作系统为Windos 10。本机虚拟机版本为Oracle VM VirtualBox 6.1.8,所用操作系统是使用Ubuntu18.04,。Ubuntu的虚拟硬盘设置为200G,显存为128MB,内存为4GCPU2个,所用镜像源为清华大学软件镜像源。所使用linux内核为linux-5.11.8

注意事项
(1)本CLOCK算法的实现思路是借鉴网上的相关资源,并非原创。
(2)本篇博客代码只实现CLOCK算法的置换显示,采用了固定化初始3个内存块的方式来进行实现。

COLOCK算法介绍
CLOCK算法:需要根据页面内存是否被访问来决定是否置换该页面。 实际编程中,与最近最久未置换算法类似,用整型数组来表示当前每个内存页面是否被访问,其中1代表被访问过,0代表未访问过。 每次置换,指针循环… CLOCK算法 CLOCK算法 的简介 由于LRU算法对于硬件要求很高,它的近似算法通常是更好的选择, CLOCK算法 就是用的比较多的一种LRU近似算法。

Linux下C语言实现CLOCK算法的代码
1、使用文件编辑器在主目录下创建一个名为OS4的文件夹。

2、打开Geany程序,然后点击新建按钮,创建一个新文件。
(注:创建完成界面如下)

3、在新建的文件中书写程序。(注:程序如下)

#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;     //00
		if(!access[i] &&  modify[i]) cato=2;     //01
		if( access[i] && !modify[i]) cato=3;     //10
		if( access[i] &&  modify[i]) cato=4;     //11
		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;     //初始化is_modified 
			printf("输入此时进程对哪个页面访问,输入-1结束程序\n");
			scanf("%d",&n);
			if(n>=0)
			{
				clock_pro(n);
				print_blocks();
			}
		}
		system("pause");
		return 0;
	return 0;
}

4、将程序文件命名clock.c为保存到OS4文件下。(注:如图所示)

CLOCK算法实现效果如下
1、按如下图示中标明顺序点击按钮执行即可(注:效果图如下)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值