页面置换算法-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)

 

posted on 2017-03-06 15:34  暴力的轮胎  阅读(879)  评论(0编辑  收藏  举报

导航