客户网站开发全流程/网站制作流程
中文名:时钟置换算法
以下是作者对CLOCK算法的肤浅见解,如有错误之处,欢迎指出,十分感谢!
定义
时钟置换算法可以认为是一种最近未使用算法,即逐出的页面都是最近没有使用的那个。它和LRU算法有类似之处,只不过clock算法会有一个用于记录访问次数的数组,然后再根据第一个最小访问次数来进行替换处理,当访问到缓存中的页面时,访问次数有限制的加1,不改变队列顺序,替换是原位替换,如4,5,6,访问到页面2。如果访问次数6比4和5要多1且4和5访问次数相等,那么替换后的队列为4,2,6。
这里想给大家一个实例演示的,不过仔细想想,可能运行结果
会更加直观一些。
C语言代码
#include<stdio.h>
#define MAX 3//缓存最大页面容量 typedef struct clock{int clock[MAX];//存放页面号 int sign[MAX];//存放访问次数,初值为0 }CLOCK;int compare( int a[MAX] )//作用是看任意两个页面的访问次数有没有相同,有则返回1;否则,返回0 。
{int s = a[0],d = 0;for(int i = 0; i < MAX; i++){for(int j = i; j < MAX-1; j++){if(a[i] == a[j+1])d=1;}}return d;
}int Min( int a[MAX] )//作用是返回缓存中最小的页面号
{int min;min = a[0];for(int i = 1; i < MAX; i++){if(min > a[i])min = a[i];}return min;
}
int Max( int a[MAX] )//作用是返回缓存中最大的页面号
{int max;max = a[0];for(int i = 1; i < MAX; i++){if(max < a[i])max = a[i];}return max;
}
int i_value( int a[MAX] )//作用是返回缓存中最小的页面号的地址
{int ivalue,temp = 0;ivalue = a[0];for(int i = 1; i < MAX; i++){if(ivalue > a[i]){ivalue = a[i];temp = i;}}return temp;
}
int I_value( int a[MAX] )//作用是返回缓存中最大的页面号的地址
{int Ivalue,temp = 0;Ivalue = a[0];for(int i = 1; i < MAX; i++){if(Ivalue < a[i]){Ivalue = a[i];temp = i;}}return temp;
}
int main()
{int flag = 0;//0表示访问的这个页面是一个新页面,1表示访问的这个页面已存在于缓存中 int data;//页面号 int mid = 0;//充当中间变量,暂时缓存一个值clock c;for(int i = 0; i < MAX; i++){c.clock[i] = -1;c.sign[i] = 0;}for(int i = 0; i < MAX; i++){flag = 0;printf("请输入第%d个页面号:",i);scanf("%d",&data);for(int j = 0; j < MAX; j++){if(data == c.clock[j])//如果这个页面已存在于缓存中 flag = 1;}if(flag != 1)//如果这个页面不存在于缓存中 c.clock[i] = data;else//如果这个页面已存在于缓存中 {printf("对不起,你输入的页面也存在,请重新输入!\n");i--;}}printf("开始页面分别为\n");printf("\n");for(int i = MAX-1; i >= 0; i--){if( i == MAX-1 )printf("缓存页面->");printf("%d \t",c.clock[i]);}printf("\n\n访问次数->%d \t%d \t%d\n\n",c.sign[2],c.sign[1],c.sign[0]);//打印访问次数while(true){flag = 0;mid = 0;printf("请输入一个新的页面:");scanf("%d",&data);for(int i = 0; i < MAX; i++){if(data == c.clock[i])//如果这个页面已存在于缓存中{c.sign[i]++;//访问次数加1 flag = 1;break;}elseflag = 0;}while( true )//用于更改访问次数的错误记录{if( (Max(c.sign) - Min(c.sign)) > 1 && compare(c.sign) )c.sign[ I_value(c.sign) ]--;else break;}if( flag == 0 )//替换页面 {mid = i_value(c.sign);c.clock[mid] = data;c.sign[mid]++;}//else不替换页面 printf("换替换后的页面结果为\n");printf("\n");for(int i = MAX-1; i >= 0; i--){if( i == MAX-1 )printf("缓存页面->");printf("%d \t",c.clock[i]);}printf("\n\n访问次数->%d \t%d \t%d\n\n",c.sign[2],c.sign[1],c.sign[0]);//打印访问次数 }return 0;
}
执行结果
请输入第0个页面号:6
请输入第1个页面号:5
请输入第2个页面号:4
开始页面分别为缓存页面->4 5 6访问次数->0 0 0请输入一个新的页面:3
换替换后的页面结果为缓存页面->4 5 3访问次数->0 0 1请输入一个新的页面:5
换替换后的页面结果为缓存页面->4 5 3访问次数->0 1 1请输入一个新的页面:4
换替换后的页面结果为缓存页面->4 5 3访问次数->1 1 1请输入一个新的页面:3
换替换后的页面结果为缓存页面->4 5 3访问次数->1 1 2请输入一个新的页面:6
换替换后的页面结果为缓存页面->4 6 3访问次数->1 2 2请输入一个新的页面:
没啥总结好说的,了解还比较短浅,有待更新博客。
如有错误,欢迎告知!
转载需说明,十分感谢!