zoukankan      html  css  js  c++  java
  • 页面置换算法-LRU(Least Recently Used)c++实现

    最近最久未使用(LRU)置换算法

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    #include <queue>
    #include <stack>
    #include <map>
    #include <assert.h>
    
    using namespace std;
    const int Maxn = 1500;
    
    typedef struct Page_Node{
        struct Page_Node *next;
        int page_id;
        Page_Node(int v){page_id = v;}
    }*PNode, Node;
    
    class LRU{
    public:
        LRU(int num):blocks_limit(num){
            head = NULL;
        }
        
        ~LRU(){
            delete head;
        }
        
        void update_order(int page_id){
            PNode p = head, last_node = NULL;
            while(p){
                if(p -> page_id == page_id){
                    PNode next_node = p -> next;
                    p -> next = head;
                    if(last_node){
                        last_node -> next = next_node;
                    }head = p;
                    break;
                }
                last_node = p;
                p = p -> next;
            }
        }
    
        void insert_page(int page_id){
            PNode new_node = new Node(page_id);
            PNode tmp = head;
            head = new_node;
            head -> next = tmp;
            existed[page_id] = 1;
        }
    
        void delete_tail_page(){
            assert(NULL != head);
            PNode p = head, last_node = NULL;
            while(p){
                if(p -> next == NULL){
                    existed.erase(p->page_id);
                    if(last_node)
                        last_node -> next = NULL;
                    else{
                        head = NULL;
                    }
                }
                last_node = p;
                p = p -> next;
            }
        }
        
        void disp_page_in_memory(){
            cout<<"页面情况:"<<endl;
            PNode p = head;
            while(p){
                cout<<" "<<p->page_id;
                p = p -> next;
            }cout<<endl;
        }
        
        void call_page(int page_id){
            if(existed[page_id]){
                cout<<"In Memory"<<endl;
                update_order(page_id);
            }else{
                cout<<"Out of Memory"<<endl;
                if(existed.size() > blocks_limit){
                    cout<<"页面置换"<<endl;
                    delete_tail_page();
                    insert_page(page_id);
                }else{
                    cout<<"直接调页"<<endl;
                    insert_page(page_id);
                }
            }
            disp_page_in_memory();
        }
        
    private:
        PNode head;
        map<int, int>existed;
        int blocks_limit;
    };
    
    int main()
    {
        LRU lru(3);
        while(1){
            int t;
            cin>>t;
            lru.call_page(t);
        }
    
        return 0;
    }

    最少使用次数(LFU)置换算法

    先进先出置换算法(FIFO)

  • 相关阅读:
    vim编辑参数
    hive的元数据存储在mysql后,报错的解决方法!
    hadoop添加删除节点
    Android画图Path的使用
    android中path的arcTo方法的使用 .
    StrongReference、SoftReference、WeakReference、PhantomReference .
    为Android应用增加渠道信息 自动化不同渠道的打包过程
    C#知识点
    CSS判断浏览器
    调用外部程序
  • 原文地址:https://www.cnblogs.com/luntai/p/6510228.html
Copyright © 2011-2022 走看看