操作系统学习之用C语言模拟CLOCK算法
前言
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算法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python fromhex_Pytho
- 下一篇: Keil | 解决Keil与VScode