當前位置:首頁 » 操作系統 » clock演算法

clock演算法

發布時間: 2022-01-08 16:57:51

㈠ 怎麼樣實現分頁管理的缺頁調度clock演算法C語言代碼

這個程序我做過,現在給你!!寫了很久的!!

#include<stdafx.h>
#include<stdlib.h>
#include<stdio.h>
#define n 64//實驗中假定主存的長度
#define m 4//實驗中假定每個作業分得主存塊塊數
int p[m];//定義頁
int head=0;
struct
{
short int lnumber;//頁號
short int flag;//表示該頁是否在主存,"1"表示在主存,"0"表示不在主存
short int pnumber;//該頁所在主存塊的塊號
short int write;//該頁是否被修改過,"1"表示修改過,"0"表示沒有修改過
short int dnumber;//該頁存放在磁碟上的位置,即磁碟塊號
short int times;//被訪問的次數,用於LRU演算法
}page[n];//定義頁表
//各個函數的實現如下:
void computer()
{
int i;
for(i=0;i<n;i++)
{
page[i].lnumber = i;
page[i].flag = 0;
page[i].pnumber = 10000;//用10000表示為空
page[i].write = 0;
page[i].dnumber = i;
page[i].times = 0;
}//初始化頁表

for(i=0;i<m;i++)
{
page[i].pnumber = i;
}

for(i=0;i<m;i++)
{
p[i] = i;
page[i].flag = 1;
}//初始化頁
}
void showpagelist()
{
int i;
printf("\n頁號\t是否在主存中\t塊 號\t是否被修改過\t磁碟塊號\t訪問次數\n");
for(i=0;i<n;i++)
{
printf("%d\t%d\t\t%d\t\t%d\t\t%d\t\t%d\n",page[i].lnumber,page[i].flag,page[i].pnumber,page[i].write,page[i].dnumber,page[i].times);
}
}
void showpage()
{
int i;
for(i=0;i<m;i++)
{
printf("\t%d\n",p[i]);
}
}
void transformation() //缺頁中斷處理
{
unsigned logicAddress,logicNumber,innerAddress,physicsAddress,physicsNumber;
int i, fail = 0;
int method,temppage=0;
short int times = 10000;
printf("請輸入一個邏輯地址(四位十六進制數):");
scanf("%x",&logicAddress);//讀入邏輯地址
logicNumber = logicAddress >> 10;//得到頁號
printf("頁號為:%ld\n",logicNumber);
innerAddress = logicAddress & 0x03ff;//得到頁內地址
printf("頁內地址為:%ld\n",innerAddress);
for(i=0;i<n;i++)
{
if(logicNumber==(unsigned)page[i].lnumber)
{
if(page[i].flag == 1)
{
printf("請求的頁面在主存中!\n");
page[i].times++;
physicsNumber = page[i].pnumber;//由頁號得到塊號
printf("請求的主存塊號為:%ld\n",physicsNumber);
physicsAddress = physicsNumber << 10 |innerAddress;//得到物理地址
printf("請求的物理地址為:%ld",physicsAddress);//輸出物理地址
break;
}
else
{
printf("請求的頁面不在主存中! 將進行缺頁中斷處理!\n請選擇演算法!\n");
printf("1.先進先出\n2.最近最少用\n請選擇置換演算法:");
scanf("%d",&method);
if(method == 1) //採用先進先出演算法
{
printf("採用先進先出演算法!\n");
fail = p[head];
printf("第%d頁將被替換!\n",fail);
p[head] = logicNumber;
head = (head+1) % m;
if(page[fail].write == 1)
printf("第%d頁曾被修改過!\n",fail);
page[fail].flag = 0;
page[logicNumber].flag = 1;
page[logicNumber].write = 0;
page[logicNumber].pnumber = page[fail].pnumber;
page[fail].pnumber = 10000;
page[logicNumber].times++;
break;
}
else if(method == 2) //採用最近最少用演算法
{
printf("採用最近最少用演算法!\n");
for(i=0;i<n;i++)
{
if(page[i].flag == 1)
{
if(page[i].times<times)
{
times = page[i].times;
temppage = page[i].lnumber;
}
}
}
printf("第%d頁將被替換!\n",temppage);
for(i=0;i<m;i++)
{
if(p[i] == temppage)
{
p[i] = logicNumber;
}
}
if(page[temppage].write == 1)
printf("第%d頁曾被修改過!\n",temppage);
page[temppage].flag = 0;
page[logicNumber].flag = 1;
page[logicNumber].write = 0;
page[logicNumber].pnumber = page[temppage].pnumber;
page[temppage].pnumber = 10000;
page[logicNumber].times++;
break;
}
else
{
printf("你輸入有誤,即將退出!");
exit(1);
}
}
}
}
}
void main()
{
char c,d,flag='y';
printf("頁表正在初始化中...,3秒鍾後為你顯示頁和頁表!\n");
computer();
showpage();
showpagelist();
while(flag == 'y' || flag == 'Y')
{
transformation();
printf("是否顯示頁和頁表?(Y/N)");
c = getchar();
c = getchar();
if(c=='Y'||c=='y')
{
showpage();
showpagelist();
}
else
{
while(c=='N'||c=='n')
{
printf("\n是否繼續進行請求分頁?(Y/N)");
d = getchar();
d = getchar();
if(d=='Y'||d=='y')
{
transformation();
printf("\n是否顯示頁和頁表?(Y/N)");
c = getchar();
c = getchar();
if(c=='Y'||c=='y')
{
showpage();
showpagelist();
}
}
else if (d=='N'||d=='n')
exit(1);
else
printf("輸入錯誤!\n");
}
}
printf("\n是否繼續進行請求分頁?(Y/N)");
flag = getchar();
flag = getchar();

}
}

