HTA Parallele und verteilte Systeme Prüfung 1 21. Feb

Werbung
HTA
Parallele und verteilte Systeme
Prüfung 1
21. Feb. 2005
Klausurbedingungen:
Es dürfen sämtliche Unterlagen benutzt werden. Damit werden in den Antworten auch die exakten Begriffe aus den Unterlagen erwartet.
Verwenden Sie wo immer möglich die Klassen aus den Unterlagen. Falls Sie eigene Klassen in
den Lösungen einsetzen, muss deren Funktionalität klar ersichtlich sein.
Die Lösungen sind an den entsprechenden Stellen in den Aufgaben einzutragen. Es werden
keine Zusatzblätter akzeptiert !
Halten Sie Ihre Antworten kurz. Es gibt für lange Sätze nicht mehr Punkte.
Alle Aufgabenblätter sind abzugeben.
Viel Glück und Spass bei der Arbeit !
Aufgabe 1
(10 Punkte)
Richtig Falsch Behauptung zu Sicherheitsmechanismen in Java
Bytecode sind JVM Befehle, in einem plattformunabhängigen Zwischenformat.
Der Bytecode wird nach dem Laden und vor dem Ausführen überprüft, damit
sichergestellt ist, dass der Code von einem Java Compiler in korrektem Format
generiert wurde.
Der Bytecode wird nach dem Laden und vor dem Ausführen überprüft, um zu
vermeiden, dass Sicherheitslöcher beim Ausführen im Java Interpreter
entstehen können.
Die Aufgaben des Java Interpreters sind Javacode laden, Javacode verifizieren,
Bytecode generieren und ausführen.
Der SecurityManager überprüft bei einer sicherheitsrelevanten Operation, ob sie
ausgeführt werden darf oder nicht.
Beim Start des Browsers, des Appletviewers oder einer Applikation wird auch
der SecurityManager automatisch gestartet.
Der SecurityManager bleibt aktiv, bis die JVM beendet wird.
Der SecurityManager eines Applets kann durch einen eigenen SecurityManager
mit dem VM-Parameter (z.B. -Djava.security.manager=mysecmgr.java)
überschrieben werden.
Die Eigenschaften von Protection Domains basieren auf den Eigenschaften
Codebase und Signer.
Falls keine Default-Policy-Datei vorhanden ist und der Standard Security
Manager gestartet wird, führt dies schon beim Start der Applikation zu einer
SecurityException
Seite 1
HTA
Parallele und verteilte Systeme
Aufgabe 2
(11 Punkte)
Gegeben ist die Klasse PrimTestServer.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public class PrimTestServer
{
public static void main(String[] args) throws IOException {
int port = Integer.parseInt(args[0]);
ServerSocket s = new ServerSocket(port);
while (true) {
System.out.println("Warten auf Verbindung ...");
Socket cls = s.accept();
System.out.println(cls+" akzeptiert...");
SocketChannel ch = new SocketChannel(cls);
try {
ch.send("Hallo. Sende eine Zahl.");
String value = (String)ch.receive();
if (new BigInteger(value).isProbablePrime(999999999))
ch.send(value+" ist prim.");
else
ch.send(value+" ist nicht prim.");
} catch (ClassNotFoundException e) {}
}
}
}
A. Welche Einschränkungen besitzt die Klasse PrimTestServer ? Geben Sie zwei
Einschränkungen zwei an. (2 Punkte)
___________________________________________________________________________
___________________________________________________________________________
B. Wie muss der SocketChannel auf der Client-Seite erzeugt werden ? (1 Punkt)
___________________________________________________________________________
C. Startet man den PrimTestServer und nimmt ein Client Kontakt auf, könnte die Ausgabe wie
folgt aussehen:
Start und Ausgabe des PrimTestServer.
java PrimTestServer 7788
Warten auf Verbindung ...
Socket[addr=/127.0.0.1,port=1215,localport=7788] akzeptiert...
Exception in thread "main" java.io.StreamCorruptedException: invalid stream header
at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:753)
at java.io.ObjectInputStream.<init>(ObjectInputStream.java:268)
at concurrent.channels.SocketChannel.<init>(SocketChannel.java:15)
at PrimTestServer.main(PrimTestServer.java:10)
Exception in thread "main" Process Exit...
Was ist hier passiert ? (1 Punkt)
___________________________________________________________________________
___________________________________________________________________________
Seite 2
HTA
Parallele und verteilte Systeme
Aufgabe 2
Fortsetzung
D. Die Ausgabe könnten aber auch so aussehen:
Start und Ausgabe des PrimTestServer.
java PrimTestServer 7788
Warten auf Verbindung ...
Socket[addr=/127.0.0.1,port=1227,localport=7788] akzeptiert...
Exception in thread "main" java.net.SocketException: Connection reset
at java.net.SocketInputStream.read(SocketInputStream.java:168)
at java.net.SocketInputStream.read(SocketInputStream.java:182)
at java.io.ObjectInputStream$PeekInputStream.peek(ObjectInputStream.java:2200)
at java.io.ObjectInputStream$BlockDataInputStream.peek(ObjectInputStream.java:2490)
at java.io.ObjectInputStream$BlockDataInputStream.peekByte(ObjectInputStream.java:2500)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1267)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:339)
at concurrent.channels.SocketChannel.receive(SocketChannel.java:27)
at PrimTestServer.main(PrimTestServer.java:13)
Exception in thread "main" Process Exit...
Was ist hier passiert ? (2 Punkte)
___________________________________________________________________________
___________________________________________________________________________
___________________________________________________________________________
E. Welche Korrektur muss ausgeführt werden, damit die Fehler von Aufgabe C und D den
PrimTestServer nicht mehr beeinflussen ? Sie müssen keinen Code angeben, eine kurze
Beschreibung genügt. (2 Punkte)
___________________________________________________________________________
___________________________________________________________________________
___________________________________________________________________________
F.
Mit dem Löschen oder Ersetzen von nur drei Zeilen können Sie die ChannelFactory ins
Programm EchoServer einbinden. Welche drei Zeile(n) müssen Sie mit ChannelFactory
Operationen ersetzen und welche Zeile(n) müssen Sie löschen ? (3 Punkte)
Zeile
Aktion
ChannelFactory Operation
Ersetzen / Löschen
Ersetzen / Löschen
Ersetzen / Löschen
Seite 3
HTA
Parallele und verteilte Systeme
Aufgabe 3
(10 Punkte)
Sie kennen aus dem Unterricht die Latch-Übung mit dem Pferderennen. Hier eine Lösung:
public interface Synch
{
public void acquire() throws InterruptedException;
public void release();
}
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
class Latch implements Synch
{
private boolean latched = false;
synchronized public void acquire() throws InterruptedException {
while (!latched)
wait();
}
public synchronized void release() {
latched = true;
notifyAll();
}
}
class RaceHorse implements Runnable
{
private Synch startSignal;
private String name;
public RaceHorse(String name, Synch startSignal) {
this.name = name;
this.startSignal = startSignal;
}
public void run() {
try {
startSignal.acquire();
Thread.sleep((long)(3000.0*Math.random()));
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Rennpferd "+name+" ist im Ziel.");
}
}
public class Turf
{
public static void main(String[] args) {
Synch starterBox = new Latch();
new Thread(new RaceHorse("Little Lucky",starterBox)).start();
new Thread(new RaceHorse("Seabiscuit",starterBox)).start();
new Thread(new RaceHorse("Air Speed",starterBox)).start();
starterBox.release();
}
}
Seite 4
HTA
Parallele und verteilte Systeme
Aufgabe 3
Fortsetzung
Ordnen Sie, falls dies möglich ist, den folgenden Aussagen über den Thread
des Rennpferdes "Seabiscuit" die dazugehörige Programmzeile oder Programmzeilen zu. Je Richtige Zuordnung 1 Punkt
A. Der Thread befindet sich im new-Zustand.
B. Der Thread wird in den Ready-Zustand versetzt.
C. Diese Operation(en) des Threads werden (quasi)parallel abgearbeitet.
D. Der Thread wird in den Blocked-Zustand versetzt
E. Der Thread kommt vom Running-Zustand in den Objects-Wait-Pool.
F.
Der Thread kommt vom Running-Zustand in den Objects-Lock-Pool.
G. Operation die den Thread vom Objects-Wait-Pool in den Objects-LockPool versetzt.
H. Operation die den Thread vom Objects-Lock-Pool in den Objects-WaitPool versetzt.
I.
Der Thread wird in den Dead-Zustand versetzt.
K. Der Thred wird vom Scheduler kontrolliert in den Zeilen:
Aufgabe 4
(9 Punkte)
Sie kennen die Klasse Semaphor aus dem Package concurrent:
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
public class Semaphore implements Synch
{
private int s;
// Semaphorenzähler
private int count;
// Anzahl der wartenden Threads.
public Semaphore(int i) {
if (i < 0) throw new IllegalArgumentException(i + " < 0");
s = i;
count = 0;
}
public synchronized void acquire() throws InterruptedException {
while (s == 0) {
count++;
this.wait();
count--;
}
s--;
}
public synchronized void release() {
if (count > 0) {
this.notify();
}
s++;
}
public synchronized int pending() {
return count;
}
}
Seite 5
Zeile(n)
HTA
Aufgabe 4
Parallele und verteilte Systeme
Fortsetzung
Erweitern Sie die Klasse Semaphor und schreiben Sie eine Methode attempt, die versucht einen
Lock zu bekommen (ähnlich wie acquire) und der man ein Timeout in Millisekunden übergibt. Falls
die Methode nach Ablauf des Timeout noch keinen Lock erhalten hat, gibt sie false zurück. Erhält
die Methode den Lock jedoch vor Ablauf des Timeout gibt sie true zurück. (9 Punkte)
public synchronized boolean attempt(long msec) throws InterruptedException
Seite 6
HTA
Parallele und verteilte Systeme
Lösungen
Aufgabe 1
(10 Punkte)
Richtig
Behauptung zu Sicherheitsmechanismen in Java
Bytecode sind JVM Befehle, in einem plattformunabhängigen Zwischenformat.
Der Bytecode wird nach dem Laden und vor dem Ausführen überprüft, damit
sichergestellt ist, dass der Code von einem Java Compiler in korrektem Format generiert
wurde.
Der Bytecode wird nach dem Laden und vor dem Ausführen überprüft, um zu
vermeiden, dass Sicherheitslöcher beim Ausführen im Java Interpreter entstehen
können.
Die Aufgaben des Java Interpreters sind Javacode laden, Javacode verifizieren,
Bytecode generieren und ausführen.
Der SecurityManager überprüft bei einer sicherheitsrelevanten Operation, ob sie
ausgeführt werden darf oder nicht.
Beim Start des Browsers, des Appletviewers oder einer Applikation wird auch der
SecurityManager automatisch gestartet.
Der SecurityManager bleibt aktiv, bis die JVM beendet wird.
Der SecurityManager eines Applets kann durch einen eigenen SecurityManager mit dem
VM-Parameter (z.B. -Djava.security.manager=mysecmgr.java) überschrieben
werden.
Die Eigenschaften von Protection Domains basieren auf den Eigenschaften Codebase
und Signer.
Falls keine Default-Policy-Datei vorhanden ist und der Standard Security Manager
gestartet wird, führt dies schon beim Start der Applikation zu einer SecurityException
Falsch
Aufgabe 2
A.
Der PrimTestServer ist blockierend, d.h. er kann nur immer einen Client zur
gleichen Zeit bearbeiten.
Der PrimTestServer ist nicht skalierbar
Es können nur Java Objekte verarbeitet werden.
2 Punkte
B.
Channel ch = new SocketChannel(new Socket(host,port));
1 Punkt
Der Client kann keinen SocketChannel aufbauen.
1 Punkt
Der PrimTestServer funktioniert gut bis zum Zeitpunkt, wo der Client die Verbindung
abbricht. Beim Versuch den SocketChannel auszulesen, wird eine SocketException
ausgelöst.
2 Punkte
Die SocketException Erzeugung muss in den try-catch-Block aufgenommen werden.
1 Punkt
Die SocketException muss zusätzlich bei Zeile 18 abgefangen werden.
1 Punkt
C.
D.
E.
Zum Beispiel mit folgendem Code (nicht verlangt)
try {
SocketChannel ch = new SocketChannel(cls);
...
} catch (Exception e) {}
F: pro richtige Zeile 1 Punkt
Zeile
Aktion
5
Ersetzen / Löschen
8
Ersetzen / Löschen
10 Ersetzen / Löschen
ChannelFactory Operation
ChannelFactory cf = new ChannelFactory(port);
SocketChannel ch = cf.getChannel();
Seite 7
HTA
Parallele und verteilte Systeme
Aufgabe 3
Je richtige und vollständige Zuordnung 1 Punkt
A.
B.
C.
D.
E.
F.
G.
H.
I.
K.
42
42
26-34
29 und 33 (I/O Operation)
7
5 (ausgelöst von 28)
12 (ausgelöst von 44)
34
26-34
Aufgabe 4
attempt muss sich wie folgt verhalten
wie acquire, wenn der Sema-Zähler grösser Null ist (3 Punkte)
wie acquire, wenn release innerhalb des Timeout ausgelöst wird (3 Punkte)
zurückkehren, wenn Timeout abgelaufen ist (3 Punkte)
Punkte Code
1
1
1
1
1
1¦
¦
1
1¦
¦
¦
1
public synchronized boolean attempt(long msec)
throws InterruptedException {
if (s > 0) {
s--;
return true;
}
else if (msec <= 0) {
return false;
}
else {
long startTime = System.currentTimeMillis();
long waitTime = msec;
while (true) {
count++;
this.wait(waitTime);
count--;
if (s > 0) {
s--;
return true;
}
else {
long now = System.currentTimeMillis();
waitTime = msec-(now-startTime);
if (waitTime <= 0) {
return false;
}
}
}
}
}
9 Total
Seite 8
Herunterladen