------------------------------------------------------------------------------
MC logo
LRU Implementation
[^] CSc 422 Assignment 4
------------------------------------------------------------------------------
[CSc 422 Assignment 1] [CSc 422 Assignment 2] [CSc 422 Assignment 3] [CSc 422 Assignment 4]
[Replacement Main] [replacement_h] [replacement_cpp] [FIFO Class] [LRU Class] [LRU Implementation] [NRU Class] [NRU Implementation] [Reader Test Class]
lru.cpp
#include "lru.h"
LRUReplacementAlg::LRUReplacementAlg(unsigned long num_frame, int page_bits):
        ReplacementAlg(num_frame, page_bits), m_count(0) 
{
        m_counts = new unsigned long [num_frame];
        for(unsigned int i = 0; i < num_frame; ++i) m_counts[i] = 0;
}

void LRUReplacementAlg::ref(const Ref &r)
{
        const PTE *pte = get_PTE_by_page(pageno(r));
        if(pte->is_valid()) m_counts[pte->get_frame()] = m_count++;
        ReplacementAlg::ref(r);
}

// Return the least-recently-used page: the one with the smallest count.
unsigned long LRUReplacementAlg::fault(const Ref &r)
{
        unsigned long ret = 0;
        unsigned long mincount = m_counts[0];
        for(unsigned long i = 1; i < get_num_frames(); ++i) {
                if(m_counts[i] < mincount) {
                        ret = i;
                        m_counts[i] = mincount;
                }
        }

        m_counts[ret] = m_count++;
        return ret;
}