㈡ C++編程,clock置換演算法

#include<iostream>
#include<stdlib.h>
#include<time.h>
#define N 20 //虛擬內存尺寸
using namespace std;

int P;
int const blockCount=3 ;//內存中的物理塊數
int count = 0;
int block[blockCount];
int const PageCount=15;//總的頁面數
int Page[PageCount];
int state[blockCount];//clock置換演算法中,內存中的每個頁面號對應的狀態
int state2[blockCount][2];// 二維數組,第一行第一列為訪問位,第一行的第二列為修改位
double lost= 0.0;

void generate_list(int *list,int e,int m,int t)
{
int i,j=0,q=P,r;
srand((unsigned)time(NULL));
while(j<e)
{
for(i=j;i<j+m;i++)
{
if(i==e)
break;
list[i]=(q+rand()%e)%N; //保證在虛擬內存的頁號內
}
j=i;
r=rand()%100;
if(r<t)
q=rand()%N;
else
q=(q+1)%N;
}
}

//隨機生產是否被修改的情況,prop(0……100),prop/100的概率為被修改
void generate_modify(int *mo,int e,int prop)
{
int i,t;
for(i=0;i<e;i++)
{
t=rand()%100;
if(t>prop)
mo[i]=0;
else
mo[i]=1;
}
}

//檢測頁號是否在內存中
bool inblock(int num)
{
for(int i=0; i<blockCount;i++)
{
if(block[i] == Page[num])
{
state[i] = 1;
return true;
}
}
return false;
}

//判斷頁面是否已經被修改
bool change()
{
if((rand()%2+1) == 1 )
{
printf("該頁面被修改!\n");
return true;
}
else
return false;
}

//用於改進型clock置換演算法,檢測頁號是否在內存中並把訪問位和修改位置1
bool inblock2(int num)
{
for(int i=0;i<blockCount;i++){
if(block[i] == Page[num]){
if(change()){
state2[i][0] = 1;
state2[i][1] = 1;
}
else{
state2[i][0] = 1;
}
return true;
}
}
return false;
}

//用於改進型clock置換演算法,判斷內存中第幾個需要被置換
int whichpage(){

int j;

for(j=0;j<blockCount;j++)
{
if(state2[j][0] == 0&&state2[j][1] == 0)
{
return j;
}
}
for(j=0;j<blockCount;j++ )
{
if(state2[j][0] == 0&&state2[j][1] == 1)
{
return j;
}
state2[j][0] = 0 ;
}
for(j=0;j<blockCount;j++ )
{
state2[j][0] =0 ;
}
return whichpage();
}

//簡單Clock置換演算法
void CLOCK(int num)
{
int j;

if(inblock(num))
{
printf("命中!\n");
lost++;
for(int i=0;i<blockCount;i++)
printf("物理塊%d#中內容:%d\n",i,block [i]);
}
else
if(count == blockCount)
{
//lost++;
for(j=0;j<blockCount; )
{
if(state[j] == 0)
{
break;
}
else{
state[j] = 0;
}
j++;
j = j%3;
}
block[j] = Page[num];
state[j] = 1;
for(int i=0;i<blockCount;i++)
printf("物理塊%d#中內容:%d\n",i,block[i]);
}
else{
block[count] = Page[num];
count++;
for(int i=0;i<blockCount;i++)
printf("物理塊%d#中內容:%d\n",i,block[i]);
}
}

