Übung „Nichtsequentielle Programmierung“ - auf Matthias

Werbung
Übung
„Nichtsequentielle Programmierung“
Sommer 2009
Prof. Dr. Marcel Kyas
Blatt 4
Aufgabe 16 (ohne Punkte)
Der folgende Methodenrumpf S berechnet das Produkt zweier natürlicher Zahlen x und y:
int prod = 0;
int count = y;
while (count > 0) {
prod = prod + x;
count = count − 1;
}
• Geben Sie die Berechnung, also eine Folge von Zuständen, die angibt, wie sich die
Variablen verändern, von S an, die im Zustand hx 7→ 4, y 7→ 3i startet.
• Beweisen Sie die Korrektheitsformel
{x ≥ 0 ∧ y ≥ 0} S {prod = x · y}
mit Hilfe des Hoare-Kalküls
• Geben Sie eine Korrektheitsformel für S an, die ausdrückt, dass die Ausführung von S
den Wert der Variablen x und y nicht verändert.
Aufgabe 17 (ohne Punkte)
Die Fibonacci-Zahlen Fn sind induktiv wie folgt definiert:
F0 =0
F1 =1
Fn =Fn−1 + Fn−2 für n ≥ 2.
1
Nehmen Sie an, dass es in der Zusicherungssprache das Funktionssymbol fib(n) gibt, so dass
für alle n ≥ 0 der Ausdruck fib(n) die Fibonacci-Zahl Fn bezeichnet.
Beweisen Sie die Korrektheitsformel
{n ≥ 0} S {x = fib(n)}
für den Methodenrumpf S
int x=0; int y=1; int count=n;
while (count > 0) {
int h = y; y = x + y; x = h; count = count − 1
}
im Hoare-Kalkül.
Aufgabe 18 (10 Punkte)
Betrachten Sie das Programm in Abbildung 1, welches in einem Feld int[] f eine Nullstelle
sucht.
Zeigen oder widerlegen Sie mit Hilfe des Hoare-Kalküls:
{true} ZERO { f [x] == 0 ∨ f [y] == 0 ∨ ¬found}
Aufgabe 19 (10 Punkte)
Betrachten Sie den Bakery Algorithmus aus der Vorlesung. Betrachten Sie die folgende Routine, die das Maximum berechnet:
1
2
3
4
5
int local1 = i;
for (int l = 0; l < n; ++l)
if (number[local1] <= number[l])
local1 = l;
number[i] = 1 + number[local1];
Zeigen oder widerlegen Sie:
1. Der modifizierte Bakery Algorithmus garantiert gegenseitigen Ausschluss.
2. Der modifizierte Bakery Algorithmus ist fair, d.h., jeder Thread, der eine Nummer gezogen hat, wird schließlich in seine kritische Sektion eintreten.
Aufgabe 20 (10 Punkte)
Nehmen Sie an, ein Computer verfügt über eine atomare Vergleiche-und-tausche-Operation
mit dem folgenden Effekt:
2
1
2
3
4
class ZERO {
volatile boolean found;
volatile int x;
volatile int y;
5
void zero(int[] f) {
found = false;
x = f.length / 2;
y = f.length / 2 + 1;
Thread t0 = new Thread(new Runnable() {
void run() {
while (!found && x < f.length − 1) {
x = x + 1;
if (f[x] == 0) found = true;
}
}});
t0.start();
while (!found && y > 0) {
y = y−1;
if (f[y] == 0) found = true;
}
for (;;) try { t0.join(); break; } catch (InterruptedException e) {};
}
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
}
Abbildung 1: Suchen von Nullstellen
3
boolean CSW(int[] a, int[] b, int[] c) {
h if (a[0] == c[0]) {
c[0] = b[0]; return false;
} else {
a[0] = c[0]; return true;
}i
Benutzen Sie CSW sinnvoll1 , um eine Lösung zum gegenseitigen Ausschluss für n Threads
zu entwickeln. Kümmern Sie sich nicht um Fairness. Beschreiben Sie in klaren Worten, wie
Ihre Lösung funktioniert und warum sie korrekt ist.
Abgabe
Die Lösungen der Aufgaben 15 bis 20 sind bis zum 19. Mai, 12:00 Uhr, in den Briefkasten
Ihres Tutors neben Raum 137 einzuwerfen.
1 Sie
benutzen CSW sinnvoll, wenn der Algorithmus nicht mehr korrekt funktioniert, wenn alle CSW aus Ihrer
Lösung entfernt werden
4
Herunterladen