-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathlab5.py
123 lines (104 loc) · 4.38 KB
/
lab5.py
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
#!/usr/bin/python
# -*- coding: UTF-8 -*-
# simulacija rasproređivanja SCHED_RR
import time
''' Primjer osnovna korištenja klasa u Pythonu '''
class Dretva:
def __init__ ( self, trenutak_pojave, broj, prioritet, trajanje ):
self.t = trenutak_pojave # kada se dretva pojavljuje
self.id = broj # identifikacijski broj dretve
self.c = trajanje # koliko još vremena treba
self.p = prioritet # prioritet dretve
def ispisi ( self ):
print ( self.id, self.p, self.c, "\t", end="" )
class Aktivna_D:
def __init__ ( self ):
self.dretva = None
def dohvati ( self ):
return self.dretva
def postavi ( self, dretva ):
self.dretva = dretva
def odradila_kvant ( self ):
if self.dretva:
self.dretva.c -= 1
if self.dretva.c == 0:
print ( "Zavrsila dretva " + str(self.dretva.id))
self.dretva = None
def ispisi ( self ):
if self.dretva:
self.dretva.ispisi()
class Pripravne_D:
def __init__ ( self, broj_prioriteta ):
self.n = broj_prioriteta + 1
self.red = [[] for i in range(self.n)]
def dodaj ( self, dretva ):
if dretva:
self.red[dretva.p].append ( dretva )
def uzmi_prvu ( self ):
for i in range ( self.n-1, -1, -1 ): # od n-1 do 0
if self.red[i]:
dretva = self.red[i].pop(0)
return dretva
return None
def ispisi ( self ):
for i in range ( self.n-1, -1, -1 ): # od n-1 do 0
for dretva in self.red[i]:
dretva.ispisi()
class Rasporedjivac:
def __init__ ( self, aktivna, pripravne ):
self.aktivna = aktivna
self.pripravne = pripravne
self.t = 0 # vrijeme
def sched_fifo_korak ( self ):
self.aktivna.odradila_kvant()
if not self.aktivna.dohvati(): # aktivna gotova?
self.aktivna.postavi ( self.pripravne.uzmi_prvu() )
self.t += 1
def sched_rr_korak ( self ):
# napraviti:
self.aktivna.odradila_kvant() # 1. aktivna je odradila kvant
self.pripravne.dodaj(self.aktivna.dretva) # 2. makni aktivnu u pripravne
self.aktivna.postavi(self.pripravne.uzmi_prvu()) # 3. uzmi prvu pripravnu i učini ju aktivnom
self.t += 1
def sched_dodaj ( self, dretva ):
# napraviti:
if not self.aktivna.dohvati(): #ako nema aktivne dretve tada
self.aktivna.postavi(dretva) #postavi "dretva" kao aktivnu
else:# inače
if dretva.p > self.aktivna.dretva.p: #ako je "dretva" većeg prioriteta od aktivne tada
self.pripravne.dodaj(self.aktivna.dretva) #spremi aktivnu u red pripravnih
self.aktivna.postavi(dretva) #postavi "dretva" kao aktivnu
else: #inače
self.pripravne.dodaj(dretva) #spremi "dretva" u red pripravnih
# privremeni kod za SCHED_FIFO (isto treba i za RR)
"""if not self.aktivna.dohvati(): # nema aktivne?
self.aktivna.postavi ( dretva )
else:
self.pripravne.dodaj ( dretva )"""
# problem ovog koda je da nova dretva većeg prioriteta neće odmah krenuti
# preoblikovati ovo prema pseudokodu iznad
self.ispisi ( "Dodana dretva " + str(dretva.id) )
def ispisi ( self, msg="" ):
print ( self.t, "\t", end="" )
self.aktivna.ispisi()
self.pripravne.ispisi()
print(msg)
def main():
dretve = [] # t id prio trajanje
dretve.append ( Dretva (1, 51, 5, 10) )
dretve.append ( Dretva (3, 52, 5, 7) )
dretve.append ( Dretva (7, 31, 3, 5) )
dretve.append ( Dretva (12, 53, 5, 3) )
dretve.append ( Dretva (22, 32, 3, 6) )
dretve.append ( Dretva (30, 41, 4, 3) )
max_prio = max ( [x.p for x in dretve] )
rasporedjivac = Rasporedjivac ( Aktivna_D(), Pripravne_D(max_prio) )
print ( "t\tAktivna\tPripravne")
while dretve or rasporedjivac.aktivna.dohvati():
rasporedjivac.ispisi()
rasporedjivac.sched_fifo_korak() # zamijeniti sa: sched_rr_korak
while dretve and dretve[0].t == rasporedjivac.t:
rasporedjivac.sched_dodaj ( dretve.pop(0) )
time.sleep(1)
if __name__ == "__main__":
main()