操作系统CLOCK算法C语言实现
前言
本机为微软Surface pro4
,为64
位,所用操作系统为Windos 10
。本机虚拟机版本为Oracle VM VirtualBox 6.1.8
,所用操作系统是使用Ubuntu18.04
,。Ubuntu的虚拟硬盘设置为200G
,显存为128MB
,内存为4G
,CPU
2个,所用镜像源为清华大学软件镜像源。所使用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、按如下图示中标明顺序点击按钮执行即可(注:效果图如下)