//改進型clock置換演算法
void LCLOCK(int num)
{
int j;

if(inblock2(num))
{
printf("命中!\n");
lost++;
for(int i=0;i<blockCount;i++)
printf("物理塊%d#中內容:%d\n",i,block[i]);
}
else
if(count == blockCount)
{
//lost++;
j = whichpage();
block[j] = Page[num];
state2[j][0] = 1;
for(int i=0;i<blockCount;i++)
printf("物理塊%d#中內容:%d\n",i,block[i]);
}
else{
block[count] = Page[num];
count++;
for(int i=0;i<blockCount;i++)
printf("物理塊%d#中內容:%d\n",i,block[i]);
}
}

int main()
{
int a[N];
int mo[N];
int A=10;
int e,m,prop,t,j;
printf("頁面走向為:");
generate_list(a, e,m,t);
generate_modify(mo,e,prop);

for(int i = 0;i<PageCount;i++)
{

Page[i] =rand()%9 + 1;
printf("%d ",Page[i]);
}
char ch ;
printf("\n");
printf("\t\t1 Clock置換演算法\n");
printf("\t\t2 改進型Clock置換演算法\n");
printf("\t\t3 退出!\n\n");
printf("請輸入演算法序號:\t\n");
while(1){
scanf("%c",&ch);
switch(ch){
case '1':{
lost=0;
count=0;
for(int m=0;m<blockCount;m++)
{
state[m] = 0;
}
for(int j=0;j<blockCount;j++)
{
block[j]=0;
}
for(int i=0;i<PageCount;i++)
{
printf("讀入Page[%d]\n",i);
CLOCK(i);
}
printf("頁面訪問次數: %d\n缺頁次數: %0.lf\n",PageCount,PageCount-lost);
printf("缺頁率為:%0.001f\n",(PageCount-lost)/PageCount);
printf("\n請輸入演算法序號:\t");
}break;
case '2':{
lost = 0;
count = 0;
for(int m = 0; m < blockCount; m++)
{
for(int n = 0; n < 2;n++)
state2[m][n] = 0;
}
for(int j = 0; j < blockCount; j++)
{
block[j] = 0;
}
for(int i = 0; i < PageCount; i++)
{
printf("讀入Page[%d]\n",i);
LCLOCK(i);
}
printf("頁面訪問次數: %d\n缺頁次數: %0.lf\n",PageCount,PageCount-lost);
printf("缺頁率為:%0.001f\n",(PageCount-lost)/PageCount);
printf("\n請輸入演算法序號:\t");
}break;
case '3':{
exit(0);
}
}
}
return 0;
}

㈢ OPT演算法,FIFO演算法,CLOCK演算法和LRU演算法

其實這種題目是非常簡單的:

頁號:2,3,2,1,4,5,2,4,5,1,3,2,5,2
O: 1 3 4 1 共有4次中斷
F: 2 3 1 4 5 2 1 共有7次中斷
C: 3 2 1 2 4 5 1 共有7次中斷
L: 3 1 2 4 5 1 共有6次中斷

㈣ 操作系統,什麼是clock演算法

clock()是C/C++中的計時函數,而與其相關的數據類型是clock_t。在MSDN中,查得對clock函數定義如下:
clock_t clock(void) ;
簡單而言,就是該程序從啟動到函數調用佔用CPU的時間。這個函數返回從「開啟這個程序進程」到「程序中調用clock()函數」時之間的CPU時鍾計時單元(clock tick)數,在MSDN中稱之為掛鍾時間(wal-clock);若掛鍾時間不可取,則返回-1。其中clock_t是用來保存時間的數據類型。

㈤ 操作系統CLOCK置換演算法的題目,急求解!!

因為一個目錄文件最多可以由4個磁碟塊組成,讀目錄和下級目錄的時候,在最好的情況下,總能在第一個磁碟塊上就能找到所需的下級目錄信息,所以ADKQ四個目錄讀四次就可以了,此後是讀文件,理想情況下所需頁面可以通過前10個索引直接找到,此時只需再讀一次就能讀到所需頁了,結果最少共用5次

最壞情況下,每個目錄都存放在4個磁碟塊的最後一個上,因此每個目錄都得讀四次,一共4*4=16次,而找到文件後,所需頁面又得通過2級索引去找,這樣一來2級索引表讀一次,1級索引表又讀一次,頁面本身內容再讀一次,又需2+1=3次,所以最壞情況就是16+3=19次

