6. Tutorium zu Softwaretechnik I Parallelität und Testen Michael Hoff 01.07.2014 INSTITUT FÜR PROGRAMMSTRUKTUREN UND DATENORGANISATION KIT Universität des Landes Baden-Württemberg und nationales Forschungszentrum in der Helmholtz-Gemeinschaft www.kit.edu
Übersicht 1 Parallelität Erzeugen von Parallelität Synchronisation und Koordination Verklemmung 2 Testen Kontrollflussgraph Überdeckungstests
Letztes Übungsblatt
Parallelität
Einführung Definition von "parallel" Allgemein: nebeneinander verlaufend, in gleichem Abstand Informatik: gleichzeitig ablaufend Programmieransätze Parallelrechner mit gemeinsamem Speicher Prozessoren haben einen gemeinsamen Speicherbereich Jeder Prozessor kann jede Speicherzelle ansprechen Parallelrechner mit verteiltem Speicher Jeder Prozessor hat seinen eigenen Speicher Kommunikation zwischen Prozessoren über Nachrichten Michael Hoff 6. Tutorium 01.07.2014 5/34
Prozesse und Kontrollfäden Prozess (engl. Process) Ein Programm in Ausführung Wird durch Betriebssystem erzeugt Enthält Informationen über Programmressourcen und Ausführungszustand CPU-Kontextwechsel zwischen Prozessen langsam Michael Hoff 6. Tutorium 01.07.2014 6/34
Prozesse und Kontrollfäden Prozess (engl. Process) Ein Programm in Ausführung Wird durch Betriebssystem erzeugt Enthält Informationen über Programmressourcen und Ausführungszustand CPU-Kontextwechsel zwischen Prozessen langsam Kontrollfaden (engl. Thread) Unabhängiger Instruktionsstrom, der ausgeführt werden kann Existiert in einem Prozess CPU-Kontextwechsel zwischen Fäden des gleichen Prozesses schnell Michael Hoff 6. Tutorium 01.07.2014 6/34
Prozesse und Threads Prozess Code Halde Faden 1 Faden 1 Programmzähler Kellerspeicher für Aufrufe und Auswertung Aktivierungszeiger Aktivierung Faden 2 Kellerzeiger Übrige Register Aktivierung Zwischenergebnisse Anweisungen Objekte Letztes Element Faden n Freier Kellerspeicher 24 Kapitel 4.2 - Grundlagen zur Parallelverarbeitung Mehr Details zu Parallelität in VL Betriebsysteme und Rechnerstrukturen Michael Hoff 6. Tutorium 01.07.2014 7/34
Konstrukte Erzeugen zum von Erzeugen Threads in von Java Parallelität (2) Methode 1 Implementieren der Schnittstelle Runnable Faden erzeugen Methode 2 Anlegen einer Subklasse von Thread Implementieren der Methode run() Überschreiben der Methode run() Übergabe einer Instanz an einen Konstruktor eines Thread-Objekts thread Anlegen einer Instanz thread der Subklasse Aufruf der Methode thread.start() 5 Kapitel 4.2.1 - Parallelität in Java Michael Hoff 6. Tutorium 01.07.2014 8/34
Beispiel: Konstrukte Erzeugen zum Erzeugen von Threads von Parallelität in Java Beispiel (1) Klasse, die Runnable implementiert: class ComputeRun implements Runnable { long min, max; ComputeRun (long min, long max) { this.min = min; this.max = max; } public void run () { // Parallele Aufgabe } } Erzeuge und starte Kontrollfaden: ComputeRun c = new ComputeRun(1, 20); new Thread(c).start(); Klasse, die von Thread erbt: class ComputeRun extends Thread { long min, max; ComputeRun (long min, long max) { this.min = min; this.max = max; } public void run () { // Parallele Aufgabe } } Erzeuge und starte Kontrollfaden: ComputeRun t = new ComputeRun(1, 20); t.start(); Michael Hoff 6. Tutorium 01.07.2014 9/34
Koordination: Wofür? Zwei Aktivitäten führen den folgenden Code parallel aus. Beide habe Zugriff auf dieselbe globale Variable globalvar. int globalvar = 1; if (globalvar > 0) { globalvar--; } Kann globalvar negativ werden? 12 Kapitel 4.2.1 - Parallelität in Java Michael Hoff 6. Tutorium 01.07.2014 10/34
Antwort: Ja, eine Wettlaufsituation (engl. race condition) kann eintreten. Speicherzugriffe der Aktivitäten werden in irgendeiner Reihenfolge ausgeführt. Die folgende denkbare Ausführungsreihenfolge ist kritisch: Thread 1 Thread 2 // globalvar == 1 if (globalvar > 0) { } globalvar--; if (globalvar > 0) { globalvar--; } 13 Kapitel 4.2.1 - Parallelität in Java Michael Hoff 6. Tutorium 01.07.2014 11/34
Warum Koordination von Threads? Kritischer Abschnitt (engl. critical section) Bereich in dem ein Zugriff auf einen gemeinsam genutzten Zustand stattfindet Wettlaufsituationen (engl. race condition) Gleichzeitiger Zugriff von mindestens zwei Fäden auf eine Speicherstelle. Dabei mindestens 1 Schreibzugriff. Nur eine bestimmte Anzahl Aktivitäten darf einen kritischen Abschnitt zugleich bearbeiten Vor dem Betreten eines kritischen Abschnitts muss sichergestellt sein, dass ihn keine andere Aktivität ausführt Michael Hoff 6. Tutorium 01.07.2014 12/34
Warum Koordination von Threads? Wettlaufsituationen (engl. race condition) Gleichzeitiger Zugriff von mindestens zwei Fäden auf eine Speicherstelle. Dabei mindestens 1 Schreibzugriff. Nur eine bestimmte Anzahl Aktivitäten darf einen kritischen Abschnitt zugleich bearbeiten Vor dem Betreten eines kritischen Abschnitts muss sichergestellt sein, dass ihn keine andere Aktivität ausführt Koordinationsmechanismen Wechselseitiger Ausschluss (engl. mutual exclusion) mittels Monitoren/Locks Warten auf Ereignisse und Benachrichtigung Unterbrechungen Michael Hoff 6. Tutorium 01.07.2014 12/34
Synchronisation in Java (unvollständig!) Schlüsselwort synchronized Anwendbar auf Objekte und komplette Methoden ( implizites Lock von this) Erlaubt nur Änderungen eines Threads an synchronisiertem Objekt Andere Threads müssen ununterbrechbar warten bis der ausführende Thread die synchronisierte Umgebung verlässt Signalisierung x.wait() - Lässt aufrufenden Thread auf Signal von x warten x.notify() - Weckt einen der Threads, die auf x warten x.notifyall() - Weckt alle Threads, die auf x warten Unterbrechung t.interrupt() - Unterbricht das Warten des Threads t Michael Hoff 6. Tutorium 01.07.2014 13/34
Verklemmungen (2) Ich will schreiben Geben Sie mir den Stift! Geben Sie mir das Papier! 44 Kapitel 4.2.1 - Parallelität in Java
Verklemmung Verklemmung, Blockade (engl. deadlock, deadly embrace) Blockade, die durch eine zyklische Abhängigkeit hervorgerufen wird Führt dazu, dass alle beteiligten Threads im Wartezustand verharren Mantra: Monitore in gleicher Reihenfolge anfordern und abgeben! Michael Hoff 6. Tutorium 01.07.2014 15/34
java.util.concurrent Weitere Möglichkeiten zur Thread-Erzeugung, z.b. Callable<E>, ThreadPoolExecutor Atomare Datentypen, z.b. AtomicInteger, AtomicReference<E> Thread-sichere Datenstrukturen, z.b. CopyOnWriteArrayList Weitere Konstrukte enthalten für Koordination, z.b. Semaphore Michael Hoff 6. Tutorium 01.07.2014 16/34
Kontrollflussorientierte (KFO) Testverfahren
Hilfsmittel Grundblock (engl. basic block) Ein Grundblock bezeichnet eine maximal lange Folge fortlaufender Anweisungen, in die der Kontrollfluss nur am Anfang eintritt und die außer am Ende keine Sprungbefehle enthält. Grundblock wird also stets komplett oder gar nicht ausgeführt Michael Hoff 6. Tutorium 01.07.2014 18/34
Hilfsmittel Grundblock (engl. basic block) Ein Grundblock bezeichnet eine maximal lange Folge fortlaufender Anweisungen, in die der Kontrollfluss nur am Anfang eintritt und die außer am Ende keine Sprungbefehle enthält. Grundblock wird also stets komplett oder gar nicht ausgeführt Strukturerhaltende Zwischensprache Eine strukturerhaltende Zwischensprache ersetzt alle Befehle, die die Ausführungsreihenfolge beeinflussen durch (bedingte) Sprünge, übernimmt alle anderen Befehle unverändert und führt keine Optimierungen durch. Michael Hoff 6. Tutorium 01.07.2014 18/34
Kontrollflussgraph Kontrollflussgraph erstellen 1 Quelltext in strukturerhaltende Zwischensprache transformieren (optional) 2 Grundblöcke identifizieren (= Knoten) 3 Grundblöcke durch passende Übergänge verbinden (= gerichtete Kanten) 4 Wenn nötig, speziellen Block n start und n end hinzufügen Michael Hoff 6. Tutorium 01.07.2014 19/34
Aufgabe: Kontrollflussgraph erstellen private char[] kompaktifizieren(char[] werte) { boolean[] istzeichen = new boolean[werte.length]; int[] praesum = new int[werte.length]; for (int i = 0; i < werte.length; i++) { if (!Character.isWhitespace(werte[i])) { istzeichen[i] = true; praesum[i] = 1; } if (i > 0) { praesum[i] += praesum[i - 1]; } } char[] ergebnis = new char[praesum[praesum.length - 1]]; for (int i = 0; i < werte.length; i++) { if (istzeichen[i]) { ergebnis[praesum[i] - 1] = werte[i]; } } return ergebnis; } Michael Hoff 6. Tutorium 01.07.2014 20/34
Lösung: Zwischensprache private char[] kompaktifizieren(char[] werte) { boolean[] istzeichen = new boolean[werte.length]; int[] praesum = new int[werte.length]; for (int i = 0; i < werte.length; i++) { if (!Character.isWhitespace(werte[i])) { istzeichen[i] = true; praesum[i] = 1; } if (i > 0) { praesum[i] += praesum[i - 1]; } } char[] ergebnis = new char[praesum[praesum.length - 1]]; for (int i = 0; i < werte.length; i++) { if (istzeichen[i]) { ergebnis[praesum[i] - 1] = werte[i]; } } return ergebnis; } 000: private char[] kompaktifizieren(char[] werte) 010: boolean[] istzeichen = new boolean[werte.length]; 020: int[] praesum = new int[werte.length]; 030: int i = 0; 040: if not (i < werte.length) goto 120; 050: if not (!Character.isWhitespace(werte[i])) goto 080; 060: istzeichen[i] = true; 070: praesum[i] = 1; 080: if not (i > 0) goto 100; 090: praesum[i] += praesum[i - 1]; 100: i++; 110: goto 040; 120: char[] ergebnis = new char[praesum[praesum.length - 1]]; 130: i = 0; 140: if not (i < werte.length) goto 190; 150: if not (istzeichen[i]) goto 170; 160: ergebnis[praesum[i] - 1] = werte[i]; 170: i++; 180: goto 140; 190: return ergebnis; Michael Hoff 6. Tutorium 01.07.2014 21/34
Lösung: Grundblöcke 000: private char[] kompaktifizieren(char[] werte) 010: boolean[] istzeichen = new boolean[werte.length]; 020: int[] praesum = new int[werte.length]; 030: int i = 0; 040: if not (i < werte.length) goto 120; 050: if not (!Character.isWhitespace(werte[i])) goto 080; 060: istzeichen[i] = true; 070: praesum[i] = 1; 080: if not (i > 0) goto 100; 090: praesum[i] += praesum[i - 1]; 100: i++; 110: goto 040; 120: char[] ergebnis = new char[praesum[praesum.length - 1]]; 130: i = 0; 140: if not (i < werte.length) goto 190; 150: if not (istzeichen[i]) goto 170; 160: ergebnis[praesum[i] - 1] = werte[i]; 170: i++; 180: goto 140; 190: return ergebnis;
Lösung: Kontrollflussgraph 000: private char[] kompaktifizieren(char[] werte) 010: boolean[] istzeichen = new boolean[werte.length]; 020: int[] praesum = new int[werte.length]; 030: int i = 0; 040: if not (i < werte.length) goto 120; 050: if not (!Character.isWhitespace(werte[i])) goto 080; 060: istzeichen[i] = true; 070: praesum[i] = 1; 080: if not (i > 0) goto 100; 090: praesum[i] += praesum[i - 1]; 100: i++; 110: goto 040; 120: char[] ergebnis = new char[/*...*/]; 130: i = 0; 140: if not (i < werte.length) goto 190; 150: if not (istzeichen[i]) goto 170; 160: ergebnis[praesum[i] - 1] = werte[i]; 170: i++; 180: goto 140; 190: return ergebnis; n start n 1 boolean[] istzeichen = new boolean[werte.length]; int[] praesum = new int[werte.length]; int i = 0; n stopp Eingabe: char[] werte n 2 if(i < werte.length) F T n 3 if(!character.iswhitespace(werte[i])) F T n 4 istzeichen[i] = true; praesum[i] = 1; n 5 if(i > 0) F T n 7 n 6 i++; n 8 char[] ergebnis = new char[/* */]; i = 0; n 9 if (i < werte.length) F T n 10 if (istzeichen[i]) F T i++; n 12 praesum[i] += praesum[i - 1]; ergebnis[praesum[i] - 1] = werte[i]; n 11 return ergebnis Klausur Softwaretechnik 1 Sommersemester 2011 Seite 7 von 11
Überdeckungstests (1) Anweisungsüberdeckung (engl. statement coverage) Die Anweisungsüberdeckung verlangt die Ausführung aller Grundblöcke eines Programms. Alle Knoten im Kontrollflussgraphen min. einmal durchlaufen Michael Hoff 6. Tutorium 01.07.2014 24/34
Überdeckungstests (1) Anweisungsüberdeckung (engl. statement coverage) Die Anweisungsüberdeckung verlangt die Ausführung aller Grundblöcke eines Programms. Alle Knoten im Kontrollflussgraphen min. einmal durchlaufen Zweigüberdeckung (engl. branch covergage) Die Zweigüberdeckung verlangt das Traversieren aller Zweige im Programm. Alle Kanten im Kontrollflussgraphen min. einmal durchlaufen Michael Hoff 6. Tutorium 01.07.2014 24/34
Überdeckungstests (1) Anweisungsüberdeckung (engl. statement coverage) Die Anweisungsüberdeckung verlangt die Ausführung aller Grundblöcke eines Programms. Alle Knoten im Kontrollflussgraphen min. einmal durchlaufen Zweigüberdeckung (engl. branch covergage) Die Zweigüberdeckung verlangt das Traversieren aller Zweige im Programm. Alle Kanten im Kontrollflussgraphen min. einmal durchlaufen Pfadüberdeckung (engl. path coverage) Die Pfadüberdeckung fordert die Ausführung aller möglichen unterschiedlichen Pfade im Programm. Alle vollständigen Pfade im Kontrollflussgraphen durchlaufen (kritisch!) Michael Hoff 6. Tutorium 01.07.2014 24/34
Überdeckungstests: Aufgabe n start Eingabe: char[] werte n 1 boolean[] istzeichen = new boolean[werte.length]; int[] praesum = new int[werte.length]; int i = 0; Anweisungsüberdeckung: Eingabe = {?} Zweigüberdeckung: Eingabe = {?} n 2 if(i < werte.length) F T n 3 if(!character.iswhitespace(werte[i])) F T n 4 istzeichen[i] = true; praesum[i] = 1; n 5 if(i > 0) F T n 7 n 6 i++; praesum[i] += praesum[i - 1]; n 8 char[] ergebnis = new char[/* */]; i = 0; n 9 if (i < werte.length) F T n 10 if (istzeichen[i]) F T ergebnis[praesum[i] - 1] = werte[i]; n 11 i++; n 12 n stopp return ergebnis
Überdeckungstests: Aufgabe n start Eingabe: char[] werte n 1 boolean[] istzeichen = new boolean[werte.length]; int[] praesum = new int[werte.length]; int i = 0; Anweisungsüberdeckung: Eingabe = { b, } (Beispiel) Zweigüberdeckung: Eingabe = {?} n 2 if(i < werte.length) F T n 3 if(!character.iswhitespace(werte[i])) F T n 4 istzeichen[i] = true; praesum[i] = 1; n 5 if(i > 0) F T n 7 n 6 i++; praesum[i] += praesum[i - 1]; n 8 char[] ergebnis = new char[/* */]; i = 0; n 9 if (i < werte.length) F T n 10 if (istzeichen[i]) F T ergebnis[praesum[i] - 1] = werte[i]; n 11 i++; n 12 n stopp return ergebnis
Überdeckungstests: Aufgabe n start Eingabe: char[] werte n 1 boolean[] istzeichen = new boolean[werte.length]; int[] praesum = new int[werte.length]; int i = 0; Anweisungsüberdeckung: Eingabe = { b, } (Beispiel) Zweigüberdeckung: Eingabe = { b, } (Beispiel) n 2 if(i < werte.length) F T n 3 if(!character.iswhitespace(werte[i])) F T n 4 istzeichen[i] = true; praesum[i] = 1; n 5 if(i > 0) F T n 7 n 6 i++; praesum[i] += praesum[i - 1]; n 8 char[] ergebnis = new char[/* */]; i = 0; n 9 if (i < werte.length) F T n 10 if (istzeichen[i]) F T ergebnis[praesum[i] - 1] = werte[i]; n 11 i++; n 12 n stopp return ergebnis
Überdeckungstests: Aufgabe n start Eingabe: char[] werte n 1 boolean[] istzeichen = new boolean[werte.length]; int[] praesum = new int[werte.length]; int i = 0; Anweisungsüberdeckung: Eingabe = { b, } (Beispiel) Zweigüberdeckung: Eingabe = { b, } (Beispiel) Durchlaufener Pfad:? n 2 if(i < werte.length) F T n 3 if(!character.iswhitespace(werte[i])) F T n 4 istzeichen[i] = true; praesum[i] = 1; n 5 if(i > 0) F T n 7 n 6 i++; praesum[i] += praesum[i - 1]; n 8 char[] ergebnis = new char[/* */]; i = 0; n 9 if (i < werte.length) F T n 10 if (istzeichen[i]) F T ergebnis[praesum[i] - 1] = werte[i]; n 11 i++; n 12 n stopp return ergebnis
Überdeckungstests: Aufgabe n start Eingabe: char[] werte Anweisungsüberdeckung: Eingabe = { b, } (Beispiel) Zweigüberdeckung: Eingabe = { b, } (Beispiel) Durchlaufener Pfad: n start, n 1, n 2, n 3, n 4, n 5, n 7, n 2, n 3, n 5, n 6, n 7, n 2, n 8, n 9, n 10, n 11, n 12, n 9, n 10, n 12, n stopp n 1 boolean[] istzeichen = new boolean[werte.length]; int[] praesum = new int[werte.length]; int i = 0; n 2 if(i < werte.length) F T n 3 if(!character.iswhitespace(werte[i])) F T n 4 istzeichen[i] = true; praesum[i] = 1; n 5 if(i > 0) F T n 7 n 6 i++; praesum[i] += praesum[i - 1]; n 8 char[] ergebnis = new char[/* */]; i = 0; n 9 if (i < werte.length) F T n 10 if (istzeichen[i]) F T ergebnis[praesum[i] - 1] = werte[i]; n 11 i++; n 12 n stopp return ergebnis
Überdeckungstests (3) Einfache Bedingungsüberdeckung Die einfache Bedingsüberdeckung fordert, dass jede atomare Bedingung einmal zu true und einmal zu false ausgewertet wird. Michael Hoff 6. Tutorium 01.07.2014 26/34
Überdeckungstests (3) Einfache Bedingungsüberdeckung Die einfache Bedingsüberdeckung fordert, dass jede atomare Bedingung einmal zu true und einmal zu false ausgewertet wird. Mehrfache Bedingungsüberdeckung Die mehrfache Bedingungsüberdeckung fordert, dass die atomaren Bedingungen mit allen möglichen Kombinationen der beiden Wahrheitswerte belegt werden. Bei n atomaren Bedingungen: 2 n Tests erforderlich Michael Hoff 6. Tutorium 01.07.2014 26/34
Überdeckungstests (4) Minimal-mehrfache Bedingungsüberdeckung Die minimal-mehrfache Bedingungsüberdeckung fordert, dass jede Bedingung jeweils mit beiden Wahrheitswerten belegt werden muss. Enthält die Zweigüberdeckung Michael Hoff 6. Tutorium 01.07.2014 27/34
Überdeckungstests (4) Beispiel: Menge von Eingaben für die einfache/mehrfache/minimal-mehrfache BÜ? // A, B und C seien atomare Bedingungen if ((A && B) C) { // aktion 1 } else { // aktion 2 } Michael Hoff 6. Tutorium 01.07.2014 27/34
Überdeckungstests (4) Beispiel: Menge von Eingaben für die einfache/mehrfache/minimal-mehrfache BÜ? // A, B und C seien atomare Bedingungen if ((A && B) C) { // aktion 1 } else { // aktion 2 } E e = {101, 010} Michael Hoff 6. Tutorium 01.07.2014 27/34
Überdeckungstests (4) Beispiel: Menge von Eingaben für die einfache/mehrfache/minimal-mehrfache BÜ? // A, B und C seien atomare Bedingungen if ((A && B) C) { // aktion 1 } else { // aktion 2 } E e = {101, 010}, E m = {000, 001, 010,..., 111}, Michael Hoff 6. Tutorium 01.07.2014 27/34
Überdeckungstests (4) Beispiel: Menge von Eingaben für die einfache/mehrfache/minimal-mehrfache BÜ? // A, B und C seien atomare Bedingungen if ((A && B) C) { // aktion 1 } else { // aktion 2 } E e = {101, 010}, E m = {000, 001, 010,..., 111}, E mm = {111, 000} Michael Hoff 6. Tutorium 01.07.2014 27/34
Subsumieren von Überdeckungen Subsumieren Ein Testverfahren für Kriterium x subsumiert ein Testverfahren für Kriterium y, wenn jede Menge von Pfaden, die Kriterium x erfüllt, auch Kriterium y erfüllt. Michael Hoff 6. Tutorium 01.07.2014 28/34
Subsumieren von Überdeckungen Subsumieren Ein Testverfahren für Kriterium x subsumiert ein Testverfahren für Kriterium y, wenn jede Menge von Pfaden, die Kriterium x erfüllt, auch Kriterium y erfüllt. Aufgabe: Was ist die Subsumierungsreihenfolge der Überdeckungstestverfahren? Michael Hoff 6. Tutorium 01.07.2014 28/34
Subsumieren von Überdeckungen Michael Hoff 6. Tutorium 01.07.2014 29/34
Prüfungsfragen
Prüfungsfragen Moderne Betriebssysteme können einen Deadlock in einem laufenden Programm erkennen und darauf reagieren. Michael Hoff 6. Tutorium 01.07.2014 31/34
Prüfungsfragen Moderne Betriebssysteme können einen Deadlock in einem laufenden Programm erkennen und darauf reagieren. Michael Hoff 6. Tutorium 01.07.2014 31/34
Prüfungsfragen Moderne Betriebssysteme können einen Deadlock in einem laufenden Programm erkennen und darauf reagieren. Dynamische Testverfahren können die Korrektheit des Codes belegen. Michael Hoff 6. Tutorium 01.07.2014 31/34
Prüfungsfragen Moderne Betriebssysteme können einen Deadlock in einem laufenden Programm erkennen und darauf reagieren. Dynamische Testverfahren können die Korrektheit des Codes belegen. Michael Hoff 6. Tutorium 01.07.2014 31/34
Prüfungsfragen Moderne Betriebssysteme können einen Deadlock in einem laufenden Programm erkennen und darauf reagieren. Dynamische Testverfahren können die Korrektheit des Codes belegen. Ein Kontrollfaden (Thread) besitzt in Java stets einen eigenen Keller (Stack) sowie einen eigenen Programmzähler (Program counter). Michael Hoff 6. Tutorium 01.07.2014 31/34
Prüfungsfragen Moderne Betriebssysteme können einen Deadlock in einem laufenden Programm erkennen und darauf reagieren. Dynamische Testverfahren können die Korrektheit des Codes belegen. Ein Kontrollfaden (Thread) besitzt in Java stets einen eigenen Keller (Stack) sowie einen eigenen Programmzähler (Program counter). Michael Hoff 6. Tutorium 01.07.2014 31/34
Prüfungsfragen Moderne Betriebssysteme können einen Deadlock in einem laufenden Programm erkennen und darauf reagieren. Dynamische Testverfahren können die Korrektheit des Codes belegen. Ein Kontrollfaden (Thread) besitzt in Java stets einen eigenen Keller (Stack) sowie einen eigenen Programmzähler (Program counter). Kontrollflussorientierte Tests und datenflussorientierte Tests gehören zu der statischen Analyse von Programmen. Michael Hoff 6. Tutorium 01.07.2014 31/34
Prüfungsfragen Moderne Betriebssysteme können einen Deadlock in einem laufenden Programm erkennen und darauf reagieren. Dynamische Testverfahren können die Korrektheit des Codes belegen. Ein Kontrollfaden (Thread) besitzt in Java stets einen eigenen Keller (Stack) sowie einen eigenen Programmzähler (Program counter). Kontrollflussorientierte Tests und datenflussorientierte Tests gehören zu der statischen Analyse von Programmen. Michael Hoff 6. Tutorium 01.07.2014 31/34
Prüfungsfragen Moderne Betriebssysteme können einen Deadlock in einem laufenden Programm erkennen und darauf reagieren. Dynamische Testverfahren können die Korrektheit des Codes belegen. Ein Kontrollfaden (Thread) besitzt in Java stets einen eigenen Keller (Stack) sowie einen eigenen Programmzähler (Program counter). Kontrollflussorientierte Tests und datenflussorientierte Tests gehören zu der statischen Analyse von Programmen. Durchsichten sind auf Code und Testfälle anwendbar. Michael Hoff 6. Tutorium 01.07.2014 31/34
Prüfungsfragen Moderne Betriebssysteme können einen Deadlock in einem laufenden Programm erkennen und darauf reagieren. Dynamische Testverfahren können die Korrektheit des Codes belegen. Ein Kontrollfaden (Thread) besitzt in Java stets einen eigenen Keller (Stack) sowie einen eigenen Programmzähler (Program counter). Kontrollflussorientierte Tests und datenflussorientierte Tests gehören zu der statischen Analyse von Programmen. Durchsichten sind auf Code und Testfälle anwendbar. Michael Hoff 6. Tutorium 01.07.2014 31/34
Prüfungsfragen Moderne Betriebssysteme können einen Deadlock in einem laufenden Programm erkennen und darauf reagieren. Dynamische Testverfahren können die Korrektheit des Codes belegen. Ein Kontrollfaden (Thread) besitzt in Java stets einen eigenen Keller (Stack) sowie einen eigenen Programmzähler (Program counter). Kontrollflussorientierte Tests und datenflussorientierte Tests gehören zu der statischen Analyse von Programmen. Durchsichten sind auf Code und Testfälle anwendbar. Ein Algorithmus der in 4 Teile aufgeteilt ist, welche parallel abgearbeitet werden können, benötigt 1/4 der Ausführungszeit, die der Algorithmus sequentiell implementiert benötigen würde. Michael Hoff 6. Tutorium 01.07.2014 31/34
Prüfungsfragen Moderne Betriebssysteme können einen Deadlock in einem laufenden Programm erkennen und darauf reagieren. Dynamische Testverfahren können die Korrektheit des Codes belegen. Ein Kontrollfaden (Thread) besitzt in Java stets einen eigenen Keller (Stack) sowie einen eigenen Programmzähler (Program counter). Kontrollflussorientierte Tests und datenflussorientierte Tests gehören zu der statischen Analyse von Programmen. Durchsichten sind auf Code und Testfälle anwendbar. Ein Algorithmus der in 4 Teile aufgeteilt ist, welche parallel abgearbeitet werden können, benötigt 1/4 der Ausführungszeit, die der Algorithmus sequentiell implementiert benötigen würde. Michael Hoff 6. Tutorium 01.07.2014 31/34
Aktuelles Übungsblatt
Fragen?
Ende Michael Hoff 6. Tutorium 01.07.2014 34/34