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