Prozesse
Wiederholung:
Abarbeitung von Maschienenbefehlen
Abarbeitung von Machinenprogram:
Problem: Oft gleiche/ähnlche Abläufe
2 Dinge unterscheiden
HP: ... 4000 ... ... 4100 CALL 4500 4101 ... Prozedur 1: 4500 ... ... 4600 CALL 4800 4601 ... ... 4650 CALL 4800 4651 ... ... 4700 RET Prozedur 2. 4800 ... ... 4890 RET
Modell-Maschiene
Stack baut sich auf:
HP: 4000 ... ... 40?? PUSH pn ... 4098 PUSH p2 4099 PUSH p1 4100 CALL 4500 4101 POP p1 4102 POP p2 ... 41?? POP pn Prozedur: 4500 PUSH // Alle Register R14 to R0 auf Stack 4501 MOVE 64+SP, R12 //p1 in R12 4502 MOVE SP, R13 ... <up> ???? MOVE R13, SP POP R RET
PROCEDURE fak(k:INT) RETURNS INT BEGIN IF k=0 THEN RETURN 1 ELSE RETURN k*fak(k-1) END
Name | Wie | Was |
---|---|---|
Programm | Statisch | Code |
Prozess | Dynamisch | Programm in Ausführung → Im Speicher → Eigener Kontext |
Arten (paralleler) Ausführung:
Multiprogramming rechnungen (!) Siehe script S. 30
Prozess erzeugen
Aktueller Modus steht in PSW (Programm Status Word)
Bei
Lösung: Prioritäten
IPL (Interrupt Priority Level) Teil des PSW (Programm Status Word)
Pro Thread
Zustände
Arten
Threads | |||
---|---|---|---|
1 | n | ||
Prozesse | 1 | Klassisch | Normal |
m | Thread kann Prozess wechseln z.B. Cloud | n:1 und 1:m kombiniert z.B. TRIX |
http://www.uml-diagrams.org/examples/java-6-thread-state-machine-diagram-example.html|Perfektes Diagramm (Zu beachten ist, das objekte noch eine lock- und wait-pool haben. Ein Thread ist BLOCKED wenn es im lock-pool eines objekts ist, indem es eine syncronizes pasage betreten will. Ein Thread ist *WAITING wenn es im wait-pool eines Objekts ist, indem es wait() in einem syncronized block aufgerufen hat (s. Monitor weiter unten).
Doku des Thread.State.
Advanced shit ⇒ Uninteresant:
http://en.wikipedia.org/wiki/Flynn's_taxonomy
Single Data | Multiple Data | |
---|---|---|
Single Instruction | SISD (für Alte, normale CPUs | SIMD Normale CPUs mit SSE/3Dnow Vektorprozessoren / Arrayprozessoren |
Multiple Instruction | MISD Fehlertolerante Rechner (Flugzeuge) | MIMD Normale Multicore CPUs Rechnerverbunde (Supercomputer) |
Aufgabenverteilung
3 Zustands Prozessmodell ⇒ Short Term Scheduling 5 Zustands Prozessmodell ⇒ Medium Term Scheduling 7 Zustands Prozessmodell ⇒ Long Term Scheduling
Scheduling Arten
Mittlere Verweildauer:
FCFS > RR > SRPT/SJF (best)
Allgemeine Anforderungen
System Arten / Anforderungen
Zeitpunkte
Zeitspannen
Verweildauer = Bedienzeit + Wartezeit
$n$ | Anzahl Jobs |
$t_j$ | Ausführungszeit eines Jobs |
$i_j$ | Permutation der Jobs |
Mittlere Verweildauer bei der Reihenfolge $t_{i_1}, t_{i_2}, \dots, t_{i_n}$ (← das ist doch keine Reihenfolge (?)) ist: \[ \frac{1}{n} (t_{i_1} + (t_{i_1} + t_{i_2}) + \cdots + (t_{i_1} + t_{i_2} + \cdots + t_{i_n})) = \frac{1}{n} \sum^n_{k=1}\sum^k_{j=1}t_{i_j} = \frac{1}{n} \sum^n_{k=1}(n-k+1)t_{i_k} \]
Das ist offensichtlich minimal wenn \[ n \cdot t_{i_1} + (n-1) \cdot t_{i_2} + \cdots + 2 \cdot t_{i_{n-1}} + 1 \cdot t_{i_{n-1}} = min \]
die ist schon wieder offensichtlich minimal wenn gilt: \[ t_{i_1} < t_{i_2} < \cdots < t_{i_{n-1}} < t_{i_n} \]
Prozessfortschrittsdiagramm
Alle 4 Deadlockbedingungen müssen werfüllt sein
Begriffe
Default
Erreichbarkeitsgraph
deadlock ⇒ partial deadlock
Achtung: Werden mehere Marken eingesamelt, so werden dennoch nur eine (default) abgegeben.
Quasi Paralell | Parallel | |
---|---|---|
Unabhängige Abläufe | ||
Abhängige Abläufe | Nebenläufigkeit |
Ablaufverhalten:
Busy waiting: while(not condition) { nop; }
Erzeuger
while(true) { el = clreate(); wait(out); wait(s); push(el); signal(s); signal(in); }
Verbraucher:
while(true) { wait(in); wait(s); pop(); signal(s); signal(out); }
while(true) { wait(esser); wait(stäbchen[i]); wait(stäbchen[(i+1) % n]); essen(); signal(stäbchen[(i+1) % n]); signal(stäbchen[i]); signal(esser); }
flag[0] = true; // Ich will while (flag[1] == true) { // Solange der andere will oder tut if (turn ≠ 0) { // und ich bin nicht dran flag[0] = false; // ziehe mein "will" zurück, bis ich wieder dran bin while (turn ≠ 0) { // (so kann der andre aus der Äuseren Schleife raus) // busy wait } flag[0] = true; } } // <critical section> // ... // </critical section> turn = 1; flag[0] = false;
Nur 2 Prozesse!
/* claim the resource */ flags[i] = BUSY; /* give away the turn */ turn = j ; /* wait while the other process is using the resource *and* has the turn */ while ((flags[j] == BUSY) && (turn != i )) { } // <critical section> // ... // </critical section> /* release the resource */ flags[i] = FREE;
Test and Set ist ein atomarer Maschienenbefehl.
bool testAndSet(int * i) { if(*i == 0) { *i = 1; return true; } else { *i = 1; return false; } }
In | Out | |
---|---|---|
i | i | return |
0 | 1 | true |
1 | 1 | false |
while(testAndSet(i) == false) { nop; } // <critical section> // ... // </critical section> i = 0;
Test and Set ist ein atomarer Maschienenbefehl.
bool testAndSet(bool * lock) { bool old = *lock; *lock = true; return old; }
In | Out | |
---|---|---|
lock | lock | return |
false | true | false |
true | true | true |
while(testAndSet(lock) == true) { nop; } // <critical section> // ... // </critical section> lock = false;
signal()
dekrementiert auch unter 0wait(S = 0)
⇒ wait!init()
mit 0 ⇒ Man kann auf etwas warten lasesen (syncronisation)wait()
Aufruf ⇒ Ein anderer Thread darf in den selbe Monitorcwait()
csignal()
Java-Style
Send | |||
---|---|---|---|
Blocking | Non Blocking | ||
Receive | Blocking | Rendezvous | Post-Modell |
Non Blocking | Mit/Ohne Buffer |
Adressierung
lib
$2^L \le 2^K \le 2^U \le 2^N$
Entfernen: Rekursiver Merge!
Normal | 1:1 Split |
---|---|
Jetzt | $2^n$ ⇒ 1:3 split $3 \cdot 2^n$ ⇒ 1:2 split |
HGS | HS |
Pages/Seiten | Frames/Seitenrahmen |
Vorwärtsabstand: Löschen was am längsten nicht mehr gebraucht wird
Z | E | ||||
Fr 1 | 3 | 3 | 4 | ||
Fr 2 | 2 | 2 | 2 | 3 | |
Fr 3 | 1 | 1 | 1 | 1 | 2 |
Zugriff: Nix Ersetzen: Durchdrücken
Z | E | ||||
Fr 1 | 3 | 2 | 4 | ||
Fr 2 | 2 | 2 | 3 | 2 | |
Fr 3 | 1 | 1 | 1 | 1 | 3 |
Zugriff: Ganz Hochzeihen Ersetzen: Durchdrücken
Bei: Starker Lokalität
Z | E | ||||
Fr 1 | 3 | 2 | 2 | ||
Fr 2 | 2 | 2 | 3 | 3 | |
Fr 3 | 1 | 1 | 1 | 1 | 4 |
Zugriff: Eins Hochbubblen Ersetzen: Unten austauschen
W(t, h) = Menge der h letzten referenzierten Seiten, seit einschließlich t w(t, h) = | W(t, h) |
Bei: Starker Lokalität
FIFO: Mehr Seiten ⇒ ggf. mehr page faults
Anforderungsreihenfolge der Pages
Von wo eine zugegriffene Page hochgezogen wird (1-Indexiert)
Ref. Str. | 2 | 3 | 1 | 3 | 3 |
---|---|---|---|---|---|
1 | 2 | 3 | 1 | 3 | 3 |
2 | 4 | 2 | 3 | 1 | 1 |
3 | 1 | 4 | 2 | 2 | 2 |
4 | 1 | 4 | 4 | 4 | |
Dist. Str. | ? | ∞ | 4 | 2 | 1 |
Mittlere Zeit zwischen Seitenfehlern
Mehr Frames ⇒ Anszahl an Seitenfehlern wird kleiner oder bleibt gleich
\[ F_m = \sum^n_{k=m+1} C_k + C_\infty \]