Skip to content

Commit 045ea96

Browse files
committed
Two First RR Queue Bug Fixed
1 parent bb8cd77 commit 045ea96

File tree

1 file changed

+54
-13
lines changed

1 file changed

+54
-13
lines changed

MLFQ_algo.py

Lines changed: 54 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,8 @@ def cpu_process(self):
2323
first_time_quantum = 8
2424
sec_time_quantum = 16
2525
self.two_queue_with_diff_quantum(first_time_quantum, sec_time_quantum)
26-
self.fcfs_queue()
2726
return self.grantt_chart
27+
self.fcfs_queue()
2828

2929
def two_queue_with_diff_quantum(self, fist_time_quantum, second_time_quantum):
3030
done_first_time_quantum = []
@@ -35,6 +35,7 @@ def two_queue_with_diff_quantum(self, fist_time_quantum, second_time_quantum):
3535
ready_processes_queue = []
3636
processes_next_ready_queue = self.get_arrival_times()
3737
cycle = 1
38+
total_counter = 0
3839
while True:
3940
if cycle == 1:
4041
time_quantum = fist_time_quantum
@@ -51,10 +52,13 @@ def two_queue_with_diff_quantum(self, fist_time_quantum, second_time_quantum):
5152
self.processes.remove(process)
5253
started = True
5354

54-
if len(ready_processes_queue) == 0:
55+
if len(ready_processes_queue) == 0 and not is_sec_burst_allowed:
5556
self.current_cpu_time += 1
5657
continue
5758

59+
elif len(ready_processes_queue) == 0 and is_sec_burst_allowed:
60+
ready_processes_queue.append([self.processes.pop(0), 0])
61+
5862
sub_count = ready_processes_queue[0][1]
5963
current_process = ready_processes_queue[0][0]
6064
pre_current_process = current_process.cpu_burst_time1 + current_process.cpu_burst_time2 + current_process.io_time
@@ -81,8 +85,7 @@ def two_queue_with_diff_quantum(self, fist_time_quantum, second_time_quantum):
8185
self.current_cpu_time += time_quantum
8286

8387
if current_process.cpu_burst_time1 <= 0 and current_process.arrival_time <= self.current_cpu_time and \
84-
processes_next_ready_queue[str(current_process.process_id)] <= self.current_cpu_time and \
85-
is_sec_burst_allowed:
88+
processes_next_ready_queue[str(current_process.process_id)] <= self.current_cpu_time:
8689
if current_process.io_time > 0:
8790
ready_processes_queue[0][1] = 0 # sub_count = 0
8891
sub_count = 0
@@ -100,8 +103,8 @@ def two_queue_with_diff_quantum(self, fist_time_quantum, second_time_quantum):
100103
info.cpu_end_time2 = -1
101104
break
102105
current_process.io_time = 0
103-
finished = True
104-
elif current_process.cpu_burst_time2 > 0 and current_process.cpu_burst_time1 <= 0:
106+
107+
elif current_process.cpu_burst_time2 > 0 and current_process.cpu_burst_time1 <= 0 and is_sec_burst_allowed:
105108
if sub_count == 0:
106109
for info in self.grantt_chart:
107110
if info.process.process_id == current_process.process_id:
@@ -123,12 +126,42 @@ def two_queue_with_diff_quantum(self, fist_time_quantum, second_time_quantum):
123126
current_process_value = current_process.cpu_burst_time1 + current_process.cpu_burst_time2 + current_process.io_time
124127
if pre_current_process != current_process_value:
125128
ready_processes_queue.pop(0)
129+
total_counter += 1
126130
if current_process.cpu_burst_time2 > 0 or current_process.cpu_burst_time1 > 0 or current_process.io_time > 0:
127131
ready_processes_queue.append([current_process, sub_count])
128132

129133
if len(self.processes) <= 0 and len(ready_processes_queue) <= 0:
130134
break
131135

136+
# counter = 0
137+
# for each in ready_processes_queue:
138+
# if each[1] > 0:
139+
# counter += 1
140+
# if counter == processes_count:
141+
# if is_sec_burst_allowed:
142+
# break
143+
# is_sec_burst_allowed = True
144+
# for each in ready_processes_queue:
145+
# self.processes.append(each[0])
146+
# ready_processes_queue.clear()
147+
# done_first_time_quantum.clear()
148+
# continue
149+
150+
# if len(self.processes) == 0 and len(ready_processes_queue) == processes_count:
151+
if len(ready_processes_queue) == processes_count and total_counter == processes_count:
152+
if not is_sec_burst_allowed:
153+
is_sec_burst_allowed = True
154+
for each in ready_processes_queue:
155+
self.processes.append(each[0])
156+
self.sort()
157+
ready_processes_queue.clear()
158+
done_first_time_quantum.clear()
159+
cycle = 2
160+
continue
161+
else:
162+
break
163+
# else:
164+
132165
if prev_cpu_time == self.current_cpu_time:
133166
self.current_cpu_time += 1
134167
prev_cpu_time = self.current_cpu_time
@@ -141,13 +174,6 @@ def two_queue_with_diff_quantum(self, fist_time_quantum, second_time_quantum):
141174
self.processes.remove(process)
142175
new_queue = True
143176

144-
if len(done_first_time_quantum) == processes_count:
145-
if not is_sec_burst_allowed:
146-
is_sec_burst_allowed = True
147-
done_first_time_quantum.clear()
148-
else:
149-
break
150-
151177
if new_queue:
152178
for process_info in _temp:
153179
ready_processes_queue.insert(0, process_info)
@@ -172,3 +198,18 @@ def fcfs_queue(self):
172198

173199
elif process_info.cpu_start_time2 > 0 and process_info.process.cpu_burst_time2 > 0:
174200
process_info.cpu_end_time2 = self.current_cpu_time + process_info.process.cpu_burst_time2
201+
202+
203+
def sort(self):
204+
sorted_processes = []
205+
arrival_times = []
206+
for process in self.processes:
207+
arrival_times.append(process.arrival_time)
208+
arrival_times.sort()
209+
for arrival_time in arrival_times:
210+
for process in self.processes.copy():
211+
if process.arrival_time == arrival_time:
212+
sorted_processes.append(process)
213+
self.processes.remove(process)
214+
self.processes.clear()
215+
self.processes = sorted_processes.copy()

0 commit comments

Comments
 (0)