日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

ub c语言,操作系统之LRU算法 C语言链表实现

發布時間:2024/7/5 windows 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ub c语言,操作系统之LRU算法 C语言链表实现 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

LRU是Least Recently Used的縮寫,即最近最少使用,是一種常用的頁面置換算法,選擇最近最久未使用的頁面予以淘汰。該算法賦予每個頁面一個訪問字段,用來記錄一個頁面自上次被訪問以來所經歷的時間 t,當須淘汰一個頁面時,選擇現有頁面中其 t 值最大的,即最近最少使用的頁面予以淘汰。

為什么要使用鏈表實現呢,因為這個頁面不會很多,內存和資源開銷都小

在計算機中,開銷往往是需要考慮的,我們不希望占用過多的系統資源,動態路由小型網絡使用RIP(Bellman-Ford Routing Algorithm),大型網絡設備用的就是OSPF(dijkstra),當然也有很多方面的考慮,比如RIP配置和管理更簡單,RIP為了避免出現網絡延遲太高,也將路由器最大的允許跳數設為15

我們存儲的時候就按照時間吧,末尾為剛剛使用的,淘汰前面的

然后我們來考慮下這個算法,保證我們不使用無關變量。這個cache是空的

進行一次請求需要查看我當前的cache里是否存在這個數據

1存在

存在就比較簡單了,直接取出數據,頁面數據不變,并把這個結點放在最后

2不存在

2.1cache滿

把最靠前的頁面用讀取數據的數據覆蓋,然后把它放到最后的cache

2.2cache不滿

直接去讀取數據,然后把他放在最后的頁面

我需要維護的是一個編號(或者說地址)還有后結點,然后查詢肯定是O(1)的,這是內部完成的,不需要我考慮(直接得到地址去取數據)

缺頁中斷都對應了一個硬件操作,就是去取這個數據

#include #include

structnode

{intid;struct node *next;

}* head, *tail, *p;voidPushBack()

{/*pre沒有意義,僅需要多保留一個尾結點

p->pre = tail; //使pre指向前一個節點,循環可得到反向鏈表*/p->next =NULL;

tail->next =p;

tail=p;

}voidfun()

{struct node *q;

q=head;while (q->next !=NULL)

{if (q->next->id == p->id)//不缺頁

{

PushBack();

p= q->next;

q->next = p->next;free(p);return; //執行完全部操作停掉

}

q= q->next;

}

printf("發生缺頁中斷 %d\n",p->id);

PushBack();

p= head->next;

head->next = p->next;free(p);

}intmain()

{intsum, n, i;

sum= 0; //初始cache內沒有數據

scanf("%d", &n); //讀入頁數

head = (struct node *)malloc(sizeof(structnode));

head->next =NULL;

tail=head;while (1)

{

p= (struct node *)malloc(sizeof(structnode));

scanf("%d", &p->id);if (p->id < 0)

{break;

}else{if (sum < n) //cache未滿,放至后面

{

PushBack();

printf("發生缺頁中斷 %d\n",p->id);

sum+= 1; //并對cache+1

}else{

fun();

}

}

}return 0;

}

事后來看,我說pre沒有意義是不對的,因為實際上并不是亂序的,往往我們先訪問的到的會被繼續訪問,并不是一個完全的均攤復雜度。

所以應該記錄pre進行倒序,有興趣的可以實現一下,不過我還是覺得c++好寫,但是內部肯定是更厲害的

c++實現就用list搞一下啊,把最近訪問的放到最前面

#include#include

void fun(std::list&L,intx)

{for(std::list::iterator it=L.begin();it!=L.end();it++)

{if(*it==x)

{

L.push_front(x);

L.erase(it);return;

}

}

std::cout<

L.pop_back();

L.push_front(x);

}intmain()

{

std::listL;intsum, n, i,x;

sum= 0; //初始cache內沒有數據

std::cin>>n; //讀入頁數

while (true)

{

scanf("%d", &x);if (x < 0)

{break;

}else{if (sum < n) //cache未滿,放至后面

{

L.push_front(x);

std::cout<

sum+= 1; //并對cache+1

}else{

fun(L,x);

}

}

}return 0;

}

C++ list 因為內部就是雙向鏈表

public classLRUCache{private intlimit;private HashMaphashMap;privateNode head;privateNode end;public LRUCache(intlimit)

{this.limit =limit;

hashMap= new HashMap();

}publicString get(String key){

Node node=hashMap.get(key);if(node ==null)return null;

refreshNode(node);returnnode.value;

}public voidput(String key,String value){

Node node=hashMap.get(key);if(node == null){if(hashMap.size()>=limit)

{

String oldKey=removeNode(head);

hashMap.remove(oldKey);

}

node= newNode(key,value);

addNode(node);

hashMap.put(key,node)

}else{

node.value=value;

refreshNode(node);

}

}public voidremove(String key){

Node node=hashMap.get(key);

removeNode(node);

hashMap.remove(key);

}private voidrefreshNode(Node node)

{if(node ==end)return;

removeNode(node);

addNode(node);

}publicString removeNode(Node node){if(node ==end)

end=end.pre;else if(node ==head)

head=head.next;else{

node.pre.next=node.next;

node.next.pre=node.pre;

}returnnode.key;

}public voidaddNode(Node node)

{if(end!=null)

{

end.next=node;

node.pre=end;

node.next= null;

}

end=node;if(head == null)

head=node;

}

}

Java實現(高并發線程安全使用ConcurrentHashMap

總結

以上是生活随笔為你收集整理的ub c语言,操作系统之LRU算法 C语言链表实现的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。