導航:首頁 > 源碼編譯 > clru演算法實現

clru演算法實現

發布時間:2022-09-08 22:08:44

1. 求一段C語言代碼,實現近似LRU頁置換,運用附加引用位演算法

網上查一下

2. 使用C語言模擬擁有若干個虛頁的進程在給定的若干個實頁中運行 在缺頁中斷使用FIFO和LRU演算法進行頁面置換。

3. 又沒有c語言java語言比較厲害的幫我寫個代碼,不難,會的話估計不到20分鍾就寫完了頁面lru演算法

貼一個我寫的LRU cache演算法,用c++實現的
具體的數據結構用的一個鏈表加一張哈希表。
實現了set和get, 需要另外的功能我還可以再寫。
class LRUCache{
struct cacheEntry{
int key;
int value;
cacheEntry(int c, int v):key(c),value(v){}
};

int _cap;
list<cacheEntry> entryList;
unordered_map<int, list<cacheEntry>::iterator> entryMap;

void moveToHead(list<cacheEntry>::iterator it, int key, int value)
{
entryList.erase(it);
cacheEntry tmp(key, value);
entryList.push_front(tmp);
entryMap[key]=entryList.begin();
}
public:
LRUCache(int capacity) {
_cap=capacity;
}

int get(int key) {
if(entryMap.find(key)==entryMap.end())
return -1;
else{
moveToHead(entryMap[key], key, entryMap[key]->value);
return entryMap[key]->value;
}
}

void set(int key, int value) {
if(entryMap.find(key)==entryMap.end()){
if(entryList.size()>=_cap){
entryMap.erase(entryList.back().key);
entryList.pop_back();
}
cacheEntry tmp(key, value);
entryList.push_front(tmp);
entryMap[key]=entryList.begin();
}
else{
entryMap[key]->value=value;
moveToHead(entryMap[key], key, value);
}
}
};

4. C語言用以下函數構造LRU演算法,求大俠幫助

#include <stdio.h>
#include <conio.h>
#include <stdlib.h>

#define MAINMEM 3 //主存可存儲的頁面個數
#define QUEUEMAXLEN 30 //隊列最大長度

struct LRUQueue //定義一個特殊的隊列
{
int number;
int data[MAINMEM];
}lru;

void Init(); //初始化操作
void Add(int pageID); //加入隊列
int Find(int pageID); //查找頁面是否在主存中
void Update(int pos); //更新頁所在的地址
void PrintQueue(); //輸出主存內容

int main()
{
int i;
int queuelength;
int queue[QUEUEMAXLEN];

Init(); //初始化操作

printf("請輸入隊列的長度:");
scanf("%d",&queuelength);

printf("請以此輸入隊列的頁號:");
for(i=0;i<queuelength;i++)
{
scanf("%d",&queue[i]);
Add(queue[i]);
PrintQueue();
}

system("pause");
return 0;
}
void Init()
{
lru.number = 0;
int i;
for(i = 0;i<MAINMEM;i++)
{
lru.data[i] = -1;
}
}
int Find(int pageID)
{
int i;
for (i=0;i<MAINMEM;i++)
{
if(lru.data[i] == pageID)
{
return i;
}
}
return 0;
}
void Update(int pos)
{
int tmp = lru.data[pos];
int i;
for(i = pos;i<lru.number;++i)
{
lru.data[i] = lru.data[i+1];
}
lru.data[lru.number-1] = tmp; //將被訪問的頁放在最後一位,其他的頁前移,因為置換時刪掉的是主存中第一塊放置的頁面
}
void PrintQueue()
{
printf("當前內存中的頁號:\n");
int i;
putch('|');
for(i = 0;i<MAINMEM;i++)
{
if(lru.data[i] == -1)
printf(" |");
else
printf("%d |",lru.data[i]);
}
putch('\n');
}
void Add(int pageID)
{
printf("當前訪問的頁面:%d\n",pageID);
if(lru.number<MAINMEM) //如果主存沒有填滿
{
int pos = Find(pageID);
if(pos)
{
Update(pos);
}
else
{
lru.data[lru.number++]=pageID;
}
}
else
{
int pos = Find(pageID);
if(pos)
{
Update(pos);
}
else
{
int i;
for(i=0;i<MAINMEM-1;i++)
{
lru.data[i]=lru.data[i+1]; //數據左移一個單位
}
lru.data[i]=pageID; //加入新數據
}
}
}

5. 怎麼樣實現分頁管理的缺頁調度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();

}
}

6. 模擬頁式虛擬存儲管理中硬體地址變換和缺頁中斷,並用LRU演算法處理缺頁中斷,用C語言做

這個問題太專業,人我不知道。

7. 誰會用c語言編寫lru演算法

是模擬還是直接操控操作系統內存?模擬的話簡單,直接操控系統內存不會。。。

8. 求一段C語言代碼,實現近似LRU頁置換,運用二次機會演算法。

二次機會演算法我有。
但是我不明白你說的內存幀數是什麼意思。是內存物理塊的意思嗎?
錯誤頁數又是什麼意思呢?

9. 問幾個計算機組成與系統結構的問題 急用

1
因為,藉由交叉存儲方式,可以實現對連續字成塊傳遞的多模塊流水式並行存取. cpu同時訪問4個模塊,內存器控制部件控制它們分時使用數據匯流排進行信息傳遞。對每一個存儲器模塊而言,從cpu給出訪存命令直到讀出信息仍然使用一個存取周期時間,但對cpu而言,它可以在一個存取周期內連續訪問4個模塊,各模塊的讀寫過程重疊進行。所以多模塊交叉存儲器是一種並行存儲器結構,可以大大提高存儲器器寬頻。

2
(1)2^20*32/8=4mb
(2) (4mb*8)/(512kb*8)=8
(3) 8=2^3 3片

3
命中率 2000/(2000+180)=0.92
平均訪問時間 0.92*40+(1-0.92)*250=56.8
效率 40/56.8=70%

4 不會

5頁面訪問序列 0 2 5 4 ⑤ ② ⑤ ② 3 ⑤ 2 ④ 命中率
fifo演算法 a 0 2 5 4 4 4 4 4 3 3 2 2 6/12=50%
+ b 0 2 5 ⑤ ⑤ ⑤ ⑤ 4 4 3 3
lru演算法 c 0 2 2 ② ② ② ⑤ ⑤ 4 ④
命中 命中命中命中 命中 命中

閱讀全文

與clru演算法實現相關的資料

熱點內容
卡爾曼濾波演算法書籍 瀏覽:768
安卓手機怎麼用愛思助手傳文件進蘋果手機上 瀏覽:843
安卓怎麼下載60秒生存 瀏覽:802
外向式文件夾 瀏覽:235
dospdf 瀏覽:430
怎麼修改騰訊雲伺服器ip 瀏覽:387
pdftoeps 瀏覽:492
為什麼鴻蒙那麼像安卓 瀏覽:735
安卓手機怎麼拍自媒體視頻 瀏覽:185
單片機各個中斷的初始化 瀏覽:723
python怎麼集合元素 瀏覽:480
python逐條解讀 瀏覽:832
基於單片機的濕度控制 瀏覽:498
ios如何使用安卓的帳號 瀏覽:882
程序員公園采訪 瀏覽:811
程序員實戰教程要多長時間 瀏覽:974
企業數據加密技巧 瀏覽:134
租雲伺服器開發 瀏覽:813
程序員告白媽媽不同意 瀏覽:335
攻城掠地怎麼查看伺服器 瀏覽:600