前言

CLOCK算法,顾名思义,时钟算法,是一个在FIFO和LRU的折衷算法,很符合我们的中庸之道,来学一学它折衷了哪些部分。

Buddy算法:操作系统学习之用C语言模拟伙伴(Buddy)算法
FIFO算法:操作系统学习之用C语言模拟FIFO算法
LRU算法:操作系统学习之用C语言模拟LRU算法
Clock算法:操作系统学习之用C语言模拟CLOCK算法
本源代码原创,转载请注明,同时由于本人才疏学浅,刚入门操作系统,如有错误敬请指教
本文原创,创作不易,转载请注明!!!
本文链接
个人博客:https://ronglin.fun/?p=205
PDF链接:见博客网站
CSDN: https://blog.csdn.net/RongLin02/article/details/117632407

算法模拟

教科书原图

算法解释

先来看看课本上的解释。
时钟策略有很多的变种,最简单的时钟策略需要给每个页框关联一个使用位的附加位。当某页首次装入内存时,将该页框的使用位置为1;该页随后被访问时(在访问产生缺页中断后),其使用位也会置为1。对于页面置换算法,用于置换的候选页框集(当前进程:局部范围;整个内存:全局范围)被视为一个循环缓冲区,并有一个指针与之相关联,当一页被置换时,该指针被置为指向缓冲区中的下一个页框。需要置换一个页时,操作系统扫描缓冲区,查找使用位为 0的一个页框。每当遇到一个使用位为1的页框,操作系统就会将该位重置为0;若在这个过程开始时,缓冲区中所有页框的使用位均为0,则选择遇到的第一个页框置换;若所有页框的使用位均为1,则指针在缓冲区中完整地循环一周,把所有使用位都置为0,并且停留在最初的位置上,置换该页框的页。可见,该策略类似于FIFO,唯一不同的,在时钟策略中会跳过使用位为1的页框。这种策略称位时钟策略的原因是,我们可以把页框想象在一个环中。 ——操作系统-精髓与设计原理(第九版)P227

代码解释

教科书的解释太多了。简单说一下大概意思,就是当扫描的时候,还是用的FIFO,从头扫描到尾,但是不同的是,每个页框都有一个"免死金牌",当第一次扫描到的时候,如果有"免死金牌"就用掉金牌,如果没有则直接被替换。好处就是考虑到了程序的局部性原理,而且开销相比LRU小很多,只用维护"免死金牌"量就行了。

解释一下代码过程,当一个"页框"到来时 ,先找一遍,CLOCK_list中有没有,如果有,更新一下"免死金牌",如果没有,则开始执行时钟算法,从index指针开始扫描,若有"免死金牌"(flag)就用掉金牌(flag = 0),如果没有"免死金牌",则置换这一页。如果index到了队尾,就把其放置到开头。

源代码

