Guest User

Page Replacement Algorithms - Jonh Alexis Buot (LaplaceXD)

a guest
Nov 29th, 2023
69
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 6.78 KB | Source Code | 0 0
  1. # ===========================================================
  2. # Authors:  Jonh Alexis Buot
  3. # Github:   https://github.com/LaplaceXD
  4. # Date:     November 27, 2023
  5. # Course:   CS 3104 - Operating Systems
  6. # Activity: Page Replacement Algorithms
  7. # ===========================================================
  8.  
  9. def fifo(frame_len, pages):
  10.     memory = [None] * frame_len
  11.     arrival_queue = []
  12.  
  13.     state = arrival_queue
  14.     for time, arrived_page in enumerate(pages, start=1):
  15.         replaced_page = None
  16.         is_fault = False
  17.        
  18.         if arrived_page not in memory:
  19.             is_fault = True
  20.             mem_len = len(memory) - memory.count(None)
  21.            
  22.             frame = mem_len
  23.             if mem_len == frame_len:
  24.                 replaced_page = arrival_queue.pop(0)
  25.                 frame = memory.index(replaced_page)
  26.            
  27.             memory[frame] = arrived_page
  28.             arrival_queue.append(arrived_page)
  29.            
  30.         yield time, memory.copy(), state.copy(), arrived_page, replaced_page, is_fault
  31.  
  32. def lru(frame_len, pages):
  33.     memory = [None] * frame_len
  34.     usage_queue = []
  35.    
  36.     state = usage_queue
  37.     for time, arrived_page in enumerate(pages, start=1):
  38.         replaced_page = None
  39.         is_fault = False
  40.        
  41.         if arrived_page not in memory:
  42.             is_fault = True
  43.             mem_len = len(memory) - memory.count(None)
  44.            
  45.             frame = mem_len
  46.             if mem_len == frame_len:
  47.                 replaced_page = usage_queue.pop(0)
  48.                 frame = memory.index(replaced_page)
  49.            
  50.             memory[frame] = arrived_page
  51.         else:
  52.             usage_queue.remove(arrived_page)
  53.        
  54.         usage_queue.append(arrived_page)        
  55.         yield time, memory.copy(), state.copy(), arrived_page, replaced_page, is_fault
  56.        
  57. def lfu(frame_len, pages):
  58.     memory = [None] * frame_len
  59.     frequency_counts = [0] * frame_len
  60.     arrival_queue = []
  61.    
  62.     state = []
  63.     for time, arrived_page in enumerate(pages, start=1):
  64.         replaced_page = None
  65.         is_fault = False
  66.        
  67.         if arrived_page not in memory:
  68.             is_fault = True
  69.             mem_len = len(memory) - memory.count(None)
  70.            
  71.             frame = mem_len
  72.             if mem_len == frame_len:
  73.                 replaced_page, _ = state.pop(0)
  74.                 frame = memory.index(replaced_page)
  75.                 arrival_queue.remove(replaced_page)
  76.            
  77.             memory[frame] = arrived_page
  78.             frequency_counts[frame] = 1
  79.             arrival_queue.append(arrived_page)
  80.         else:
  81.             frequency_counts[memory.index(arrived_page)] += 1
  82.        
  83.         page_freqs = zip((m for m in memory if m is not None), frequency_counts)
  84.         state = sorted(page_freqs, key=lambda pf : (pf[1], arrival_queue.index(pf[0])))
  85.         yield time, memory.copy(), state.copy(), arrived_page, replaced_page, is_fault
  86.        
  87. def optimal(frame_len, pages):
  88.     memory = [None] * frame_len
  89.     page_intervals = pages.copy()
  90.     arrival_queue = []
  91.    
  92.     state = []
  93.     for time, arrived_page in enumerate(pages, start=1):
  94.         replaced_page = None
  95.         is_fault = False
  96.        
  97.         if arrived_page in page_intervals:
  98.             page_intervals.remove(arrived_page)
  99.        
  100.         if arrived_page not in memory:
  101.             is_fault = True
  102.             mem_len = len(memory) - memory.count(None)
  103.            
  104.             frame = mem_len
  105.             if mem_len == frame_len:
  106.                 replaced_page = state.pop(0)
  107.                 frame = memory.index(replaced_page)
  108.                 arrival_queue.remove(replaced_page)
  109.            
  110.             memory[frame] = arrived_page
  111.             arrival_queue.append(arrived_page)
  112.        
  113.         state = [page for page in memory if page is not None]
  114.         # Sort by shortest next interval, if they no longer have a next interval,
  115.         # then sort by their arrival time
  116.         state.sort(key=lambda page : (page_intervals.index(page) if page in page_intervals else len(page_intervals), -1 * arrival_queue.index(page)), reverse=True)
  117.         yield time, memory.copy(), state.copy(), arrived_page, replaced_page, is_fault
  118.  
  119. def create_mem_log(time, memory, state, inserted_page, replaced_page, is_fault, mem_log_pad, state_log_pad, time_log_pad):
  120.     status = "❌ FAULT " if is_fault else "🎯 HIT   "
  121.     action = "loaded" if is_fault else "found"
  122.     stringed_memory = str(memory).replace("None", "-")
  123.    
  124.     page_inserted = "Page {}".format(inserted_page)
  125.     involved_frame = "Frame {}".format(str(memory.index(inserted_page) + 1).zfill(3))
  126.     replaced_clause = " replacing page {}".format(replaced_page) if replaced_page is not None else ""
  127.  
  128.     replacement_log = "{}: {} {} in {}{}".format(status, page_inserted, action, involved_frame, replaced_clause)
  129.     state_log = "{:>{}}".format(str(state), state_log_pad) if state_log_pad is not None else str(state)
  130.     time_log = "{:>{}}".format("[{}]".format(time), time_log_pad + 2) if time_log_pad is not None else "[{}]".format(time)
  131.     mem_visual_log = "{:>{}}".format(stringed_memory, mem_log_pad) if mem_log_pad is not None else str(stringed_memory)
  132.  
  133.     return "{} {} {} {} {}".format(time_log, "({})".format(inserted_page), mem_visual_log, state_log, replacement_log)
  134.  
  135. pages_ref = input("Page references (separate by spaces): ")
  136. num_of_frames = int(input("Number of Frames: "))
  137.  
  138. pages = pages_ref.split(" ")
  139. pages = [int(page) if page.isdigit() else page for page in pages]
  140.  
  141. algs = {
  142.     fifo: "First-In, First-Out (FIFO)",
  143.     lru: "Least Recently Used (LRU)",
  144.     lfu: "Least Frequently Used (LFU)",
  145.     optimal: "Optimal"
  146. }
  147.  
  148. for alg_fn, alg_name in algs.items():
  149.     print("=====", alg_name, "Simulation =====")
  150.     print("Legend: [<Time>] <Inserted Page> <Memory Visual> <State (After Replacement)> <Replacement Log>")
  151.     snapshots = [snapshot for snapshot in alg_fn(num_of_frames, pages)]
  152.     time_pad = max(len(str(s[0])) for s in snapshots)
  153.     mem_visual_pad = max(len(str(s[1]).replace("None", "-")) for s in snapshots)
  154.     mem_state_pad = max(len(str(s[2])) for s in snapshots)
  155.    
  156.     print(*(create_mem_log(*s, mem_visual_pad, mem_state_pad, time_pad) for s in snapshots), sep="\n")
  157.     faults = [s[5] for s in snapshots].count(True)
  158.     hits = len(snapshots) - faults
  159.     hit_percent = "{:.2f}%".format(hits * 100 / len(snapshots))
  160.     fault_percent = "{:.2f}%".format(faults * 100 / len(snapshots))
  161.     print("{:15}: {:<30}".format("No. of Hits", hits), end="")
  162.     print("{:15}: {:<30}".format("Hit Ratio", hit_percent), end="\n")
  163.     print("{:15}: {:<30}".format("No. of Faults", faults), end="")
  164.     print("{:15}: {:<30}".format("Fault Ratio", fault_percent), end="\n")
  165.     print("\n" + "-" * 25 + "\n")
Add Comment
Please, Sign In to add comment