parallelism:monitor:start
Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
Beide Seiten der vorigen RevisionVorhergehende ÜberarbeitungNächste Überarbeitung | Vorhergehende Überarbeitung | ||
parallelism:monitor:start [2025/01/02 20:40] – [Aufgabe 3 (für Interessierte!)] Martin Pabst | parallelism:monitor:start [2025/03/09 11:42] (aktuell) – [Aufgabe 2] Martin Pabst | ||
---|---|---|---|
Zeile 26: | Zeile 26: | ||
Counter counter = new Counter(); | Counter counter = new Counter(); | ||
+ | ArrayList< | ||
for (int i = 0; i < 3; i++) { | for (int i = 0; i < 3; i++) { | ||
Zeile 31: | Zeile 32: | ||
| | ||
| | ||
+ | | ||
| | ||
} | } | ||
+ | |||
+ | for (var t : threads) { | ||
+ | | ||
+ | } | ||
+ | |||
+ | println(" | ||
+ | print(counter.counter, | ||
+ | |||
class Counter { | class Counter { | ||
Zeile 58: | Zeile 68: | ||
for (long i = 1; i <= increment; i++) { | for (long i = 1; i <= increment; i++) { | ||
| | ||
- | if(i % (increment/ | + | if(i % (increment / 10) == 0) println(Thread.currentThread().getName() + " hat " + i + " mal erhöht!" |
} | } | ||
- | println(Thread.currentThread().getName() + "\nDone! Counter steht auf: " | + | println(Thread.currentThread().getName() + " |
} | } | ||
Zeile 93: | Zeile 103: | ||
<script type=" | <script type=" | ||
- | |||
Counter counter = new Counter(); | Counter counter = new Counter(); | ||
+ | ArrayList< | ||
for (int i = 0; i < 3; i++) { | for (int i = 0; i < 3; i++) { | ||
Zeile 100: | Zeile 110: | ||
| | ||
| | ||
+ | | ||
| | ||
} | } | ||
+ | |||
+ | for (var t : threads) { | ||
+ | | ||
+ | } | ||
+ | |||
+ | println(" | ||
class Counter { | class Counter { | ||
Zeile 129: | Zeile 146: | ||
for (long i = 1; i <= increment; i++) { | for (long i = 1; i <= increment; i++) { | ||
| | ||
- | if(i % (increment/ | + | if(i % (increment / 10) == 0) println(Thread.currentThread().getName() + " hat " + i + " mal erhöht!" |
} | } | ||
- | println(Thread.currentThread().getName() + " | + | println(Thread.currentThread().getName() + " |
} | } | ||
Zeile 149: | Zeile 166: | ||
<WRAP center round info 80%> | <WRAP center round info 80%> | ||
Ein **Semaphor** ist ein Objekt, das einen Zähler enthält, dessen Wert angibt, von wie vielen Prozessen ein kritischer Abschnitt im Augenblick gerade noch betreten werden darf. \\ (**Bem.:** Eine andere Interpretation besteht darin, dass es $n$ gleichartig Ressourcen gibt. Der Wert des Zählers gibt an, wie viele im Augenblick gerade zur Verfügung stehen.) \\ \\ Der Semaphor besitzt zwei Methoden: | Ein **Semaphor** ist ein Objekt, das einen Zähler enthält, dessen Wert angibt, von wie vielen Prozessen ein kritischer Abschnitt im Augenblick gerade noch betreten werden darf. \\ (**Bem.:** Eine andere Interpretation besteht darin, dass es $n$ gleichartig Ressourcen gibt. Der Wert des Zählers gibt an, wie viele im Augenblick gerade zur Verfügung stehen.) \\ \\ Der Semaphor besitzt zwei Methoden: | ||
- | * '' | + | * '' |
* Ist dies der Fall, so wird der Zähler um eins erniedrigt und mit der danach folgenden Anweisung fortgefahren. Dem Prozess wird damit das Betreten des kritischen Bereichs gestattet. | * Ist dies der Fall, so wird der Zähler um eins erniedrigt und mit der danach folgenden Anweisung fortgefahren. Dem Prozess wird damit das Betreten des kritischen Bereichs gestattet. | ||
* Ist dies **nicht** der Fall, so wird der Prozess in einen Wartezustand versetzt. \\ | * Ist dies **nicht** der Fall, so wird der Prozess in einen Wartezustand versetzt. \\ | ||
Zeile 163: | Zeile 180: | ||
<script type=" | <script type=" | ||
Counter counter = new Counter(); | Counter counter = new Counter(); | ||
+ | ArrayList< | ||
for (int i = 0; i < 3; i++) { | for (int i = 0; i < 3; i++) { | ||
Zeile 168: | Zeile 186: | ||
| | ||
| | ||
+ | | ||
| | ||
} | } | ||
+ | |||
+ | for (var t : threads) { | ||
+ | | ||
+ | } | ||
+ | |||
+ | println(" | ||
+ | |||
class Counter { | class Counter { | ||
Zeile 175: | Zeile 201: | ||
| | ||
- | | + | |
- | semaphore.aquire(); | + | semaphore.acquire(); |
long i = counter; | long i = counter; | ||
i++; | i++; | ||
Zeile 202: | Zeile 228: | ||
| | ||
} | } | ||
- | println(" | + | println(" |
} | } | ||
Zeile 227: | Zeile 253: | ||
| | ||
- | | + | |
while (locked) { | while (locked) { | ||
Zeile 248: | Zeile 274: | ||
<script type=" | <script type=" | ||
NaiveCounter counter = new NaiveCounter(); | NaiveCounter counter = new NaiveCounter(); | ||
+ | ArrayList< | ||
for (int i = 0; i < 3; i++) { | for (int i = 0; i < 3; i++) { | ||
Zeile 253: | Zeile 280: | ||
| | ||
| | ||
+ | | ||
| | ||
} | } | ||
+ | |||
+ | for (var t : threads) { | ||
+ | | ||
+ | } | ||
+ | |||
+ | println(" | ||
+ | |||
+ | |||
class NaiveCounter { | class NaiveCounter { | ||
Zeile 260: | Zeile 296: | ||
| | ||
- | | + | |
while (locked) { | while (locked) { | ||
Zeile 290: | Zeile 326: | ||
if(i % (increment / 10) == 0) println(Thread.currentThread().getName() + " hat " + i + " mal erhöht!" | if(i % (increment / 10) == 0) println(Thread.currentThread().getName() + " hat " + i + " mal erhöht!" | ||
} | } | ||
- | println(Thread.currentThread().getName() + " | + | println(Thread.currentThread().getName() + " |
} | } | ||
Zeile 298: | Zeile 334: | ||
</ | </ | ||
- | ==== Aufgabe 3 (für Interessierte!) ==== | + | ==== Aufgabe 3 ==== |
+ | <WRAP center round todo 80%> | ||
+ | Erstellen Sie eine Klasse '' | ||
+ | * '' | ||
+ | * '' | ||
+ | Da auf die Konto-Objekte per Internetbanking zugegriffen wird und der Webserver jeden Request in einem eigenen Thread bearbeitet, müssen die Methoden der Klasse Konto [[https:// | ||
+ | * a) Erstellen Sie die Klasse Konto in zwei Varianten ('' | ||
+ | * Die Klasse '' | ||
+ | * Die Klasse '' | ||
+ | * b) Erstellen Sie ein Testprogramm, | ||
+ | </ | ||
+ | |||
+ | |||
+ | ==== Aufgabe 4 (für Interessierte!) ==== | ||
<WRAP center round todo 80%> | <WRAP center round todo 80%> | ||
Man kann zeigen, dass naive Ansätze wie in der vorangegangenen Aufgabe nie echten wechselseitigen Ausschluss erreichen. Wie schaffen es dann aber das '' | Man kann zeigen, dass naive Ansätze wie in der vorangegangenen Aufgabe nie echten wechselseitigen Ausschluss erreichen. Wie schaffen es dann aber das '' | ||
- | Beide nutzen spezielle vom Mikroprozessor bereitgestellte Anweisungen, | + | Beide nutzen spezielle vom Mikroprozessor bereitgestellte Anweisungen, |
- | In diesem [[https:// | + | \\ \\ |
+ | In diesem [[https:// | ||
- | Falls es Sie interessiert, finden Sie [[https:// | + | * Beschreiben |
+ | * Warum sind diese atomaren Anweisungen - verglichen mit nicht-atomaren Anweisungen, | ||
+ | In [[https:// | ||
</ | </ | ||
+ | |||
+ | |||
parallelism/monitor/start.1735850434.txt.gz · Zuletzt geändert: 2025/01/02 20:40 von Martin Pabst