#include<stdio.h>
#define MAX_NUM 3
#define MAX_NUM_PROC 512//进程结构体
struct CList
{int data;int flag;
}CLOCK_list[MAX_NUM];/*
12
2 3 2 1 5 2 4 5 3 2 5 2
*/int main()
{for(int i=0;i<MAX_NUM;i++){CLOCK_list[i].data = 0;CLOCK_list[i].flag = 0;}int n;int a[MAX_NUM_PROC];printf("请输入个数:");scanf("%d",&n);printf("请输入%d个非零数字:\n",n);for(int i=0;i<n;i++){scanf("%d",&a[i]);}int index = 0;for(int i=0;i<n;i++){int exist =0;for(int j=0;j<MAX_NUM;j++){if(CLOCK_list[j].data == a[i]){CLOCK_list[j].flag =1;exist = 1;break;}}if(!exist){int full = 0;for(;index<MAX_NUM;index++){if(CLOCK_list[index].flag ==0){full = 1;CLOCK_list[index].data = a[i];CLOCK_list[index].flag =1;index++;break;}else{CLOCK_list[index].flag =0;}}if(index == MAX_NUM)index = 0;//如果满了,置换第一页if(!full){CLOCK_list[0].data = a[i];CLOCK_list[0].flag =1;index++;}}printf("本次队列情况:");for(int j=0;j<MAX_NUM;j++){printf("%d",CLOCK_list[j].data);if(CLOCK_list[j].flag == 1){printf("*");}else{printf("#");}(j==MAX_NUM-1)?printf("\n"):printf(" ; ");}}return 0;
}

输出解释

请输入个数:12
请输入12个非零数字:
2 3 2 1 5 2 4 5 3 2 5 2
本次队列情况:2* ; 0# ; 0#
本次队列情况:2* ; 3* ; 0#
本次队列情况:2* ; 3* ; 0#
本次队列情况:2* ; 3* ; 1*
本次队列情况:5* ; 3# ; 1#
本次队列情况:5* ; 2* ; 1#
本次队列情况:5* ; 2* ; 4*
本次队列情况:5* ; 2* ; 4*
本次队列情况:3* ; 2# ; 4#
本次队列情况:3* ; 2* ; 4#
本次队列情况:3* ; 2# ; 5*
本次队列情况:3* ; 2* ; 5*

*表示还有"免死金牌",#表示没有"免死金牌"了,结果和书上的一样,不在解释了。

总结

CLOCK算法是一个很有意思的算法,最开始想用一个循环双向链表表示的,但是循环双向链表维护起来比较麻烦,我就用一个数组来维护吧。=w=

操作系统学习之用C语言模拟CLOCK算法相关推荐

  1. 操作系统学习之用C语言模拟LRU算法

    前言 LRU算比较经典,而且考的也比较多,LRU算法全称Least Recently Used,译为最近最少使用.用C模拟一下吧. Buddy算法:操作系统学习之用C语言模拟伙伴(Buddy)算法 F ...

  2. 操作系统学习之用C语言模拟FIFO算法

    前言 FIFO算法比较简单,没什么好说的,就是先进先出.不过我添加了3状态,不过也只有堵塞,没有将阻塞进程唤醒的过程. Buddy算法:操作系统学习之用C语言模拟伙伴(Buddy)算法 FIFO算法: ...

  3. 操作系统学习之用C语言模拟伙伴(Buddy)算法

    前言 学到了操作系统的的虚拟内存部分,硬件不太好的我学起来有些吃力,概念性知识点太多,所以我决定用软件的方式,实现一下虚拟内存常用的算法,因为用到了指针,暂时用C语言写一下Buddy算法.FIFO算法 ...

  4. c语言模拟量算法,常见模拟量信号检测方法-20210323031040.ppt-原创力文档

    第三章 常见模拟量信号的检测方法 1. 电压类信号的检测 3. 电阻型信号的检测 重点: 2. 频率及周期型信号的检测 3.1 概述 智能仪器中起控制作用的微处理器所处理的信号是二进制的数字信号,但物 ...

  5. java语言模拟_Java语言模拟操作系统.doc

    河北大学2010级操作系统课程设计论文 PAGE PAGE 27 装订线 装 订 线 (指导教师用表) 学 生 姓 名 指 导 教 师 论文(设计)题目 Java语言模拟操作系统 主要研究 (设计)内 ...

  6. 操作系统大作业 基于Linux的模拟进程调度算法 运用c++语言编程 在VMware虚拟机里 centos 亲自写亲自测试 代码 说明书

    发布文章 博文管理我的博客退出 Trash Temp 操作系统大作业 基于Linux的模拟进程调度算法 运用c++语言编程 在VMware虚拟机里 centos 亲自写亲自测试 代码 说明书 @[TO ...

  7. 分享--操作系统学习

    分享--操作系统学习 链接: https://mp.weixin.qq.com/s?__biz=MzI1OTY2MzMxOQ==&mid=2247487662&idx=1&sn ...

  8. 处理机调度实验c语言,操作系统实验处理机调度C语言实现

    操作系统实验处理机调度C语言实现 下载提示(请认真阅读)1.请仔细阅读文档,确保文档完整性,对于不预览.不比对内容而直接下载带来的问题本站不予受理. 2.下载的文档,不会出现我们的网址水印. 3.该文 ...

  9. c语言处理机调度实验报告,操作系统实验处理机调度C语言实现.docx

    操作系统实验处理机调度C语言实现.docx 下载提示(请认真阅读)1.请仔细阅读文档,确保文档完整性,对于不预览.不比对内容而直接下载带来的问题本站不予受理. 2.下载的文档,不会出现我们的网址水印. ...

最新文章

  1. 手写自己的MyBatis框架-语句执行处理
  2. invalid signature_php,微信开发JSSDK遇到的问题 config:invalid signature
  3. 720p/30fps,谷歌人体分割模型Bodypix再次更新,针对Coral开发板优化
  4. C语言:计算1!+2!+3!+...+100!
  5. 基于cocos creator 3.4 实现虚拟摇杆
  6. 华为交换机命令 简单配置DHCP
  7. 如何删除ppt自带背景音乐_ppt模板里自带的背景乐怎么去掉?
  8. 电影社交网络中Facemash女生评比算法讲解
  9. 最新财报发布+天猫618双榜第一,耐克蓄力领跑下个50年
  10. MIPS Linux内核编译构建环境的搭建
  11. pip install 安装的问题
  12. 什么软件测试iphone性能,iPhone浏览器性能测试
  13. template <typename T>用法
  14. 为什么我建议你现在Vue 3?
  15. 如何判别lib文件是静态库还是动态库的导入文件呢
  16. FAERIE QVEENE 仙后节选
  17. DeFi发币潮:大户秀起操作,真没散户什么事?
  18. 17.AtomicInteger、AtomicBoolean的底层原理
  19. 谷歌自研芯片Tensor重磅来袭:“机器学习的里程碑”
  20. 员工如何应对工作中的挫败感

热门文章

  1. MyEclipse 2017 CI 9 发布(附下载)
  2. EntityFramework Core映射关系详解
  3. laravel 5.1 添加第三方扩展库
  4. JDK1.3安装出现/lib/ld-linux.so.2: bad ELF interpreter: No such file or directory Done.
  5. C#验证控件使用方法及常用正则表达式例析转
  6. C++从入门到放肆!
  7. 程序员的搞笑日常,你们懂得!....
  8. 大数据总结微信自媒体运营
  9. 第一句就是定义了一种ptrfun的C++类型
  10. DirectSound