-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathclockmmu.py
126 lines (90 loc) · 3.32 KB
/
clockmmu.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
from mmu import MMU
class Page:
def __init__(self, page_num):
self.page_num = page_num
self.ref_bit = 0
self.dirty = False
def __repr__(self):
return f"Page({self.page_num}, ref_bit={self.ref_bit}, dirty={self.dirty})"
class ClockMMU(MMU):
def __init__(self, frames_num):
self.frames= [None]* frames_num
self.clock_tip = 0
self.count_diskR= 0
self.count_diskW=0
self.page_faults=0
self.debug_mode=False
self.total_frames= frames_num
def set_debug(self):
self.debug_mode = True
def reset_debug(self):
self.debug_mode = False
def handle_empty (self, page_number,write,current):
self.frames[self.clock_tip] = Page(page_number)
self.frames[self.clock_tip].ref_bit = 1
if write:
self.frames[self.clock_tip].dirty = True
self.count_diskR += 1
if self.debug_mode:
print(f"load page{current}")
self.clock_tip = (self.clock_tip + 1) % len(self.frames)
return current
def handle_zero (self, page_number,write,current):
current.ref_bit = 0
if self.debug_mode:
print("pass making the ref bit 0 now")
self.clock_tip = (self.clock_tip + 1) % len(self.frames)
return
def handle_replacment (self, page_number,write,current):
if current.dirty:
self.count_diskW += 1
if self.debug_mode:
print(f"writing dirty page{current}")
if self.debug_mode:
print(f"Evicting {current}")
self.frames[self.clock_tip] = Page(page_number)
self.frames[self.clock_tip].ref_bit = 1
if write:
self.frames[self.clock_tip].dirty = True
self.count_diskR += 1
if self.debug_mode:
print(f"Loading page{current} ")
self.clock_tip = (self.clock_tip + 1) % len(self.frames)
return
def clock(self, page_number,write):
while True:
current = self.frames[self.clock_tip]
if current is None:
self.handle_empty ( page_number,write,current)
return
else:
if current.ref_bit == 1:
self.handle_zero(page_number,write,current)
else:
self.handle_replacment (page_number,write,current)
return
def read_memory(self, page_number):
for page in self.frames:
if page and page.page_num == page_number:
page.ref_bit=1
if self.debug_mode:
print("Read hit")
return
self.page_faults+=1
self.clock(page_number,write=False)
def write_memory(self, page_number):
for page in self.frames:
if page and page.page_num == page_number:
page.ref_bit = 1
page.dirty = True
if self.debug_mode:
print("Write hit.")
return
self.page_faults+=1
self.clock(page_number,write=True)
def get_total_disk_reads(self):
return self.count_diskR
def get_total_disk_writes(self):
return self.count_diskW
def get_total_page_faults(self):
return self.page_faults