diff --git a/src/main.py b/src/main.py new file mode 100644 index 0000000..9a73136 --- /dev/null +++ b/src/main.py @@ -0,0 +1,59 @@ +#!/bin/python3 +from queue import Queue + +class NoServerFreeError(Exception): + def __init__(self, message="No server free"): + self.message = message + super().__init__(self.message) + +class Request: + def __init__(self, lambda_val, current_time): + # exponential distribution, parameter λ + interval = random.expovariate(self.lambda_val) + new_time = self.current_time + interval + + self.arrival_time = new_time + self.category = 1 + + +class Server_cluster: + def __init__(self, cluster_size, category, service_rate): + self.category = category + self.cluster_size = cluster_size + self.finish_time = [0.0]*cluster_size + + def process_request(self, request, current_time): + free_servers = [i for i in range(self.cluster_size) if self.finish_time[i] <= current_time] + if not free_servers: + raise NoServerFreeError() + else: + interval = random.expovariate(self.service_rate) + finish = current_time + interval + self.finish_time[free_servers[0]] = finish + + +class Simulation: + def __init__(self, C, lambda_val): + # C clusters of K servers + self.C = C + self.K = 12 // C + # service rate exponential distribution parameter + service_rates = {1: 4/20, 2:7/20, 3:10/20, 6:14/20} + self.service_rate = service_rates[C] + # router request processing time + self.router_processing_time = (C - 1) / C + # λ + self.lambda_val = lambda_val + + self.router_queue = Queue(maxsize = 100) + self.router_state = 'idle' # 'idle', 'processing', 'blocked' + + self.event_queue = Queue() # (arrival_time, category) + self.current_time = 0.0 + + self.total_requests = 0 + self.lost_requests = 0 + self.response_times = [] + + +