// PagingUnit.cpp Dave Reed 3/20/06 //////////////////////////////////////////////////////////////////////////////// #include #include #include "PagingUnit.h" using namespace std; PagingUnit::PagingUnit(int log, int phys) // constructor // Assumes: log is the number of pages in the page table // phys is the number of frames in physical memory // Results: creates and initializes the page table & freeFrames list { pageTable.resize(log); for (int i = phys-1; i >= 0; i--) { freeFrames.push(i); } } bool PagingUnit::isValid(int pageNum) // Assumes: 0 <= pageNum < page table size // Returns: true if valid bit is set for that index, else false { return pageTable[pageNum].valid; } void PagingUnit::accessPage(int pageNum) // Assumes: 0 <= pageNum < page table size // Returns: the frame number where pageNum is stored { cout << pageNum << ": page found at frame " << pageTable[pageNum].frameNumber << endl; } void PagingUnit::loadPage(int pageNum) // Assumes: 0 <= pageNum < page table size // Results: loads pageNum in a free frame, updating the table { int frameNum; if (freeFrames.empty()) { int swapPage = usedPages.front(); usedPages.pop(); pageTable[swapPage].valid = false; frameNum = pageTable[swapPage].frameNumber; cout << pageNum << ": PAGE FAULT -- swapping page " << pageNum << " into frame " << frameNum << endl << " "; } else { frameNum = freeFrames.top(); freeFrames.pop(); cout << pageNum << ": PAGE FAULT -- inserting page " << pageNum << " into frame " << frameNum << endl << " "; } pageTable[pageNum].frameNumber = frameNum; pageTable[pageNum].valid = true; usedPages.push(pageNum); }