PROGRAM 5
Simulate the page replacement algorithms a) FIFO
b) LRU c) LFU d) Optimal Page Replacement
❖ Page replacement is done to get the lowest page fault rate.
❖ Algorithm is evaluated by running it on a reference string and
computing the number of page faults on the string.
PAGE FAULT vs NUMBER OF FRAMES - GRAPH
❖ Some page replacement algorithms are:
➢ First In First Out
➢ Least Recently Used
➢ Least Frequently Used
➢ Optimal Page Replacement
1. FIRST IN FIRST OUT (FIFO)
❖ Simplest algorithm
❖ During page replacement it chooses the oldest page
❖ Easy to understand
❖ Performance is not always good.
❖ If active page is replaced, page fault occurs and increases.
BELADY’S ANOMALY
Normally, the number of page faults decreases with increased frames.
But the number of page faults increases. This is Belady’s Anomaly.
EXAMPLE
Reference string: 7 0 1 2 0 3 0 4 2 3 0 3 2 1 2 0 1 7 0 1
Step 1
Page 7 is referred. It is not present in the memory. Page fault has
occurred. We load page 7 from secondary memory to main memory.
Step 2
Page 0 is referred. It is not present in the memory. Page fault has
occurred. We load page 0 from secondary memory to main memory.
0
Step 3
Page 1 is referred. It is not present in the memory. Page fault has
occurred. We load page 1 from secondary memory to main memory.
Step 4
Page 2 is referred. It is not present in the memory. Page fault has
occurred. We load page 2 from secondary memory to main memory.
Page 7 is replaced by Page 2 as it entered first.
1
Step 5
Page 0 is referred. It is already present in the memory.
Step 6
Page 3 is referred. It is not present in the memory. Page fault has
occurred. We load page 3 from secondary memory to main memory.
Page 0 is replaced by Page 3 as it entered first.
1
Step 7
Page 0 is referred. It is not present in the memory. Page fault has
occurred. We load page 0 from secondary memory to main memory.
Page 1 is replaced by Page 0 as it entered first.
Step 8
Page 4 is referred. It is not present in the memory. Page fault has
occurred. We load page 4 from secondary memory to main memory.
Page 2 is replaced by Page 4 as it entered first.
0
Step 9
Page 2 is referred. It is not present in the memory. Page fault has
occurred. We load page 2 from secondary memory to main memory.
Page 3 is replaced by Page 2 as it entered first.
Step 10
Page 3 is referred. It is not present in the memory. Page fault has
occurred. We load page 3 from secondary memory to main memory.Page
0 is replaced by Page 3 as it entered first.
3
Step 11
Page 0 is referred. It is not present in the memory. Page fault has
occurred. We load page 0 from secondary memory to main memory.
Page 4 is replaced by Page 0 as it entered first.
Step 12
Page 3 is referred. It is already present in the memory.
Step 13
Page 2 is referred. It is already present in the memory.
3
Step 14
Page 1 is referred. It is not present in the memory. Page fault has
occurred. We load page 1 from secondary memory to main memory.
Page 2 is replaced by Page 1 as it entered first.
Step 15
Page 2 is referred. It is not present in the memory. Page fault has
occurred. We load page 2 from secondary memory to main memory.Page
3 is replaced by Page 2 as it entered first.
3
Step 16
Page 0 is referred. It is already present in the memory.
2
Step 17
Page 1 is referred. It is already present in the memory.
Step 18
Page 7 is referred. It is not present in the memory. Page fault has
occurred. We load page 7 from secondary memory to main memory.Page
0 is replaced by Page 7 as it entered first.
2
Step 19
Page 0 is referred. It is not present in the memory. Page fault has
occurred. We load page 0 from secondary memory to main memory.Page
1 is replaced by Page 0 as it entered first.
Step 20
Page 1 is referred. It is not present in the memory. Page fault has
occurred. We load page 1 from secondary memory to main memory.Page
2 is replaced by Page 1 as it entered first.
With three frames, the number of page faults are: 15
PYTHON CODE IMPLEMENTATION FOR FIRST IN FIRST
OUT PAGE REPLACEMENT TECHNIQUE
from queue import Queue
def pageFaults(pages, n, capacity):
s = set()
indexes = Queue()
page_faults = 0
for i in range(n):
if (len(s) < capacity):
if (pages[i] not in s):
s.add(pages[i])
page_faults += 1
indexes.put(pages[i])
else:
if (pages[i] not in s):
val = indexes.queue[0]
indexes.get()
s.remove(val)
s.add(pages[i])
indexes.put(pages[i])
page_faults += 1
return page_faults
if __name__ == '__main__':
pages = [7, 0, 1, 2, 0, 3, 0, 4, 2, 3, 0, 3, 2, 1, 2, 0, 1, 7, 0, 1]
n = len(pages)
capacity = 3
print("The number of page faults are:")
print(pageFaults(pages, n, capacity))
OUTPUT
2. LEAST RECENTLY USED (LRU)
❖ LRU looks backward in time
❖ It requires previous information
❖ Replace the page that is last used
EXAMPLE
Reference string: 7 0 1 2 0 3 0 4 2 3 0 3 2 1 2 0 1 7 0 1
Step 1
Page 7 is referred. It is not present in the memory. Page fault has
occurred. We load page 7 from secondary memory to main memory.
Step 2
Page 0 is referred. It is not present in the memory. Page fault has
occurred. We load page 0 from secondary memory to main memory.
Step 3
Page 1 is referred. It is not present in the memory. Page fault has
occurred. We load page 1 from secondary memory to main memory.
Step 4
Page 2 is referred. It is not present in the memory. Page fault has
occurred. We load page 2 from secondary memory to main memory.
Page 7 is replaced by Page 2 as it is last referred.
1
Step 5
Page 0 is referred. It is already present in the memory.
Step 6
Page 3 is referred. It is not present in the memory. Page fault has
occurred. We load page 3 from secondary memory to main memory.
Page 1 is replaced by Page 3 as it is last referred.
Step 7
Page 0 is referred. It is already present in the memory.
Step 8
Page 4 is referred. It is not present in the memory. Page fault has
occurred. We load page 4 from secondary memory to main memory.
Page 2 is replaced by Page 4 as it is last referred.
3
Step 9
Page 2 is referred. It is not present in the memory. Page fault has
occurred. We load page 2 from secondary memory to main memory.
Page 3 is replaced by Page 2 as it is last referred.
Step 10
Page 3 is referred. It is not present in the memory. Page fault has
occurred. We load page 3 from secondary memory to main memory.Page
0 is replaced by Page 3 as it is last referred.
Step 11
Page 0 is referred. It is not present in the memory. Page fault has
occurred. We load page 0 from secondary memory to main memory.
Page 4 is replaced by Page 0 as it is last referred.
Step 12
Page 3 is referred. It is already present in the memory.
Step 13
Page 2 is referred. It is already present in the memory.
Step 14
Page 1 is referred. It is not present in the memory. Page fault has
occurred. We load page 1 from secondary memory to main memory.
Page 0 is replaced by Page 1 as it is last referred.
Step 15
Page 2 is referred. It is already present in the memory.
Step 16
Page 0 is referred. It is not present in the memory. Page fault has
occurred. We load page 0 from secondary memory to main memory.Page
3 is replaced by Page 0 as it is last referred.
Step 17
Page 1 is referred. It is already present in the memory.
Step 18
Page 7 is referred. It is not present in the memory. Page fault has
occurred. We load page 7 from secondary memory to main memory.Page
2 is replaced by Page 7 as it last referred.
Step 19
Page 0 is referred. It is already present in the memory.
7
Step 20
Page 1 is referred. It is already present in the memory.
With three frames, the number of page faults are: 12
PYTHON CODE IMPLEMENTATION FOR LEAST
RECENTLY USED PAGE REPLACEMENT TECHNIQUE
capacity = 3
processList = [7, 0, 1, 2, 0, 3, 0, 4, 2, 3, 0, 3, 2, 1, 2, 0, 1, 7, 0, 1]
s = []
pageFaults = 0
for i in processList:
if i not in s:
if(len(s) == capacity):
s.remove(s[0])
s.append(i)
else:
s.append(i)
pageFaults +=1
else:
s.remove(i)
s.append(i)
print("The number of page faults are: ")
print("{}".format(pageFaults))
OUTPUT
3. LEAST FREQUENTLY USED LFU
❖ It is a counting algorithm
❖ Keeps counter of number of references that have been made to
each page
❖ LFU replaces page with smallest cout
❖ In case of tie, page with oldest arrival time is replaced.
EXAMPLE
Reference string: 1 2 3 4 1 2 5 1 2 3 4 5
Step 1
Page 1 is referred. It is not present in memory. Page fault has occurred.
Page 1 is loaded from secondary to primary memory.
11
Step 2
Page 2 is referred. It is not present in memory. Page fault has occurred.
Page 2 is loaded from secondary to primary memory.
11
21
Step 3
Page 3 is referred. It is not present in memory. Page fault has occurred.
Page 3 is loaded from secondary to primary memory.
11
21
31
Step 4
Page 4 is referred. It is not present in memory. Page fault has occurred.
Page 4 is loaded from secondary to primary memory.
11
21
31
41
With the above step the memory is full, with all pages having count 1
each.
Step 5
Page 1 is referred. It is already present in the memory. Page 1 count is
incremented by 1.
12
21
31
41
Step 6
Page 2 is referred. It is already present in the memory. Page 2 count is
incremented by 1.
12
22
31
41
Step 7
Page 5 is referred. It is not present in memory. Page fault has occurred.
Page 5 is loaded from secondary to primary memory. Page 3 is replaced
by Page 5 as it is with older arrival time.
12
22
51
41
Step 8
Page 1 is referred. It is already present in the memory. Page 1 count is
incremented by 1.
13
22
51
41
Step 9
Page 2 is referred. It is already present in the memory. Page 2 count is
incremented by 1.
13
23
51
41
Step 10
Page 3 is referred. It is not present in memory. Page fault has occurred.
Page 3 is loaded from secondary to primary memory. Page 4 is replaced
by Page 3 as it is with older arrival time.
13
23
51
31
Step 11
Page 4 is referred. It is not present in memory. Page fault has occurred.
Page 4 is loaded from secondary to primary memory.Page 5 is replaced
by Page 4 as it is with older arrival time.
13
23
41
31
Step 12
Page 5 is referred. It is not present in memory. Page fault has occurred.
Page 5 is loaded from secondary to primary memory. Page 3 is replaced
by Page 5 as it is with older arrival time.
13
23
31
51
With four frames, the number of page faults are: 8
PYTHON CODE IMPLEMENTATION FOR LEAST
FREQUENTLY USED PAGE REPLACEMENT ALGORITHM
from collections import defaultdict
def lfu(page_list, frame_size):
page_faults = 0
frame = []
frequency = defaultdict(int)
for page in page_list:
if page not in frame:
page_faults += 1
if len(frame) < frame_size:
frame.append(page)
else:
min_freq = min(frequency.values())
lfu_pages = [p for p in frame if frequency[p] == min_freq]
if lfu_pages:
page_to_replace = min(lfu_pages, key=frame.index)
frame.remove(page_to_replace)
frame.append(page)
frequency[page] = 1
else:
frequency[page] += 1
return page_faults
while True:
try:
page_list = list(map(int, input("Enter the page list separated by
spaces: ").split()))
if not page_list:
raise ValueError
break
except ValueError:
print("Invalid input. Please enter a valid list of integers.")
while True:
try:
frame_size = int(input("Enter the frame size: "))
if frame_size <= 0:
raise ValueError
break
except ValueError:
print("Invalid input. Please enter a positive integer for frame size.")
page_faults = lfu(page_list, frame_size)
print("Number of page faults:", page_faults)
OUTPUT
4. OPTIMAL PAGE REPLACEMENT
❖ It has lowest page fault size
❖ Never suffers from Belady’s Anomaly
❖ Replace page that is not used for longest period of time in future
❖ Algorithm requires future knowledge
EXAMPLE
Reference String: 7 0 1 2 0 3 0 4 2 3 0 3 2 1 2 0 1 7 0 1
Step 1
Page 7 is referred. It is not present in the memory. Page fault has
occurred. We load page 7 from secondary memory to main memory.
Step 2
Page 0 is referred. It is not present in the memory. Page fault has
occurred. We load page 0 from secondary memory to main memory.
Step 3
Page 1 is referred. It is not present in the memory. Page fault has
occurred. We load page 1 from secondary memory to main memory.
7
Step 4
Page 2 is referred. It is not present in the memory. Page fault has
occurred. We load page 2 from secondary memory to main memory.
Page 7 is replaced by Page 2 as it is least referred in future.
1
Step 5
Page 0 is referred. It is already present in the memory.
Step 6
Page 3 is referred. It is not present in the memory. Page fault has
occurred. We load page 3 from secondary memory to main memory.
Page 1 is replaced by Page 3 as it is least referred in future.
Step 7
Page 0 is referred. It is already present in the memory.
3
Step 8
Page 4 is referred. It is not present in the memory. Page fault has
occurred. We load page 4 from secondary memory to main memory.
Page 0 is replaced by Page 4 as it is least referred in future.
Step 9
Page 2 is referred. It is already present in the memory.
Step 10
Page 3 is referred. It is already present in the memory.
3
Step 11
Page 0 is referred. It is not present in the memory. Page fault has
occurred. We load page 0 from secondary memory to main memory.
Page 4 is replaced by Page 0 as it is least referred in future.
Step 12
Page 3 is referred. It is already present in the memory.
Step 13
Page 2 is referred. It is already present in the memory.
3
Step 14
Page 1 is referred. It is not present in the memory. Page fault has
occurred. We load page 1 from secondary memory to main memory.
Page 3 is replaced by Page 1 as it is least referred in future.
Step 15
Page 2 is referred. It is already present in the memory.
Step 16
Page 0 is referred. It is already present in the memory.
1
Step 17
Page 1 is referred. It is already present in the memory.
Step 18
Page 7 is referred. It is not present in the memory. Page fault has
occurred. We load page 7 from secondary memory to main memory.Page
2 is replaced by Page 7 as it is least referred in future.
Step 19
Page 0 is referred. It is already present in the memory.
1
Step 20
Page 1 is referred. It is already present in the memory.
With three frames, the number of page faults are: 9
PYTHON CODE IMPLEMENTATION FOR OPTIMAL PAGE
REPLACEMENT TECHNIQUE
def optimal_page_replacement(ref_string, frame_size):
page_faults = 0
current_frames = []
for page in ref_string:
if page in current_frames:
continue
if len(current_frames) < frame_size:
current_frames.append(page)
page_faults += 1
continue
farthest_page = None
farthest_distance = -1
for frame in current_frames:
try:
farthest_index = ref_string.index(frame, ref_string.index(page))
if farthest_index > farthest_distance:
farthest_distance = farthest_index
farthest_page = frame
except ValueError:
farthest_page = frame
break
current_frames[current_frames.index(farthest_page)] = page
page_faults += 1
return page_faults
ref_string = [7, 0, 1, 2, 0, 3, 0, 4, 2, 3, 0, 3, 2, 1, 2, 0, 1, 7, 0, 1]
frame_size = 3
page_faults = optimal_page_replacement(ref_string, frame_size)
print(f"Number of page faults are: {page_faults}")
OUTPUT