Skip to content

Commit

Permalink
feat: round robin scheduling
Browse files Browse the repository at this point in the history
  • Loading branch information
ipranjal committed Nov 24, 2023
1 parent 776a315 commit 881495a
Show file tree
Hide file tree
Showing 3 changed files with 53 additions and 0 deletions.
46 changes: 46 additions & 0 deletions cloudsim/schedulers/roundrobin.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
from cloudsim.schedulers.cloudlet_scheduler import CloudletScheduler

class CloudletSchedulerRoundRobin(CloudletScheduler):
def __init__(self, env, datacenter, time_slice=1):
super().__init__(env, datacenter)
self.time_slice = time_slice
self.total_execution_time = 0
self.total_turn_around_time = 0

def schedule_cloudlets(self, cloudlets):
remaining_cloudlets = list(cloudlets)
while remaining_cloudlets:
for cloudlet in remaining_cloudlets[:]:
yield self.env.process(self.schedule_cloudlet(cloudlet))
remaining_cloudlets.remove(cloudlet)

for vm in self.max_utilization:
print(f"\nVM {vm} utilization:\n {self.max_utilization[vm][0] * 100}% PEs\n, {self.max_utilization[vm][1] * 100}% RAM\n, {self.max_utilization[vm][2] *100}% Storage")

print(f"\nTotal Execution Time: {self.total_execution_time}")

def schedule_cloudlet(self, cloudlet):
while cloudlet.length > 0:
for selected_vm in self.free_vms[:]:
if self.has_enough_resources(selected_vm, cloudlet):
self.free_vms.remove(selected_vm)
cloudlet.set_vm(selected_vm)
self.running_vms.append(selected_vm)
self.max_utilization[selected_vm.get_id()] = max(self.max_utilization[selected_vm.get_id()],
self.get_utilization(selected_vm, cloudlet))

print(f"Cloudlet {cloudlet.cloudlet_id} starts execution on VM {cloudlet.get_vm().get_id()} at {self.env.now}")

execution_time = min(self.time_slice, cloudlet.length)
yield self.env.timeout(execution_time)
cloudlet.length -= execution_time

print(f"Cloudlet {cloudlet.cloudlet_id} completes execution on VM {cloudlet.get_vm().get_id()} at {self.env.now}")

self.running_vms.remove(selected_vm)
self.free_vms.append(selected_vm)

self.total_execution_time += execution_time
break
else:
yield self.env.timeout(1)
4 changes: 4 additions & 0 deletions cloudsim/simulation/cloudlet.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
import simpy
from cloudsim.schedulers.fcfs import CloudletSchedulerFCFS
from cloudsim.schedulers.sjf import CloudletSchedulerSJF
from cloudsim.schedulers.roundrobin import CloudletSchedulerRoundRobin

class CloudletExecution:
def __init__(self,schedular,cloudlet_list,datacenter):
Expand All @@ -12,6 +13,9 @@ def __init__(self,schedular,cloudlet_list,datacenter):
self.scheduler_instance = CloudletSchedulerFCFS(self.env,datacenter)
if self.scheduler == "SJF":
self.scheduler_instance = CloudletSchedulerSJF(self.env,datacenter)
if self.scheduler == "RoundRobin":
self.scheduler_instance = CloudletSchedulerRoundRobin(self.env,datacenter)




Expand Down
3 changes: 3 additions & 0 deletions example.py
Original file line number Diff line number Diff line change
Expand Up @@ -89,4 +89,7 @@ def create_datacenter(name):
cloudlet_execution.execute()

cloudlet_execution = CloudletExecution("SJF",cloudlet_list, datacenter_instance)
cloudlet_execution.execute()

cloudlet_execution = CloudletExecution("RoundRobin",cloudlet_list, datacenter_instance)
cloudlet_execution.execute()

0 comments on commit 881495a

Please sign in to comment.