㈥ 試說明改進形clock頁面置換演算法的基本原理

這很簡單啊,要打字太多了。不過網上這類演算法舉例很少,就看你怎麼理解了。

改良後的Clock演算法
考慮到如果某一調入內存的頁沒有被修改過,則不必將它拷回到磁碟。於是在改進的Clock增加了一個M位, M=0 表示該頁未被修改過。這樣我們選擇頁面換出時,既要最近未訪問過的頁面,又要未被修改過的頁面。其執行過程分一下三步:
第一步:從開始位置循環掃描隊列,尋找A=0、M=O的第一類面,找到立即置換。另外,第一次掃描期間不改變訪問位A。
第二步:如果第一步失敗,則開始第二輪掃描,尋找A=0且M=1的第二類頁面,找到後立即置換,並將所有掃描過的A都置0。
第三步:如果第二步也失敗,則返回指針開始位置,然後重復第一步,必要時再重復第二步,此時必能找到淘汰頁。

㈦ nru演算法----改進型"clock"演算法

CLOCK演算法的性能比較接近LRU,而通過增加使用的位數目,可以使得 CLOCK演算法更加高效。在使用位的基礎上再增加一個修改位,則得到改進型的 CLOCK置換演算法。這樣,每一幀都處於以下四種情況之一:
1)最近未被訪問,也未被修改(u=0,m=0)
2)最近被訪問,但未被修改(u=1,m=0)。
3)最近未被訪問,但被修改(u=0,m=1)
4)最近被訪問,被修改(u=1,m=1)
演算法執行如下操作步驟:
1)從指針的當前位置開始,掃描幀緩沖區。在這次掃描過程中,對使用位不做任何修改。選擇遇到的第一個幀(u=0,m=0)用於替換。
2)如果第1)步失敗,則重新掃描,查找(u=0,m=1)的幀。選擇遇到的第一個這樣的幀用於替換。在這個掃描過程中,對每個跳過的幀,把它的使用位設置成0。

3)如果第2)步失敗,指針將回到它的最初位置,並且集合中所有幀的使用位均為0。重復第1步,並且如果有必要,重復第2步。這樣將可以找到供替換的幀。
改進型的 CLOCK演算法優於簡單CLOC演算法之處在於替換時首選沒有變化的頁。由於修改過的頁在被替換之前必須寫回,因而這樣做會節省時間。

㈧ C#語言寫的CLOCK演算法模擬

你好。
很幸運看到你的問題。
但是又很遺憾到現在還沒有人回答你的問題。也可能你現在已經在別的地方找到了答案,那就得恭喜你啦。
對於你的問題我愛莫能助!
可能是你問的問題有些專業了。或者別人沒有遇到或者接觸過你的問題,所以幫不了你。建議你去問題的相關論壇去求助,那裡的人通常比較多,也比較熱心,可能能快點幫你解決問題。
希望我的回答也能夠幫到你!
快過年了,
最後祝您全家幸福健康快樂每一天!

㈨ clock演算法掃描順序是怎樣的,也就是說「時鍾」的刻度是怎樣個順序

如果沒有明確指明,一般按頁裝入順序繪制clock,指針指向最先裝入的頁面。

㈩ 誰能給個詳細的clock置換演算法如題,看了網上有好多版本,指針有的移動有的不移動.誰能給個確定的

我也很郁悶,去年那道標准答案和書上說的就不一樣。哎,考試的時候寫清楚演算法,我想改卷老師應該會酌情給分的

熱點內容
單片機android 發布:2024-09-20 09:07:24 瀏覽:760
如何提高三星a7安卓版本 發布:2024-09-20 08:42:35 瀏覽:661
如何更換伺服器網站 發布:2024-09-20 08:42:34 瀏覽:308
子彈演算法 發布:2024-09-20 08:41:55 瀏覽:286
手機版網易我的世界伺服器推薦 發布:2024-09-20 08:41:52 瀏覽:814
安卓x7怎麼邊打游戲邊看視頻 發布:2024-09-20 08:41:52 瀏覽:160
sql資料庫安全 發布:2024-09-20 08:31:32 瀏覽:91
蘋果連接id伺服器出錯是怎麼回事 發布:2024-09-20 08:01:07 瀏覽:505
編程鍵是什麼 發布:2024-09-20 07:52:47 瀏覽:655
學考密碼重置要求的證件是什麼 發布:2024-09-20 07:19:46 瀏覽:479