#include "nru.h" // Attempt to choose a page to replace using an NRU algorithm. This // implementation searches all the real pages, and starts each search // with the page after the last one found. unsigned long NRUReplacementAlg::fault(const Ref &r) { // Stuff we found (by class). The class 3 is filled in with the // starting page. It may not be class 3, but we won't use the entry // unless it happens to be true (in fact, when all pages are class 3). bool found[4] = { false, false, false, true }; unsigned long which[4] = { 0, 0, 0, m_scan_start }; // Search for one of each class. If we find a 0, end the search. unsigned long scan = m_scan_start; do { // If it rolls around, will find a cleared entry. int pageclass = cl(get_PTE_by_frame(scan)); if(pageclass < 3 && !found[pageclass]) { found[pageclass] = true; which[pageclass] = scan; if(pageclass == 0) break; } increal(scan); } while(scan != m_scan_start); // See what we found, and return it. for(int cl = 0; cl <= 3; ++cl) { // The last entry of found[] is true, so this if will always // be true in some iteration. if(found[cl]) { m_scan_start = which[cl]; return increal(m_scan_start); } } } // Clear all the referenced bits. void NRUReplacementAlg::maint() { for(unsigned long frameno = 0; frameno < get_num_frames(); ++frameno) { PTE *pte = get_PTE_by_frame(frameno); if(pte) pte->clr_ref(); } }