class OptimalMem(base.Memory): def next(self, page, future_pages, **kwargs): index = self.index(page) if index is not None: return False, index for i, frame in enumerate(self.contents): if frame.contents is None: self.page_table[page.num] = i frame.contents = page return True, i possible_frames = set(range(len(self.contents))) for future_page in future_pages: if len(possible_frames) > 1: if future_page.num in self.page_table: remove = self.page_table[future_page.num] if remove in possible_frames: possible_frames.remove(remove) else: break assert(len(possible_frames) >= 1) frame_index = possible_frames.pop() frame = self.contents[frame_index] del self.page_table[frame.contents.num] self.page_table[page.num] = frame_index frame.contents = page return True, frame_index base.run_cls(OptimalMem)
class LfuMem(base.Memory): def __init__(self, n_frames): base.Memory.__init__(self, n_frames) self.frequency = [0] * n_frames def next(self, page, **kwargs): frame_index = self.index(page) if frame_index is not None: self.frequency[frame_index] += 1 return False, frame_index frame_index = self.frequency.index(min(self.frequency)) frame = self.contents[frame_index] if frame.contents is not None: del self.page_table[frame.contents.num] self.page_table[page.num] = frame_index frame.contents = page self.frequency[frame_index] = 1 return True, frame_index def __repr__(self): return (base.Memory.__repr__(self) + "\n" + "LFU access count " + pprint.pformat(list(self.frequency))) base.run_cls(LfuMem)
def next(self, page, **kwargs): index = self.index(page) if index is not None: self.referenced[index] = 1 return False, index self.last_insert_index += 1 self.last_insert_index %= len(self.contents) while self.referenced[self.last_insert_index]: self.referenced[self.last_insert_index] = 0 self.last_insert_index += 1 self.last_insert_index %= len(self.contents) frame_index = self.last_insert_index frame = self.contents[frame_index] if frame.contents is not None: del self.page_table[frame.contents.num] frame.contents = page self.page_table[page.num] = frame_index self.referenced[frame_index] = 1 return True, frame_index def __repr__(self): return (base.Memory.__repr__(self) + "\n" + "Ref history " + pprint.pformat(list(self.referenced))) base.run_cls(LruScMem)
#!/usr/bin/env python3 import base import pprint class FifoMem(base.Memory): def __init__(self, n_frames): base.Memory.__init__(self, n_frames) self.last_insert_index = -1 % n_frames def next(self, page, **kwargs): index = self.index(page) if index is not None: return False, index self.last_insert_index += 1 self.last_insert_index %= len(self.contents) frame_index = self.last_insert_index frame = self.contents[frame_index] if frame.contents is not None: del self.page_table[frame.contents.num] frame.contents = page self.page_table[page.num] = frame_index return True, frame_index base.run_cls(FifoMem)
def next(self, page, **kwargs): frame_index = self.index(page) if frame_index is not None: self.frequency[frame_index] += 1 return False, frame_index for i, frame in enumerate(self.contents): if frame.contents is None: frame_index = i break else: frame_index = self.frequency.index(max(self.frequency)) frame = self.contents[frame_index] if frame.contents is not None: del self.page_table[frame.contents.num] self.page_table[page.num] = frame_index frame.contents = page self.frequency[frame_index] = 1 return True, frame_index def __repr__(self): return (base.Memory.__repr__(self) + "\n" + "MFU access count " + pprint.pformat(list(self.frequency))) base.run_cls(MfuMem)
class LruMem(base.Memory): def __init__(self, n_frames): base.Memory.__init__(self, n_frames) self.history = deque(range(n_frames)) def next(self, page, **kwargs): frame_index = self.index(page) if frame_index is not None: self.history.remove(frame_index) self.history.append(frame_index) return False, frame_index frame_index = self.history.popleft() self.history.append(frame_index) frame = self.contents[frame_index] if frame.contents is not None: del self.page_table[frame.contents.num] self.page_table[page.num] = frame_index frame.contents = page return True, frame_index def __repr__(self): return (base.Memory.__repr__(self) + "\n" + "LRU history " + pprint.pformat(list(self.history))) base.run_cls(LruMem)
victim = self.last_insert_index victim_val = intify(victim) if (not self.referenced[self.last_insert_index] and not self.dirty[self.last_insert_index]): victim = self.last_insert_index break self.referenced[self.last_insert_index] = 0 self.last_insert_index += 1 self.last_insert_index %= len(self.contents) assert (victim is not None) frame_index = victim self.last_insert_index = victim frame = self.contents[frame_index] if frame.contents is not None: self.dirty[frame_index] = 0 del self.page_table[frame.contents.num] frame.contents = page self.page_table[page.num] = frame_index self.referenced[frame_index] = 1 return True, frame_index def __repr__(self): return (base.Memory.__repr__(self) + "\n" + "Ref history " + pprint.pformat(list(self.referenced)) + "\n" + "Dirty history " + pprint.pformat(list(self.dirty))) base.run_cls(LruEscMem)