Fragen zur Prüfungsvorbereitung Dozenten A. Doering T. Rein 1 Übersicht • Generelle Fragen o Parallelprogrammierung o Netzwerkprogrammierung o Fragen zur Prüfung • Fragen zur den Beispielaufgaben o Aufgaben 1-4 Parallel- und Netzwerkprogrammierung HS 2009 2 wait und Monitor (Vorlesung 2, Folie 39) • Was geschieht wenn ein Thread den Monitor mehrfach für sich reserviert hat und wait() auf dem Thread aufgerufen wird? Gibt er alle Monitore ab? • Ja, da er im Grunde genommen nur einen Monitor besitzt (den für das entsprechende Objekt), diesen aber x-Mal o Interner Zähler (acquisition count) Parallel- und Netzwerkprogrammierung HS 2009 3 notify vs notifyall (V2, F41) • Wann ist notify() besser als notifyall()? • Antwort steht auf Folie 41, Vorlesung 2: Parallel- und Netzwerkprogrammierung HS 2009 4 V3, F2: Mögliche Lösung [Frage 14] • Ist die folgende Reihenfolgen auch möglich? o a) B1 B2 A1 A1 B kommt zuerst dran; kann A nicht wecken, da es noch nicht angelaufen ist o b) A1 A1 B1 B2 A2 Thread A Thread B synchronized(v) { System.out.println("A1\n"); v.wait( ); System.out.println("A2\n"); } synchronized(v) { System.out.println("B1\n"); v.notify(); System.out.println("B2\n"); } • Ja, diese Ausgaben sind beide möglich Parallel- und Netzwerkprogrammierung HS 2009 5 Konstruktor und synchronized (Ü6) [Frage 13] • Eigentlich müsste der Konstruktor schon synchronized sein, da er eine public Methode ist. Die Aussage im Galileo Java OpenBook, der Konstruktor sei implizit synchronized und gleichzeitig sei der Modifier synchronized beim Konstruktur nicht zulässig, ist verwirrend. Wie ist das zu verstehen? • Es ist nicht möglich, den Konstruktor synchronized zu machen • Grundsätzlich wird ein Objekt nur von einem Thread erzeugt o ABER: Der Programmierer muss sich davor schützen, eine Referenz auf this aus dem Konstruktor zu geben Parallel- und Netzwerkprogrammierung HS 2009 6 Atomizität bei Zuweisungen • [Frage 7:] Atomar? In der Vorlesung(05_MemoryModel.pdf seite 13) wurde gesagt, dass String st = "foobar" atomar sei, ist das wirklich so? denn eigentlich is in java doch nur der Zugriff auf Hauptspeichervariablen für Primitive Datantypen (ausser long und double) und Objekt-Referenzen atomar. • [Frage 10:] Übung 2, Aufgabe 2, Frage 3: Was ist die Antwort? o Welche Java-Operationen laufen atomar (unteilbar) ab? • [Frage] Synchronized garantiert atomare Operationen auf Objekte / Variablen -> wirklich? Atomar ist in Java: • Lesen / Schreiben von Referenzvariablen und primitiven Datentypen bis auf long und double • Lesen / Schreiben für alle als volatile deklarierte Variablen Parallel- und Netzwerkprogrammierung HS 2009 7 Atomizität bei Zuweisungen [Frage 7:] Atomar? In der Vorlesung(05_MemoryModel.pdf seite 13) wurde gesagt, dass String st = "foobar" atomar sei, ist das wirklich so? denn eigentlich is in java doch nur der Zugriff auf Hauptspeichervariablen für Primitive Datantypen (ausser long und double) und Objekt-Referenzen atomar. • String st = "foobar" weist st die Referenz auf das Literal zu. • Prüfen: st == "foobar" true Parallel- und Netzwerkprogrammierung HS 2009 8 ThreadLocal und static [Frage 11:] Java Speichermodell, Folie 20 (?) Warum wird die ThreadLocal Variable als "static" definiert? Parallel- und Netzwerkprogrammierung HS 2009 9 Beispiel: ThreadLocal als Ergebnis-Cache Folie 35 der Vorlesung 5 (Speichermodell) public abstract class Calculator { private static ThreadLocal<HashMap<Object, Object>> results = new ThreadLocal<HashMap<Object, Object>>( ) { protected HashMap<Object, Object> initialValue( ) { return new HashMap<Object, Object> ( ); } }; public Object calculate(Object param) { HashMap<Object, Object> hm = results.get( ); Object o = hm.get(param); if (o != null) return o; o = doLocalCalculate(param); hm.put(param, o); return o; } protected abstract Object doLocalCalculate(Object param); } • Diskutieren Sie den Unterschied zu einem globalen Cache! Parallel- und Netzwerkprogrammierung HS 2009 10 ThreadLocal und static [Frage 11:] Java Speichermodell, Folie 20 (?) Warum wird die ThreadLocal Variable als "static" definiert? class A { … ThreadLocal<int> x = new ThreadLocal<int> (); … } • Zugriff auf a.x wird von jedem Thread aus anders aufgelöst, quasi a.x.getInstance (Thread.currentThread()) • Wenn alle Instanzen von A in ein und demselben Thread den gleichen „Zustand“ haben sollen static • das ist hier (und oft) der Fall. Hashmap könnte eigentlich global sein. Zur Vermeidung von konkurrierenden Zugriffen ThreadLocal Parallel- und Netzwerkprogrammierung HS 2009 11 TCP (V9, F11) [Frage 4] • Auf der Folie 11 vom Foliensatz 9 steht folgendes: o TCP:- Kein Byte in der Mitte geht verloren o ABER: Ankunft von Bytes ist nicht garantiert. wirklich? Wie genau gemeint? • Gemäss Wikipedia kommen alle gesendete Daten korrekt an. • Was gilt nun hier? • TCP garantiert, dass ein Bytestrom in der Reihenfolge ohne Verluste von Bytes ankommt, wenn er ankommt. • TCP kann aber nicht garantieren, dass überhaupt Bytes ankommen. o Firewall o Endgerät physisch vom Netzwerk getrennt Parallel- und Netzwerkprogrammierung HS 2009 12 Wildcards bei bind (V10, F10) • Was bedeuten Wildcards bei bind() und wie können diese verwendet werden? • Antwort von Vorlesung 10, Folie 10 o z.B wenn man IP vom Host nicht weiss oder der Host mehrere Netzwerkanschlüsse hat struct sockaddr_in address; address.sin_family = AF_INET; /* AF_ typ */ address.sin_addr.s_addr = INADDR_ANY; /* set host Wildcard */ address.sin_port = htons(7000); /* set port */ bind(sockfd,(struct sockaddr *)&address,sizeof(address)); Parallel- und Netzwerkprogrammierung HS 2009 13 Leserliche IP ausgeben: inet_ntop (V10, F21) • Wie kann mit getsockname() bzw. getpeername() eine leserliche Adresse ausgelesen werden? Mittels htons? • Lösung aus Übung 10, Aufgabe 2 (sipserv) sockaddr_in peersa; socklen_t len = sizeof(peersa); int port = 0; if(getpeername(fd,(struct sockaddr*)&peersa,&len)==0){ port = ntohs(peersa.sin_port); char ipaddr[INET_ADDRSTRLEN]; inet_ntop(AF_INET,&(peersa.sin_addr),ipaddr,INET_ADDRSTRLEN); }else{ cerr << "getpeer/sockname: on fd=" << fd << ":” << strerror(errno) << endl; } Parallel- und Netzwerkprogrammierung HS 2009 14 accept() und Multi-ProcessServer [Frage] Wie kann das Lock des accept() vom Client unter c++ für Linux gewährleistet werden? accept mit einem Mutex schützen: • flock (BSD) • lockf (Linux) • fnctl (POSIX) 15 Multi-Threaded Server (Java) [Frage] Welche Java Infrastruktur wird für einen Multi-Threaded Server mit Thread Pool genutzt? • Siehe 4. VL: (manuelle) Erzeugung eines Thread-Pools, interface Executor und ExecutorServices 16 Multi-Threaded Server (Java) class NetworkService implements Runnable { private final ServerSocket serverSocket; private final ExecutorService pool; public NetworkService(int port, int poolSize) throws IOException { serverSocket = new ServerSocket(port); pool = Executors.newFixedThreadPool(poolSize); } Factory – Methode public void run() { // run the service try { for (;;) { pool.execute(new Handler(serverSocket.accept())); } } catch (IOException ex) { pool.shutdown(); } } } 17 Multi-Threaded Server (Java) class NetworkService implements Runnable { private final ServerSocket serverSocket; private final ExecutorService pool; public NetworkService(int port, int poolSize) throws IOException { serverSocket = new ServerSocket(port); pool = Executors.newFixedThreadPool(poolSize); } public void run() { // run the service try { for (;;) { pool.execute(new Handler(serverSocket.accept())); } class Handler implements Runnable { } catch (IOException ex) { private final Socket socket; pool.shutdown(); Handler(Socket socket) { this.socket = socket; } } public void run() { } // read and service request on socket } } 18 } Materialien für die Prüfung • Socket Man pages (64 S.). o Alphabetisch sortiert o auf Skripteserver verfügbar vorher vertraut machen • Java API (Auszug) o [Frage 9:] Ich sehe in http://wiki.hsr.ch/PnProg/files/JavaAPIsPruefung.pdf nur java.util.concurrent (allerdings z.B. ohne BlockingQueue) plus ein bisschen java.lang, aber kein java.util.Collections, java.net oder java.nio. Kann man davon ausgehen, dass die API-Dokumentation entsprechend ergänzt wird, sollten Fragen zu diesen Themenbereich kommen? ja. Parallel- und Netzwerkprogrammierung HS 2009 19 Beispielaufgabe 1 1.1 richtige Lösung? [Frage 8] • falsch: 1-3, 7-8, 10 • richtig: 4-6, 9 • (Zahl = Zeilennummer) • Zeile 8: “Die Funktion notify() ist unfair, d.h. es wird keine Reihenfolge garantiert.” o ist richtig Parallel- und Netzwerkprogrammierung HS 2009 20 Beispielaufgabe 2 21 Thread-lokale Variable (Beispielaufgabe 2) 22 Beispielaufgabe 2 ? 23 Beispielaufgabe 2 ? 24 Beispielaufgabe 2 ? 25 Beispielaufgabe 2 ? 26 Beispielaufgabe 3 Korrekte Lösung? [Frage 3] • FUNC1 = socket() • FUNC2 = bind() • FUNC3 = listen() • FUNC4 = poll() • FUNC5 = connect() • FUNC6 = close() • Sollte FUNC5 nicht accept() sein? • FUNC5: accept ist richtig Parallel- und Netzwerkprogrammierung HS 2009 27 Beispielaufgabe 3 Korrekte Lösung? [Frage 16] • 3.2 o a) I/O Multiplexing o b) verbindungsorientiert (TCP) o c) Server o d) int o e) ist optional o f) IPv4 • 3.3 o char buf[2000]; • 3.4 o hostx.hsr.ch/152.96.125.15 oder ???/127.0.0.1 • Alles i.O Parallel- und Netzwerkprogrammierung HS 2009 28 Beispielaufgabe 4 ? Parallel- und Netzwerkprogrammierung HS 2009 29