/
algo.rb
167 lines (160 loc) · 5.15 KB
/
algo.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
processes = []
def read_input(filename, processes)
if File.exists?(filename)
f = File.open(filename, "r")
f.each_line do |line|
values = line.split(" ")
values << values[2]
processes.push(values.map {|i| i.to_i})
end
f.close
end
end
def print_processes(processes)
processes.each do |x|
x.each do |y|
print y
print " "
end
puts "\n"
end
end
def shortest_job_first(processes)
read_input("test.txt", processes)
num_processes = processes.length
ready_queue = processes.sort {|left, right| right[2] <=> left[2]}
total_response_time = 0.0
total_waiting_time = 0.0
total_turn_around_time = 0.0
time = 0.0
while not ready_queue.empty?
current_process = ready_queue[ready_queue.length-1]
total_response_time = total_response_time + time - current_process[1]
time = time + current_process[2]
total_waiting_time = total_waiting_time + time - current_process[2]
total_turn_around_time = total_turn_around_time + time
ready_queue.pop()
end
print "SJF: \n"
print "Average waiting time: "
print total_waiting_time/num_processes
puts "\n"
print "Average response time: "
print total_response_time/num_processes
puts "\n"
print "Average turn around time: "
print total_turn_around_time/num_processes
puts "\n"
print "--------------------------------------------\n"
end
def shortest_remaining_time_first(processes)
read_input("test.txt", processes)
num_processes = processes.length
ready_queue = processes.sort {|left, right| left[2] <=> right[2]}
total_response_time = 0.0
total_waiting_time = 0.0
total_turn_around_time = 0.0
time = 0.0
while not ready_queue.empty?
current_process = ready_queue[0]
if current_process[2] == current_process[3]
total_response_time = total_response_time + time - current_process[1]
end
time = time + 1
current_process[3] = current_process[3] - 1
if current_process[3] == 0
total_waiting_time = total_waiting_time + time - current_process[2]
total_turn_around_time = total_turn_around_time + time
ready_queue.delete_at(0)
else
1.upto(ready_queue.length-1) do |index|
if current_process[3] <= ready_queue[index][3]
ready_queue.insert(index, ready_queue.delete_at(0))
end
end
end
end
print "SRTF: \n"
print "Average waiting time: "
print total_waiting_time/num_processes
puts "\n"
print "Average response time: "
print total_response_time/num_processes
puts "\n"
print "Average turn around time: "
print total_turn_around_time/num_processes
puts "\n"
print "--------------------------------------------\n"
end
def first_come_first_serve(processes)
read_input("test.txt", processes)
processes.sort!{|proc1, proc2| proc1[1] <=> proc2[1]}
turn_around_time = 0.0
response_time = 0.0
current_time = 0.0
for i in 0..(processes.length-1)
response_time += current_time - processes[i][1]
for j in 1..processes[i][2]
current_time += 1
#print "Current Time : #{current_time} Process in execution : #{processes[i][0]}\n"
end
turn_around_time = turn_around_time + current_time
end
print "first come first serve: \n"
# print "Average waiting time: "
# print total_waiting_time/num_processes
# puts "\n"
print "Average response time: "
print response_time/processes.length
puts "\n"
print "Average turn around time: "
print turn_around_time/processes.length
puts "\n"
print "--------------------------------------------\n"
end
def round_robin(processes, time_quanta, context_switch)
read_input("test.txt", processes)
processes.sort!{|proc1, proc2| proc1[1] <=> proc2[1]}
turn_around_time = 0.0
response_time = 0.0
n = processes.length
current_time = 0.0
i = 0
while true
j = 1
if processes[i][2] == processes[i][3]
response_time += current_time - processes[i][1]
end
while j <= time_quanta and j <= processes[i][3]
current_time += 1
#print "Current Time : #{current_time} Process in execution : #{processes[i][0]}\n"
j += 1
end
processes[i][3] -= time_quanta
if processes[i][3] <= 0
turn_around_time += current_time - processes[i][1]
processes.delete_at(i)
end
break if processes.empty?
current_time += context_switch
i = (i+1)%processes.count
end
print "Round Robin: \n"
# print "Average waiting time: "
# print total_waiting_time/num_processes
# puts "\n"
print "Average response time: "
print response_time/n
puts "\n"
print "Average turn around time: "
print turn_around_time/n
puts "\n"
print "--------------------------------------------\n"
end
shortest_remaining_time_first(processes)
processes = []
shortest_job_first(processes)
processes = []
first_come_first_serve(processes)
processes = []
round_robin(processes, 2.0, 2.0)