Klausur vom 29 07 2008 -- Lösung(update mit verbesserter Version)

Aufgabe 4e)
Im Skript steht:

Was heißt „begrenzen“? „Unterbinden“? Oder „man weiß es nicht“? Beispielsweise lautet mein Code:

volatile a = 1;
volatile b = 2;
...
...
a = 4;
b = 5;

Gewährleistet die Verwendung von volatile-Variablen sicher, dass die Zuweisung in genau der Reihenfolge stattfindet, in der sie da steht?


Alles was vor einer Zuweisung einer volatile Variable im Code steht passiert vorher und umgekehrt. Wenn du nur volatile Variablen verwendest (oder in jeder zweiten Zeile), ist die Reihenfolge entsprechend fest.

1 „Gefällt mir“

Zu Aufgabe 6b)

Ist folgendes Ergebnis richtig?
(\XY.X’Z)


Sieht so aus, als hättest du eine freie Variable substituiert (X’), das ist nicht erlaubt oder?


Meiner Meinung nach sollte (\XY.XZ) richtig sein.
@L.F.Ant: Also laut den Übungsfolien ist Substitution nicht erlaubt in der Klausur.


Da komm ich auch drauf.


Jopp, bin jetzt auch bei den Lambda Kalkül Folien angekommen, da steht das bei der alpha-Konversion extra dabei [keine freien Variablen]. Und bulsa hats ja mittlerweile im andern Thread verlinkt.


Die Aufgabe wurde ja mit Pipelining gelöst, das heißt wenn der letzte Thread fertig ist, sind auf jeden Fall auch alle anderen Threads fertig.

1 „Gefällt mir“

Aaaaah, logisch! D’oh! … Danke! :slight_smile:


Wie die Abstraktionen zustande kommen, das ist mir zwar halbwegs klar, aber wie kommt man bitte auf die Applikationen?
Trete da gerade auf der Stelle… :-/


Im Prinzip sind die Applikationen alles, was ohne “.” aufeinander angewendet wird. Zum Beispiel eben “Hans” auf “Wurst” oder der ganze Ausdruck “(\ Wurst Salat. Hans Wurst)” auf “Kraut”. Aber vorsicht: “Kraut” auf “Wurst” ist falsch, denn die Applikation ist linksassoziativ und vor “Kraut” steht ja noch was da! Das bedeutet: Schau links vor “Kraut” nach der Funktion, die darauf angewendet wird. Erst wenn du die gefunden hast (und sie auf “Kraut” angewendet hast), kannst du das Resultat auf “Wurst” loslassen.


Und „(λ Wurst Salat . Hans Wurst) Kraut Wurst“ kommt dann zustande, weil man „(λ Wurst Salat . Hans Wurst) Kraut“ auf „Wurst“ anwendet?


Ja.


Kann einer von euch damaligen seine Lösungsvorschläge nochmal neu hochladen? Die Uploads sind wohl mittlerweile abgelaufen.

Hier meine Lösung:
A1. MC

a) falsch
b) nein
c) MIMD
d) gegenseitiger Ausschluss/Sichtbarkeitssynchronisation
e) ja, nein, nein
f) falsch, richtig

A2. Petri

a) T1, T3, T4
b) folgt
c) lebendig: Nein, T1 kann irgendwann nicht mehr feuern; beschränkt: Ja, nie mehr als 2 Token im Netz

A3. Turnier
a)

Zeilenweise:
9 7 1 0 3 2 5 8
7 7 0 0 2 2 5 8
0 7 0 0 2 2 5 8

b) len/2
c) log_2 (n)
d)

1: len/2
2: s+=a
3: leer
4: b.await()
5: 
for (int i = 0; i < len -1; i+=2) {
    t.join()
}

A4. Schreibtischlauf

a) 2, 4, 5
b) 1, 4, 5
c) 2<1; 5<4; 5<1
d) 8
e) 6
f) 8, wie bei d), da eigenständige Objekte

A5. Mengen (hier Scala Listen)

a)
def einfuegen: Int => List[Int] => List[Int] = {
   x => ls => ls match {
      case Nil => List(x)
      case ls => if (ls.contains(x)) ls else x::ls
   } 
}

b)
def entfernen: Int => List[Int] => List[Int] = {
   x => ls => ls match {
      case Nil => Nil
      case l::ls => if (x==l) ls else l::entfernen(x)(ls)
   }
}

c)
def einfach: List[Int] => List[Int] => List[Int] = {
   xs => ys => (xs, ys) match {
      case (Nil, Nil) => Nil
      case (xs, Nil) => xs
      case (Nil, ys) => ys
      case (x::xs, y::ys) => if (x==y) einfach(xs)(ys) else x::y::einfach(xs)(ys)
   }
}



  • geloescht-


also ich bin mir zwar selber nicht ganz sicher, bei der Aufgabe 3 aber "2: s+=a " sollte eigentlich nicht funktionieren oder sehe ich das falsch? Denn a=i , und i =0 beim ersten Schleifendurchlauf, deshalb a=0, s= s+a entspricht somit s=s+0 = s und somit müsste das doch eine endloschleife sein, da a auch nicht mehr geändert wird, oder habe ich mich jetzt verguckt?

zu 5:
for (int i = 0; i < len -1; i+=2) {
t.join()
}

sollte ebenfalls nicht funktionieren weil t in der schleife bekannt ist und die schleife vor dem 5er-block schon endet.

mein alternativ-vorschlag wäre es in der CyclicBarrier, noch +1 hinzuzufuegen und im 5er-Block die for-schleife aus block 2 zu übernehmen (wie auch immer block 2 korrekt ausschauen mag) und in jedem schleifendurchlauf b.await() aufzurufen.

Ich hoff ich habe hier richtig argumentiert.


also das mit dem join klappt wirklich so nicht…

das sollte per barrier gehen ich verweise mal auf die ähnlich aufgabe aus 2011

https://fsi.informatik.uni-erlangen.de/forum/thread/11624,2-Klausur-09-08-2011