mit Lösungen

Werbung
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
Herunterladen