// PageTable.cpp Dave Reed 11/20/02 #include #include "PageTable.h" using namespace std; PageTable::PageTable(int log, int phys): pageMap(log), valid(log), timeStamp(log), freeFrames(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 entries in the page table { currentTime = 0; for (int i = 0; i < log; i++) { valid[i] = false; timeStamp[i] = 0; } for (int j = 0; j < phys; j++) { freeFrames[j] = phys-j-1; } } bool PageTable::GetValid(int index) // Assumes: 0 <= index < page table size // Returns: true if valid bit is set for that index, else false { return valid[index]; } void PageTable::SetValid(int index, bool status) // Assumes: 0 <= index < page table size // Results: sets the valid bit for that index to status { valid[index] = status; } int PageTable::GetFrameNumber(int index) // Assumes: 0 <= index < page table size // Returns: the frame number stored at that index of the table { return pageMap[index]; } void PageTable::SetFrameNumber(int index, int frameNum) // Assumes: 0 <= index < page table size // Returns: sets the frame number stored at that index to be frameNum { currentTime++; pageMap[index] = frameNum; timeStamp[index] = currentTime; if (FreeRemaining() && freeFrames.back() == frameNum) { freeFrames.pop_back(); } } bool PageTable::FreeRemaining() // Returns: true if any free frames are available in physical memory { return freeFrames.size() > 0; } int PageTable::GetFree() // Assumes: freeFrames (list of free frames) is not empty // Returns: the number of a free frame (which is then removed from freeFrames) { int free = freeFrames.back(); freeFrames.pop_back(); return free;; } int PageTable::GetOldest() // Assumes: at least one page is stored in the table // Returns: index of the oldest page in the table { int oldFrame, oldTime = currentTime + 1; for (int i = 0; i < pageMap.size(); i++) { if (valid[i] && timeStamp[i] < oldTime) { oldTime = timeStamp[i]; oldFrame = i; } } return oldFrame; }