Ejemplo n.º 1
0
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)
Ejemplo n.º 2
0

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)
Ejemplo n.º 3
0
    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)
Ejemplo n.º 4
0
#!/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)
Ejemplo n.º 5
0
    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)
Ejemplo n.º 6
0
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)
Ejemplo n.º 7
0
                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)