Scheduling von WITH-loops in SAC

Größe: px
Ab Seite anzeigen:

Download "Scheduling von WITH-loops in SAC"

Transkript

1 Scheduling von WITH-loops in SAC Studienarbeit Borg Enders Lehrstuhl für Rechnerorganisation am Institut für Informatik und Praktische Mathematik der Christian-Albrechts-Universität zu Kiel Juli 2001

2 Inhaltsverzeichnis 1 Einleitung 4 2 Scheduling Verfahren Einführung Block Scheduling Cyclic Scheduling Self Scheduling Factoring Scheduling Affinity Scheduling WITH-loops in SAC WITH-loops Verteilter Code für WITH-loops taskselectors und taskschedulers tasks Einteilung der tasks Der Taskselector Even Der Taskselector Factoring Verwaltung der tasks Static Taskscheduler Self Taskscheduler Affinity Taskscheduler Implementation Einführung Einteilung der tasks Der Taskselector Even Der Taskselector Factoring Verwaltung der tasks Grenzen initialisieren Static Taskscheduler Self Taskscheduler Affinity Taskscheduler Bestimmung der nächsten task beim Affinity Taskscheduler

3 6 Laufzeitverhalten Einführung Relaxation Relaxation ohne zusätzliche Rechenlast Relaxation mit zusätzlicher Rechenlast Das Beispiel unbalanced unbalanced ohne zusätzliche Rechenlast unbalanced mit zusätzlicher Rechenlast unbalanced auf einer 24 Prozessormaschine Zusammenfassung 46 3

4 1 Einleitung In dieser Arbeit geht es um die verteilte Ausführung von SAC-Programmen. Single Assignment C ist eine strikte, rein funktionale Programmiersprache erster Ordnung, die unter besonderer Berücksichtigung der Bedürfnisse numerischer Anwendungen entworfen wurde. Hierzu bietet SAC die Möglichkeit Array-Operationen auf einem hohen Abstraktionsniveau zu definieren, einschließlich dimensions-invarianter Programmspezifikationen. Da SAC eine funktionale Sprache ist, sind SAC-Programme seiteneffektfrei und erfüllen die Church-Rosser-Eigenschaft, das heißt, die Bedeutung des Programms ist unabhängig von der Berechnungsreihenfolge. Eine detaillierte Einführung in SAC gibt es in [1]. Für diese Arbeit sind besonders die in SAC vorhandenen WITH-loops interessant. Eine WITH-loop ermöglicht es Operationen auf Bereiche eines Arrays anzuwenden. Dabei berechnet sie aus gegebenen Arrays als Rückgabewert entweder ein neues Array oder einen einzelnen Wert, wobei die Elemente des Arrays unabhängig von einander berechnet werden. Da in einer WITHloop keine Berechnungsreihenfolge der Elemente garantiert ist, ist es einfach WITH-loops verteilt auszuführen. Bei dieser Verteilung werden in der Regel einzelne Bereiche der Berechnung auf Arrays auf die vorhandenen Prozessoren aufgeteilt. Der Code einer WITH-loop gibt dabei an, welche Berechnungen auf diesem Bereich durchgeführt werden, so daß für die Verteilung nur noch die Bereichsgrenzen angegeben werden müssen. Die Prozessoren berechnen dann bestimmte Bereiche eines Arrays mit Hilfe des Codes der WITH-loop. Hierfür verwendet SAC POSIX threads und shared memory Architekturen. Näheres zur verteilten Berechnung von WITH-loops ist in [2] und [3] zu finden. Für die Zuweisung der Bereiche einer WITH-loop an die einzelnen threads ist ein scheduling verantwortlich. Ein scheduling nimmt dabei die Einteilung der zu berechnenden WITH-loop in Teilbereiche vor und verteilt diese dann im Laufe der Berechnung an die einzelnen threads. Der einfachste Ansatz hierfür ist es genauso viele Teilbereiche gleicher Größe des Arrays wie threads zu erzeugen. Dieses ist ein guter Ansatz, solange alle Teilbereiche den gleichen Berechungsaufwand haben. Sobald dieser Berechnungsaufwand aber unterschiedlich ist, führt diese Aufteilung zu einer ineffizienten Berechnung der WITH-loop. Ein weiterer Grund, wieso es zu einer ineffizienten Berechnung der WITH-loop kommen kann, ist, daß nicht gewährleitet sein muß, daß alle threads die gleiche Rechenleistung zur Verfügung haben. Die Unterschiede in der zur Verfügung stehend Rechenleistung kommen daher, daß nicht garantiert ist, daß ein thread einen Prozessor alleine 4

5 nutzen kann. Insbesondere kann das Betriebssystem Rechenzeit des durch den thread genutzten Prozessors anderen Prozessen zuweisen. Dieses kann dazu führen, daß threads zur Berechnung von Bereichen mit gleichem Berechnungsaufwand unterschiedlich lange brauchen. Es gibt insgesamt zwei Ansätze zur Verteilung von Teilberechnungen an threads: statische Verteilung dynamische Verteilung Bei der statischen Verteilung ist jedem thread schon vor dem Start der Berechnung bekannt, welche Teilberechnungen durch ihn berechnet werden sollen. Bei diesem Verfahren hat das scheduling aber zur Laufzeit keine Möglichkeiten ein Ungleichgewicht in der Berechnungsdauer der einzelnen Teilberechnungen festzustellen oder gar auszugleichen. Dies ermöglicht ein zweiter Ansatz bei dem die Teilberechnungen erst zur Laufzeit dynamisch an die einzelnen threads verteilt werden, um eine möglichst gleichmäßige Auslastung aller threads zu erreichen. Eine Möglichkeit eine WITH-loop an threads zu verteilen, wäre jedes Element einzeln an die vorhandenen threads zu vergeben. Dieses kann aber insbesondere bei dynamischen Verfahren zu Mehraufwand durch Kommunikation führen, da das scheduling zur Laufzeit synchronisieren muß, welche Elemente durch welchen thread berechnet werden sollen. Deswegen ist es sinnvoller größere Bereiche von Elementen zu einer sogenannten task zusammenzufassen und dann diese tasks an die threads zu verteilen. Hierfür läßt sich ein scheduling in zwei Teile unterteilen: den taskselector, der eine WITH-loop in tasks einteilt, und einen taskscheduler, der diese tasks an die einzelnen threads verteilt. Durch diese Aufteilung lassen sich verschiedene Einteilungsverfahren mit verschiedenen Verteilungsalgorithmen kombinieren. Dieses erleichtert die Implementation von Varianten von schedulings, da auf bestehende taskselectors und taskschedulers zurückgegriffen werden kann. So kann zum Beispiel für ein bestimmtes Problem ein taskselector speziell optimiert und je nach Gegebenheit mit statischen oder dynamischen Verteilungsverfahren kombiniert werden. In dieser Arbeit wird erklärt wie eine Aufteilung von schedulings in taskselectors und taskschedulers erreicht werden kann. Die vorliegende Arbeit gliedert sich wie folgt: Im zweitem Kapitel werden verschiedene schedulings im Detail vorgestellt. Danach wird im dritten Kapitel eine kurze Einführung in WITH-loops und verteilte Codeerzeugung für WITH-loops in SAC gegeben. Im vierten wird dann die Aufteilung eines schedulings in einen taskselector und einen taskscheduler erläutert. Die Implementationen der taskselectors 5

6 und taskschedulers werden im fünften Kapitel vorgestellt. Im sechsten Kapitel werden dann Laufzeitergebnisse der einzelnen Algorithmen vor- und einander gegenübergestellt und schließlich werden im siebten Kapitel kurz noch mal die Ergebnisse dieser Arbeit zusammengefasst. 6

7 2 Scheduling Verfahren 2.1 Einführung Die hier vorgestellten scheduling Algorithmen verteilen einen Iterationsraum an mehrere threads. Hierbei werden statische und dynamische Verfahren verwendet um Iterationen auf die vorhandenen threads zu verteilen. Statische Verfahren weisen vor der Berechnung den threads Iterationen zu und vermeiden so zur Laufzeit Overhead bei der Berechnung, wie zum Beispiel Kommunikation zwischen einzelnen threads. Dynamische Verfahren hingegen führen erst zur Laufzeit eine Verteilung der Iterationen an die threads durch. Hierdurch ist es möglich gegebenenfalls auftretende Unterschiede in der Berechnungsdauer von den threads zugewiesenen Iterationen auszugleichen. Hierfür muß das scheduling aber zur Laufzeit abgleichen, welche Iterationen durch welchen thread berechnet werden. Dieses führt zu einem Kommunikationsmehraufwand zwischen den threads. In diesem Kapitel werden die einzelnen schedulings außer dem Factoring Scheduling anhand eines einfachen abstrakten Beispiels erläutert. Dieses Beispiel besteht aus bis zu neun Teilberechnungen für die jeweils eine bestimmte Berechnungsdauer vorgegeben ist. Hierbei unterteilen alle schedulings die Berechnung in Teilbereiche mit gleich vielen Iterationen. Die Berechnungsdauer der einzelnen Teilberechnungen wird nur zur Verdeutlichung des Ablaufes der einzelnen schedulings verwendet und läßt keine Schlüsse auf die Effizienz der hier vorgestellten Algorithmen zu. 2.2 Block Scheduling Das Block Scheduling [4] führt eine statische Verteilung der Iterationen durch. Dabei teilt es den Iterationsraum in Anzahl der threads Blöcke mit ungefähr gleich vielen aufeinander folgenden Iterationen ein. Das Problem wird dann auf die threads verteilt, indem jedem thread genau ein Block zugewiesen wird. Abbildung 1 zeigt eine verteilte Berechnung für ein Problem mit 3 Blöcken und 3 threads. Die Zahlen in den Kästen der Blöcke geben den benötigten Zeitaufwand eines threads für diesen Block an. Das rechte Diagramm zeigt in welcher Reihenfolge thread 1 (t1), thread 2 (t2) und thread 3 (t3) die Blöcke auf ihren jeweiligen Prozessoren berechnen. Die Nummern neben den Pfeilen geben dabei die Nummern der einzelnen Blöcke an und die Länge entspricht dem Berechnungsaufwand. Insgesamt benötigt das Block Scheduling eine Zeitaufwand von 12 Zeiteinheiten zur Berechnung des abstrakten Problems. Dieser Zeitaufwand ergibt 7

8 Abbildung 1: Block Scheduling für ein abstraktes Beispiel sich aus der Berechnungsdauer des 1. thread, der am längsten bis zum Ende seiner Berechnung braucht. Wie hier gut zu sehen ist, hat der thread 2 bei dieser Verteilung eine lange Wartezeit, da der Berechnungsaufwand der Blöcke 1 und 2 sich um den Faktor zwei unterscheidet. 2.3 Cyclic Scheduling Eine Möglichkeit, Berechnungsaufwand, der irgendwie proportional zum Wert der Indexposition der Berechnung ist, auszugleichen, ist das Problem in mehr Teilbereiche von Iterationen als threads einzuteilen und diese dann statisch an die threads zu verteilen. Dieses Verfahren verwendet das Cyclic Scheduling [4], wobei die Anzahl der Iterationen in den einzelnen Teilbereichen gleich eins ist. Ein leicht abgewandeltes Verfahren, das Block-Cyclic Scheduling, verwendet Teilbereiche gleicher Größe mit mehr als einer Iteration. Jeder thread arbeitet beim Cyclic Scheduling periodisch die Teilbereiche der Iterationen ab. Seien die Teilbereiche von 1 bis M AX BEREICHE nummeriert und die threads von 1 bis MAX T HREADS. Dann berechnet der t-te thread die Iterationsbereiche mit den Nummern MAX BEREICHE t t + i MAX T HREADS, für 0 i. MAX T HREADS 8

9 Durch die gleichmäßige, periodische Verteilung der Teilberechnungen über das Problem läßt sich oft ein unterschiedlicher Berechnungsaufwand für die einzelnen threads vermeiden. Dies geschieht dadurch, daß bei einer genügend großen Anzahl von Teilbereichen jeder thread sowohl Teile des Problems mit hohem als auch niedrigem Berechnungsaufwand zugewiesen bekommt. Ein typisches Problem hierfür sind Dreiecksmatrizen. Angenommen eine linke untere n n-dreiecksmatrix wird durch 3 threads berechnet. Dann würde beim Block Scheduling der 1.thread 11%. der 2.thread 33% und der letzte thread 56% der Matrix berechnen. Wenn hingegen das Cyclic Scheduling so eine Matrix in 9 Teilbereiche aus gleich vielen Zeilen unterteilt und diese an 3 threads verteilt, berechnet der 1.thread 26%, der 2.thread 33% und der 3.thread 41% der Matrix. Also ist bei diesem scheduling der Berechnungsaufwand besser verteilt als beim Block Scheduling. Abbildung 2 zeigt das abstrakte Beispiel, das jetzt in 9 Teilbereiche einge- Abbildung 2: Cyclic Scheduling für ein abstraktes Beispiel teilt ist. Die vom Block Scheduling eingeteilten Iterationsbereiche wurden für das abstrakte Problem jeweils noch mal in drei Teilbereiche eingeteilt, um den Ablauf des Cyclic Schedulings besser darzustellen. Insgesamt benötigt das Cyclic Scheduling einen Zeitaufwand von 10 Zeiteinheiten zur Berechnung dieses abstrakten Problems. Dieser Zeitaufwand ergibt sich aus der Berechnungsdauer des 3.threads, der als letzter seine Berechnung beendet und die Teilbereiche 3, 6 und 9 berechnet. Die Summe des 9

10 Zeitaufwandes dieser Bereiche beträgt gerade 10 Zeiteinheiten. 2.4 Self Scheduling Dynamische Verfahren versuchen Ungleichgewichte im Berechnungsaufwand dadurch auszugleichen, daß die Iterationen den threads erst zur Laufzeit zu gewiesen werden. Dies geschieht, da in der Regel kein Vorwissen über den Berechnungsaufwand eines Problems bekannt ist. Allerdings muß das scheduling hierbei zur Laufzeit abgleichen, welcher thread welche Iteration berechnet, was zu einem zusätzlichen Komunnikationsaufwand führt. Das einfachste dieser Verfahren ist das Self Scheduling [5]. Hierbei werden alle noch zu berechnenden Iterationen in einer zentralen Queue verwaltet. Aus dieser Queue holen sich die threads im exklusiven Zugriff dann immer ihre nächsten zu berechnenden Iterationen. Auch bei diesem Verfahren werden Teilbereiche der Iterationen mit möglichst gleicher Anzahl verwendet und den threads zu gewiesen. Das Ziel dieses scheduling ist es einen Ausgleich des Berechnungsaufwandes dadurch zu erreichen, daß immer der thread mit dem bis dahin geringsten Berechnungsaufwand sich die nächsten Iterationen abholt. Um eine effiziente Berechnung des Problems zu erreichen, sind mehr Teilbereiche der Iterationen als threads nötig, da nur hierdurch eine gleichmäßige Verteilung des Berechnungsaufwandes möglich ist. Abbildung 3 zeigt wie Self Scheduling für das abstrakte Beispiel ablaufen kann. Wie hier zu sehen ist, holen sich zuerst alle drei threads einen Teilbereich der Iterationen aus der zentralen Queue. Nach Berechnung ihrer Iterationen holt sich dann jeder thread einen neuen Teilbereich. Dieses führt in diesem Beispiel dazu, daß thread 2 insgesamt 4 Bereiche berechnet und Self Scheduling für dieses Problem einen Zeitaufwand von 12 Zeiteinheiten benötigt, da thread 2 die Teilbereiche 2, 4, 7 und 9 berechnet und damit den größten Zeitaufwand der drei threads hat. Dieses Verfahren hat den Nachteil, daß alle threads auf eine einzige zentrale Queue zugreifen. Dies wird oft noch dadurch verstärkt, daß die einzelnen Teilbereiche gleich groß sind und es somit leicht bei nahezu gleichen Berechnungsaufwand dieser Bereiche dazu kommen kann, daß sich zwei threads beim Zugriff auf die Queue gegenseitig behindern. 10

11 Abbildung 3: Self Scheduling für ein abstraktes Beispiel 2.5 Factoring Scheduling Um den Kommunikationsaufwand des Self Scheduling zu senken, verwendet das scheduling Factoring [6] Teilbereiche unterschiedlicher Grösse. Hierbei nimmt die Grösse der Bereiche mit Anzahl der berechneten Iterationen ab. Dadurch wird erreicht, daß die threads erst einen größeren Teil der Berechnung absolvieren, bevor sie sich wieder neue Iterationen abholen. Hinzu kommt, daß die kleineren Iterationsbereiche am Ende der Berechnung es ermöglichen ein Ungleichgewicht beim Berechnungsaufwand zwischen den einzelnen threads besser auszugleichen, da ein thread mit weniger Berechnungsaufwand sich in kleinen Schritten einem thread mit höherem Berechnungsaufwand anpassen kann. Das scheduling Factoring verwendet dazu genau, wie das Self Scheduling, eine zentrale Queue zur Verwaltung der einzelnen Teilbereiche. Es haben immer Anzahl der threads Teilbereiche die gleiche Größe und die Größe der nächsten Bereiche ist dann: REST IT ERAT IONS + 1, 2 MAX T HREADS wobei REST IT ERAT IONS die noch zu berechnende Größe des Restproblems angibt. Ein Beispiel für die Größen von Iterationsbereichen, bei dem 800 Iterationen 11

12 auf 4 Prozessoren verteilt werden, ist in Abbildung 4 zusehen. 800 Iterationen und 4 Prozessoren Abbildung 4: Bereichsgrößen bei Factoring 2.6 Affinity Scheduling Alle bisher beschriebenen Verfahren gehen davon aus, daß die Berechnung einer bestimmen Iteration für alle threads den gleichen Zeitaufwand auf den verwendeten Prozessoren hat und daß deswegen keine Bevorzugung (Affinität) besteht bestimmte Iterationen einen bestimmten thread zuzuweisen. Allerdings gilt diese Annahme für moderne shared memory Multiprozessorsysteme mit Prozessor eigenen Cache und eventuell nicht gleichmässigen Speicherzugriffszeiten nicht. Ein thread auf einen Prozessor, der einen Großteil der benötigten Daten schon in seinem Cache hat, wird eine Iteration in deutlich geringerer Zeit berechnen, als ein Prozessor, der diese Daten erst noch in seinen Cache laden muß. Deswegen ist die Lokalität von Daten ein entscheidender Faktor zur effizienten Berechnung von Iterationen auf shared memory Architekturen [7, 8, 9]. Ein Ansatz, der dies berücksichtigt, ist das Affinity Scheduling [10]. Genauso wie Self Scheduling verwaltet dieses die zu berechnenden Iterationen dynamisch. Im Gegensatz zu diesem hat hierbei jeder thread eine eigene Queue mit Iterationen, die durch ihn berechnet werden sollen. Dieses vermeidet das sich threads gegenseitig beim exklusiven Zugriff auf eine zentrale Queue behindern, wie dies beim Self Scheduling und beim Factoring Scheduling der Fall sein kann. Anfangs holt sich jeder thread aus seiner eigenen Queue den nächsten Teilbereich an Iterationen ab. Wenn dann die eigene Queue eines threads leer ist, holt sich dieser einen Bereich aus der Queue des threads, der bisher am wenigstens Iterationen seiner Queue abgearbeitet hat. Hierbei ist es sinnvoll, wenn beim Entlasten eines threads die Iterationsbereiche vom Ende der Queue entfernt werden, weil hierdurch eine Lokalität der Daten erreicht wird. Da somit ein thread erst dann Daten eines anderen threads benötigt, wenn er seine eigene Berechnung bereits abgeschlossen hat. Da in der Regel kein Vorwissen über Datenabhängigkeiten in der Berechnung und damit eventuelle Affinitäten der einzelnen threads bei der Berechnung 12

13 vorhanden ist, werden beim Affinity Scheduling die Queues der einzelnen threads mit gleich großen Bereichen an Iterationen vorbelegt. Auch das Affinity Scheduling kann nur dann eine gleichmäßige Verteilung des Berechnungsaufwandes erreichen, wenn es insgesamt mehr Teilbereiche als threads gibt. Abbildung 5 zeigt anhand des abstrakten Problems wie dieses Verfahren Abbildung 5: Affinity Scheduling für ein abstraktes Beispiel arbeitet. Zum erreichen einer Datenaffinität wurde bei diesem Problem eine Blockverteilung der Iterationen auf die Queues vorgenommen. Die Queue von thread 1 besteht bei diesem Beispiel aus den Iterationsbereichen 1, 2 und 3 die von thread 2 aus 4, 5 und 6 und die von thread 3 aus 7, 8 und 9. thread 2 hat als erster seine Queue abgearbeitet und entlastet dann thread 1, der als einziger noch einen unvergebenen Bereich in seiner Queue hat, indem er Teilbereich 3 berechnet. Hierdurch benötigt das Affinity Scheduling einen Zeitaufwand von 10 Zeiteinheiten, da thread 2 als letzter seine Berechnung beendet. 13

14 3 WITH-loops in SAC 3.1 WITH-loops Komplexe Operationen auf Arrays werden in SAC mit Hilfe von WITH-loops realisiert. WITH-loops definieren entweder die shape, d.h. die Größe des Arrays auf den einzelnen Dimensionen, eines neu erzeugten Arrays zusammen mit der Initialisierung der einzelnen Elemente oder eine fold-operation zusammen mit einer Berechnung der Operanden für das fold. Hierbei besteht eine WITH-loop aus zwei Teilen: einem Generator einer Operation res = with(.<iv<.) genarray([4,4],1); res = Abbildung 6: Eine genarray-with-loop, zusammen mit der generierten Matrix Der Generator definiert eine Menge von Indexvektoren zusammen mit einer Indexvariablen (siehe Abbildung 6: Definition von iv), die die Elemente dieser Menge darstellt. Die obere und untere Grenze des Bereiches der Indexvektoren werden definiert durch zwei Ausdrücke, die zu Vektoren mit gleicher Länge ausgewertet werden müssen. Des weiteren gibt es drei verschiedene WITH-loop-Operationen: genarray modarray fold Mit Hilfe von genarray läßt sich ein neues Array angeben, dessen indizierte Elemente mit einem angegeben Ausdruck und die restlichen Elemente mit 0 initialisiert werden (siehe Abbildung 6). 14

15 res = with(.<iv<.) modarray(res,res[iv]+1); res = Abbildung 7: Eine modarray-with-loop, zusammen mit der aus obiger Matrix res berechneten Matrix Modarray erzeugt aus einem existierenden Array ein neues Array, wobei indizierte Elemente durch einen angegeben Ausdruck verändert und die restlichen Elemente kopiert werden (siehe Abbildung 7). Schließlich führt fold die Reduktion eines Arrays durch Anwendung einer Operation startend mit einem neutralen Element auf alle indizierten Elemente des Arrays durch (siehe Abbildung 8). Für aufeinander folgende WITH-loops bietet SAC die Optimierung des result = with(.<iv<.) fold(+,0,res[iv]); result = 8 Abbildung 8: Eine fold-with-loop, zusammen mit dem berechneten Ergebnis der Matrix res WITH-loop-Folding [11, 12]. Hierbei wird versucht mehrere WITH-loops zu einer einzigen WITH-loop zusammen zufassen. Dazu werden WITH-loops der Benutzerebene in SAC interne Multigenerator WITH-loops eingebettet. Diese sind charakterisiert durch eine Sequenz von Generatoren mit paarweise verschiedenen Indexvektormengen. Weiterhin ist jeder Generator mit einer spezifischen Operation verknüpft. Durch die Optimierung des WITH-loop-Folding kann es vorkommen, daß auf unterschiedlichen Bereichen einer WITH-loop Operationen mit unterschiedlichem Berechnungsaufwand auftreten. Dieses kann bei der Verteilung der WITH-loop auf threads zu einem Ungleichgewicht im Berechnungsaufwand der einzelnen threads führen. 15

16 3.2 Verteilter Code für WITH-loops In SAC werden nur WITH-loops verteilt berechnet. Alle anderen Programmteile werden weiterhin sequentiell berechnet. Hierbei eigenen sich besonders Multigenerator WITH-loops gut für eine nicht sequentielle Programm Ausführung, da aufgrund der Church-Rosser-Eigenschaft von SAC alle Elemente der WITH-loop nebenläufig berechnet werden können. Generell gibt es bei der verteilten Ausführung von WITH-loops zwei Codescheduling_begin();... computation of with-loop elements... scheduling_end(); Abbildung 9: Code eines die WITH-loop berechenden threads teile: einen sequentiellen und einen nebenläufigen. Im sequentiellen Teil werden Datenstrukturen für die einzelnen schedulings initialisiert. Im nebenläufigen (siehe Abbildung 9) berechnet ein scheduling mit Hilfe Abbildung 10: Ablaufdiagramm für ein verteiltes SAC-Programm von threads die WITH-loop, wobei das scheduling jedem thread durch set- 16

17 zen der oberen (WL START) und unteren (WL STOP) Grenze einer WITH-loop auf den zu verteilenden Dimensionen, ihre zu berechnenden Bereiche auf der WITH-loop zu weist. Hierdurch verteilt das scheduling die einzelnen in der WITH-loop zu berechnenden Elemente an die threads. Vor jeder WITH-loop gründet der masterthread die benötigten workerthreads (siehe Abbildung 10). Nach der verteilten Ausführung werden dann die threads vor dem sequentiellen Code, der bis zur nächsten WITH-loop ausgeführt wird, terminiert. Hierdurch wird garantiert, daß die letzte WITH-loop komplett berechnet wurde. Dieses Verfahren wurde detailliert in [2] beschrieben. Durch die Terminierung der threads am Ende jeder WITH-loop ist es für ein scheduling für eine effiziente Berechnung entscheidend den Berechnungsaufwand für jede WITH-loop einzeln gleichmässig zuverteilen. 17

18 4 taskselectors und taskschedulers 4.1 tasks Wie in Kapitel 2 erläutert, werden bei der verteilten Berechnung Iterationen an threads verteilt. Zur Vermeidung von Mehraufwand durch Kommunikation zwischen den threads ist es sinnvoll mehrere Iterationen zu einer sogenannten task zusammen zufassen. Dieses gewährleistet eine bessere Granularität des Problems. Da alle schedulings eine Einteilung in tasks vornehmen müssen und dieses auch alle bis auf Factoring in der selben Art vornehmen, ist es sinnvoll die Verteilung einer WITH-loop konkret in zwei Teilprobleme aufzuteilen: Einteilung der tasks Verwaltung der tasks für die threads 4.2 Einteilung der tasks Für die Einteilung einer Berechnung in tasks gibt es viele Möglichkeiten. Hier einige Beispiele: gleich große Blöcke in einer Dimension gleich große Blöcke in mehreren Dimensionen verschieden große Blöcke in einer Dimension verschieden große Blöcke in mehreren Dimensionen Blöcke mit gleichem Berechnungsaufwand, d. h. z. Bsp. Bereiche gleicher Operationen einer Multigenerator WITH-loop Abbildung 11 zeigt grafisch die ersten vier Varianten der obigen Aufzählung. Welche Einteilung gewählt wird, hängt einerseits vom Vorwissen über den Aufwand der Berechnung, andererseits aber auch von dem gewählten scheduling ab, so sollte zum Beispiel für eine effiziente Berechnung beim Cyclic Scheduling (Kapitel 2.3) die Anzahl der tasks ein ganzzahliges Vielfaches der Anzahl der threads sein, sonst hätten einige threads eine task mehr als andere zu berechnen. 18

19 Abbildung 11: verschiedene task Einteilungen Der Taskselector Even Das einfachste Verfahren zur Einteilung von tasks, ist die WITH-loop in möglichst gleich große Blöcke in einer Dimension zu unterteilen. Dieses verwendet der Taskselector Even, der eine WITH-loop in einer beliebigen Dimension in eine vorgegebene Anzahl von tasks einteilen kann. Dabei erzeugt Even immer ein ganzzahliges Vielfaches der Anzahl der threads an tasks, da Cyclic und Affinity Scheduling hiermit in der Regel eine effizientere Berechnung der WITH-loop durchführen können. Wenn Even dies nicht tun würde, wären zum Beispiel beim Affinity Scheduling die lokalen Queues unterschiedlich lang und somit könnte es bei nahezu gleichem Berechnungsaufwand aller tasks dazu kommen, daß ein thread einen anderen mit längerer Queue entlasten müßte. Dieses würde dazu führen, daß sich zwei threads beim exklusiven Zugriff auf eine Queue gegenseitig behindern. Dieses kann aber bei nahezu gleichem Berechnungsaufwand der tasks in der Regel vermieden werden, wenn alle Queues die gleiche Länge haben. Dieser taskselector ist das übliche Verfahren zur Einteilung von tasks, wie es das Block, Cyclic, Self und Affinity Scheduling verwenden. 19

20 4.2.2 Der Taskselector Factoring Der Taskselector Factoring verwendet das Verfahren des scheduling Factoring und unterteilt das durch die WITH-loop berechnete Array in tasks mit abnehmender Größe in einer Dimension. Da Factoring erst zur Laufzeit die Größen der einzelnen tasks bestimmt, ist auch im Gegensatz zu Even nicht vor dem Start der Berechnung der WITHloop bekannt, wie viele tasks insgesamt vorhanden sind. Ein Beispiel für die Größen von tasks ist in Kapitel 2.5 zu sehen. Durch die Aufteilung in taskselectors und taskschedulers ist es möglich Factoring mit fast jedem taskscheduler zu kombinieren. Hierbei teilt Factoring dem jeweiligen taskscheduler mit, ob es noch weitere tasks zur Berechnung gibt, da nur ihm selbst bekannt ist, wann keine unberechneten tasks mehr vorhanden sind. Der einzige taskscheduler mit dem Factoring nicht zusammenarbeiten kann ist der Affinity Taskscheduler, da für diesen zur Einteilung seiner Queues vor dem Start der Berechnung die Anzahl der vorhandenen tasks bekannt sein muß. 4.3 Verwaltung der tasks Static Taskscheduler Der Static Taskscheduler führt eine statische Verwaltung der tasks durch. Im Zusammenspiel mit dem Taskselector Even realisiert der Static Taskscheduler das Block und Cyclic Scheduling. Dies ist nur davon abhängig, wie viele tasks Even erzeugt, wird nur eine task pro thread erzeugt, wird das Block Scheduling realisiert. Gibt es aber mehr tasks als threads, so werden die tasks durch den Static Taskscheduler in zyklischer Ordnung an die threads verteilt und es wird dann das Cyclic Scheduling realisiert. Es ist aber auch möglich diesen taskscheduler mit dem Taskselector Factoring zusammen einzusetzen. Hierbei werden dann die tasks mit abnehmender Größe in zyklischer Ordnung an die threads verteilt, bis Factoring dem taskscheduler mitteilt, das keine tasks mehr vorhanden sind Self Taskscheduler Der Self Taskscheduler verwendet eine einzige zentrale Queue zur Verwaltung der noch nicht berechneten tasks. Aus dieser Queue holen sich die threads dann zur Laufzeit immer ihre nächste zu berechnende tasks. Generell geschieht dies immer dynamisch, d. h. ein thread holt sich die nächste task vom Anfang der Queue. Da der Zugriff auf eine zentrale Queue 20

21 für die threads exklusiv sein muß, kann dies besonders am Anfang der Berechnung einer WITH-loop zu einem großen Overhead führen. Dann kann es dazu kommen, daß alle threads zeitlich dicht aufeinanderfolgend auf die Queue zugreifen, um sich ihre erste task abzuholen, und können sich deswegen leicht Gegenseitig behindern. Um dies zu verhindern, bietet der Self Taskscheduler die Möglichkeit die erste task jedem thread statisch zuzuweisen. Wenn der Self Taskscheduler zusammen mit dem Taskselector Even verwendet wird, entspricht dies dem Self Scheduling. Denn hierbei haben alle tasks in der Queue durch die Einteilung von Even dieselbe Größe. Wird allerdings der Taskselector Factoring verwendet, haben die tasks in der Queue durch ihn eine abnehmende Größe und es wird das scheduling Factoring realisiert Affinity Taskscheduler Der Affinity Taskscheduler verwendet lokale Queues für jeden thread. In dieser Queue werden alle tasks vorgehalten die durch diesen thread berechnet werden sollen. Zuerst arbeitet bei diesem Verfahren jeder thread seine eigene Queue ab. Ist er mit dieser fertig, entlastet er den thread in dessen Queue die meisten noch nicht berechneten tasks sind, indem er vom Ende dieser Queue eine task entfernt und diese selber berechnet. Zur Verteilung der tasks auf die Queues der einzelnen threads, muß der Affinity Taskscheduler vor dem Start der Berechnung wissen, welche tasks, insbesondere wie viele vorhanden sind, damit die Queues möglichst gleich lang sind. Deswegen ist der Affinity Taskscheduler als einziger nur in Kombination mit dem Taskselector Even einsetzbar, da bei diesem bekannt ist, wie viele tasks zur Berechnung der WITH-loop vorhanden sind. 21

Prozesse und Scheduling

Prozesse und Scheduling Betriebssysteme für Wirtschaftsinformatiker SS04 KLAUSUR Vorbereitung mit Lösungen / Blatt 1 Prozesse und Scheduling Aufgabe 1 : Scheduling Gegeben seien die folgenden Prozesse und die Längen des jeweiligen

Mehr

Approximationsalgorithmen

Approximationsalgorithmen Ausarbeitung zum Thema Approximationsalgorithmen im Rahmen des Fachseminars 24. Juli 2009 Robert Bahmann robert.bahmann@gmail.com FH Wiesbaden Erstellt von: Robert Bahmann Zuletzt berarbeitet von: Robert

Mehr

B1 Stapelspeicher (stack)

B1 Stapelspeicher (stack) B1 Stapelspeicher (stack) Arbeitsweise des LIFO-Stapelspeichers Im Kapitel "Unterprogramme" wurde schon erwähnt, dass Unterprogramme einen so genannten Stapelspeicher (Kellerspeicher, Stapel, stack) benötigen

Mehr

Prozeß P1 Prozeß P2. Zur Synchronisation stehen den beiden Prozessen binäre Semaphore und die beiden Funktionen

Prozeß P1 Prozeß P2. Zur Synchronisation stehen den beiden Prozessen binäre Semaphore und die beiden Funktionen Seite 8 A UFGABE 11 INTERP ROZEßKOMMUNIKATION Das folgende Petrinetz zeigt zwei verkoppelte Prozesse P1 und P2. Die Transitionen a und b beschreiben Aktionen von P1, die Transitionen c und d Aktionen von

Mehr

Betriebssystembau (BSB)

Betriebssystembau (BSB) Betriebssystembau (BSB) 6. Übung http://ess.cs.tu-.de/de/teaching/ws2013/bsb/ Olaf Spinczyk olaf.spinczyk@tu-.de http://ess.cs.tu-.de/~os AG Eingebettete System Informatik 12, TU Dortmund Agenda Vorstellung

Mehr

Übungspaket 19 Programmieren eigener Funktionen

Übungspaket 19 Programmieren eigener Funktionen Übungspaket 19 Programmieren eigener Funktionen Übungsziele: Skript: 1. Implementierung und Kodierung eigener Funktionen 2. Rekapitulation des Stack-Frames 3. Parameterübergabe mittels Stack und Stack-Frame

Mehr

Welche der folgenden Aussagen gelten? a) Im allgemeinen gilt: ein Deadlock tritt auf gdw. der Resource-Allocation Graph einen Zykel

Welche der folgenden Aussagen gelten? a) Im allgemeinen gilt: ein Deadlock tritt auf gdw. der Resource-Allocation Graph einen Zykel Aufgabe 1 (5 Punkte) (Multiple Choice) Beantworten Sie folgende Fragen durch Ankreuzen der richtigen Antwort. Für jede falsche Antwort wird ein Punkt abgezogen (es werden minimal 0 Punkte vergeben). Welche

Mehr

Der Aufruf von DM_in_Euro 1.40 sollte die Ausgabe 1.40 DM = 0.51129 Euro ergeben.

Der Aufruf von DM_in_Euro 1.40 sollte die Ausgabe 1.40 DM = 0.51129 Euro ergeben. Aufgabe 1.30 : Schreibe ein Programm DM_in_Euro.java zur Umrechnung eines DM-Betrags in Euro unter Verwendung einer Konstanten für den Umrechnungsfaktor. Das Programm soll den DM-Betrag als Parameter verarbeiten.

Mehr

Programmiertechnik II

Programmiertechnik II Analyse von Algorithmen Algorithmenentwurf Algorithmen sind oft Teil einer größeren Anwendung operieren auf Daten der Anwendung, sollen aber unabhängig von konkreten Typen sein Darstellung der Algorithmen

Mehr

Technische Informatik II

Technische Informatik II Institut für Technische Informatik und Kommunikationsnetze Technische Informatik II Übung 1: Prozesse und Threads Aufgabe 1: Prozesse und Threads a) Wie verhält sich eine Applikation die aus mehreren Prozessen

Mehr

Programmieren in C. Operatoren, Variablen und deren Sichtbarkeit. Prof. Dr. Nikolaus Wulff

Programmieren in C. Operatoren, Variablen und deren Sichtbarkeit. Prof. Dr. Nikolaus Wulff Programmieren in C Operatoren, Variablen und deren Sichtbarkeit Prof. Dr. Nikolaus Wulff Auswertung von Ausdrücken Was passiert wenn ein Ausdruck wie z. B. int y,x=2; y = ++x * x++; im Computer abgearbeitet

Mehr

Einführung in die Informatik I

Einführung in die Informatik I Einführung in die Informatik I Algorithmen und deren Programmierung Prof. Dr. Nikolaus Wulff Definition Algorithmus Ein Algorithmus ist eine präzise formulierte Handlungsanweisung zur Lösung einer gleichartigen

Mehr

Ausarbeitung im Rahmen der PG Autolab zum Thema: OSEK 1 -OS. geschrieben von Oliver Botschkowski

Ausarbeitung im Rahmen der PG Autolab zum Thema: OSEK 1 -OS. geschrieben von Oliver Botschkowski Ausarbeitung im Rahmen der PG Autolab zum Thema: OSEK 1 -OS geschrieben von Oliver Botschkowski 1 Offene Systeme und deren Schnittstelle für die Elektronik im Kraftfahrzeug 1 Oliver Botschkowski - OSEK-OS

Mehr

Erwin Grüner 15.12.2005

Erwin Grüner 15.12.2005 FB Psychologie Uni Marburg 15.12.2005 Themenübersicht Mit Hilfe der Funktionen runif(), rnorm() usw. kann man (Pseudo-) erzeugen. Darüber hinaus gibt es in R noch zwei weitere interessante Zufallsfunktionen:

Mehr

Einführung in die Java- Programmierung

Einführung in die Java- Programmierung Einführung in die Java- Programmierung Dr. Volker Riediger Tassilo Horn riediger horn@uni-koblenz.de WiSe 2012/13 1 Wichtig... Mittags Pommes... Praktikum A 230 C 207 (Madeleine) F 112 F 113 (Kevin) E

Mehr

Dynamic Ressource Management

Dynamic Ressource Management best Open Systems Day Fall 2006 Dynamic Ressource Management Unterföhring Marco Kühn best Systeme GmbH kuehn@best.de Agenda Überblick Dynamic Resource Pools und FSS Dynamic Resource Memory RCAP Oracle

Mehr

2: Zahlentheorie / Restklassen 2.1: Modulare Arithmetik

2: Zahlentheorie / Restklassen 2.1: Modulare Arithmetik Stefan Lucks Diskrete Strukturen (WS 2009/10) 57 2: Zahlentheorie / Restklassen 2.1: Modulare Arithmetik Uhr: Stunden mod 24, Minuten mod 60, Sekunden mod 60,... Rechnerarithmetik: mod 2 w, w {8, 16, 32,

Mehr

Anleitung für zwei C++ - Openmp - Beispiele auf der NWZSuperdome

Anleitung für zwei C++ - Openmp - Beispiele auf der NWZSuperdome Anleitung für zwei C++ - Openmp - Beispiele auf der NWZSuperdome (Timo Heinrich, t_hein03@uni-muenster.de) Inhaltsverzeichnis: 0.Einleitung 1.Teil: Helloworldprogramm 1.1 Quellcode: Helloworld.cpp 1.2

Mehr

Übersicht. Informatik 2 Teil 3 Anwendungsbeispiel für objektorientierte Programmierung

Übersicht. Informatik 2 Teil 3 Anwendungsbeispiel für objektorientierte Programmierung Übersicht 3.1 Modell Konto 3.2 Modell Konto - Erläuterungen 3.3 Benutzer Ein- und Ausgabe mit Dialogfenster I 3.4 Benutzer Ein- und Ausgabe mit Dialogfenster II 3.5 Klassen- und Objekteigenschaften des

Mehr

Tutorium Java Ein Überblick. Helge Janicke

Tutorium Java Ein Überblick. Helge Janicke Tutorium Java Ein Überblick Helge Janicke 26. Oktober 2000 1 VORRAUSSETZUNGEN ZUM PROGRAMMIEREN MIT JAVA. 1 1 Vorraussetzungen zum Programmieren mit Java. Was braucht man, wenn man mit Java programmieren

Mehr

Dämon-Prozesse ( deamon )

Dämon-Prozesse ( deamon ) Prozesse unter UNIX - Prozessarten Interaktive Prozesse Shell-Prozesse arbeiten mit stdin ( Tastatur ) und stdout ( Bildschirm ) Dämon-Prozesse ( deamon ) arbeiten im Hintergrund ohne stdin und stdout

Mehr

Binäre lineare Optimierung mit K*BMDs p.1/42

Binäre lineare Optimierung mit K*BMDs p.1/42 Binäre lineare Optimierung mit K*BMDs Ralf Wimmer wimmer@informatik.uni-freiburg.de Institut für Informatik Albert-Ludwigs-Universität Freiburg Binäre lineare Optimierung mit K*BMDs p.1/42 Grundlagen Binäre

Mehr

Objektorientierte Programmierung. Objektorientierte Programmierung. Klasse. Objekt. Beispiel: Sportfest1. Methode. Eine Einführung mit BlueJ

Objektorientierte Programmierung. Objektorientierte Programmierung. Klasse. Objekt. Beispiel: Sportfest1. Methode. Eine Einführung mit BlueJ Objektorientierte Programmierung Objektorientierte Programmierung Eine Einführung mit BlueJ stellt die Daten, ihre Struktur und ihre Beziehungen zueinander in den Vordergrund. Weniger im Blickpunkt: die

Mehr

Von der UML nach C++

Von der UML nach C++ 22 Von der UML nach C++ Dieses Kapitel behandelt die folgenden Themen: Vererbung Interfaces Assoziationen Multiplizität Aggregation Komposition Die Unified Modeling Language (UML) ist eine weit verbreitete

Mehr

syntax.tex Eine Übersicht

syntax.tex Eine Übersicht syntax.tex Eine Übersicht Bernd Worsch 7. Juli 1997 Inhaltsverzeichnis 1 Einleitung 1 2 Bevor es funktioniert... 1 3 Grundelemente von syntax.tex 1 4 Strukturelemente von syntax.tex 3 5 Setzen von Syntaxdiagrammen

Mehr

Programmieren. 10. Tutorium 4./ 5. Übungsblatt Referenzen

Programmieren. 10. Tutorium 4./ 5. Übungsblatt Referenzen Programmieren 10. Tutorium 4./ 5. Übungsblatt Inhalt I. Übungsblatt 4 II. III. - Rückgabe und Besprechung - Vorbereitung auf Wiederholung/ Nachtrag - Operatorpräzedenzen IV. Übungsblatt 5 - Vorstellung

Mehr

POSIX Echtzeit: Kernel 2.6 und Preempt-RT

POSIX Echtzeit: Kernel 2.6 und Preempt-RT POSIX Echtzeit: Kernel 2.6 und Preempt-RT Slide 1 - http://www.pengutronix.de - 21.01.2007 Echtzeit-Systemplanung Wenn das zeitliche Verhalten spezifiziert ist, kann auch spezifiziert werden, welche Applikationsteile

Mehr

Kontrollstrukturen - Universität Köln

Kontrollstrukturen - Universität Köln Kontrollstrukturen - Universität Köln Mario Manno Kontrollstrukturen - Universität Köln p. 1 Was sind Sprachen Auszeichnungssprachen HTML, XML Programmiersprachen ASM, Basic, C, C++, Haskell, Java, Pascal,

Mehr

Rapid I/O Toolkit. http://projects.spamt.net/riot. Alexander Bernauer alex@copton.net 08.12.08

Rapid I/O Toolkit. http://projects.spamt.net/riot. Alexander Bernauer alex@copton.net 08.12.08 Rapid I/O Toolkit http://projects.spamt.net/riot Alexander Bernauer alex@copton.net 08.12.08 Inhalt Motivation Architektur Beispiel I/O Features Ausblick Motivation Problemstellung Vorgaben Datenverarbeitung

Mehr

Proseminar Technische Informatik A survey of virtualization technologies

Proseminar Technische Informatik A survey of virtualization technologies Proseminar Technische Informatik A survey of virtualization technologies Referent: Martin Weigelt Proseminar Technische Informatik - A survey of virtualization technologies 1 Übersicht 1. Definition 2.

Mehr

Technische Informatik II

Technische Informatik II Universität Stuttgart INSTITUT FÜR KOMMUNIKATIONSNETZE UND RECHNERSYSTEME Prof. Dr.-Ing. Andreas Kirstädter Diplomprüfung Prüfer: Termin: Dauer: Verlangte Aufgaben: Zugelassene Hilfsmittel: Technische

Mehr

Noch für heute: primitive Datentypen in JAVA. Primitive Datentypen. Pseudocode. Dezimal-, Binär- und Hexadezimalsystem. der logische Typ boolean

Noch für heute: primitive Datentypen in JAVA. Primitive Datentypen. Pseudocode. Dezimal-, Binär- und Hexadezimalsystem. der logische Typ boolean 01.11.05 1 Noch für heute: 01.11.05 3 primitie Datentypen in JAVA Primitie Datentypen Pseudocode Name Speichergröße Wertgrenzen boolean 1 Byte false true char 2 Byte 0 65535 byte 1 Byte 128 127 short 2

Mehr

GF(2 2 ) Beispiel eines Erweiterungskörpers (1)

GF(2 2 ) Beispiel eines Erweiterungskörpers (1) GF(2 2 ) Beispiel eines Erweiterungskörpers (1) Im Kapitel 2.1 wurde bereits gezeigt, dass die endliche Zahlenmenge {0, 1, 2, 3} q = 4 nicht die Eigenschaften eines Galoisfeldes GF(4) erfüllt. Vielmehr

Mehr

Grundlagen der Verwendung von make

Grundlagen der Verwendung von make Kurzskript zum Thema: Grundlagen der Verwendung von make Stefan Junghans Gregor Gilka 16. November 2012 1 Einleitung In diesem Teilskript sollen die Grundlagen der Verwendung des Programmes make und der

Mehr

Grundlagen der Informatik. Prof. Dr. Stefan Enderle NTA Isny

Grundlagen der Informatik. Prof. Dr. Stefan Enderle NTA Isny Grundlagen der Informatik Prof. Dr. Stefan Enderle NTA Isny 2 Datenstrukturen 2.1 Einführung Syntax: Definition einer formalen Grammatik, um Regeln einer formalen Sprache (Programmiersprache) festzulegen.

Mehr

Elemente der Analysis II

Elemente der Analysis II Elemente der Analysis II Kapitel 3: Lineare Abbildungen und Gleichungssysteme Informationen zur Vorlesung: http://www.mathematik.uni-trier.de/ wengenroth/ J. Wengenroth () 15. Mai 2009 1 / 35 3.1 Beispiel

Mehr

Algorithmen und Datenstrukturen

Algorithmen und Datenstrukturen Algorithmen und Datenstrukturen Dipl. Inform. Andreas Wilkens 1 Organisatorisches Freitag, 05. Mai 2006: keine Vorlesung! aber Praktikum von 08.00 11.30 Uhr (Gruppen E, F, G, H; Vortestat für Prototyp)

Mehr

16 SQL Server-Zugriff per VBA

16 SQL Server-Zugriff per VBA Leseprobe aus Access und SQL Server http://www.acciu.de/asqllesen 16 SQL Server-Zugriff per VBA Sie werden an verschiedenen Stellen per VBA auf die Tabellen der SQL Server-Datenbank zugreifen müssen sei

Mehr

Folge 19 - Bäume. 19.1 Binärbäume - Allgemeines. Grundlagen: Ulrich Helmich: Informatik 2 mit BlueJ - Ein Kurs für die Stufe 12

Folge 19 - Bäume. 19.1 Binärbäume - Allgemeines. Grundlagen: Ulrich Helmich: Informatik 2 mit BlueJ - Ein Kurs für die Stufe 12 Grundlagen: Folge 19 - Bäume 19.1 Binärbäume - Allgemeines Unter Bäumen versteht man in der Informatik Datenstrukturen, bei denen jedes Element mindestens zwei Nachfolger hat. Bereits in der Folge 17 haben

Mehr

Kapitel 6. Vererbung

Kapitel 6. Vererbung 1 Kapitel 6 2 Ziele Das sprinzip der objektorientierten Programmierung verstehen Und in Java umsetzen können Insbesondere folgende Begriffe verstehen und anwenden können: Ober/Unterklassen Subtyping Überschreiben

Mehr

Programmierung, Algorithmen und Techniken. von Thomas Ohlhauser

Programmierung, Algorithmen und Techniken. von Thomas Ohlhauser Programmierung, Algorithmen und Techniken von Thomas Ohlhauser 1. Begriff Programmierung Entwicklung von Programmen inklusive der dabei verwendeten Methoden und Denkweisen. Ein Programm ist eine eine Zusammensetzung

Mehr

Prüfung VO Betriebssysteme SS2008 / 7. Juli 2008

Prüfung VO Betriebssysteme SS2008 / 7. Juli 2008 Name: Matrikel-Nr: Prüfung VO Betriebssysteme SS2008 / 7. Juli 2008 Bitte schreiben Sie leserlich und antworten Sie kurz und präzise. 1. Zeichnen Sie das Schichten-Modell eines Computersystems und markieren

Mehr

Kapitel 6. Vererbung

Kapitel 6. Vererbung 1 Kapitel 6 2 Ziele Das sprinzip der objektorientierten Programmierung verstehen Und in Java umsetzen können Insbesondere folgende Begriffe verstehen und anwenden können: Ober/Unterklassen Subtyping Überschreiben

Mehr

Echtzeitfähige Ereignisgetriebene Scheduling-Strategien

Echtzeitfähige Ereignisgetriebene Scheduling-Strategien Friedrich-Alexander-Universität Erlangen-Nürnberg Ausgewählte Kapitel eingebetteter Systeme Echtzeitfähige Ereignisgetriebene Scheduling-Strategien Sven Kerschbaum 1. Einführung Bei einem eingebetteten

Mehr

Scheduling in Echtzeitbetriebssystemen. Prof. Dr. Margarita Esponda Freie Universität Berlin

Scheduling in Echtzeitbetriebssystemen. Prof. Dr. Margarita Esponda Freie Universität Berlin Scheduling in Echtzeitbetriebssystemen Prof. Dr. Margarita Esponda Freie Universität Berlin Echtzeitsysteme Korrekte Ergebnisse zum richtigen Zeitpunkt Hart Echtzeitsysteme Eine verspätete Antwort ist

Mehr

Der linke Teilbaum von v enthält nur Schlüssel < key(v) und der rechte Teilbaum enthält nur Schlüssel > key(v)

Der linke Teilbaum von v enthält nur Schlüssel < key(v) und der rechte Teilbaum enthält nur Schlüssel > key(v) Ein Baum T mit Knotengraden 2, dessen Knoten Schlüssel aus einer total geordneten Menge speichern, ist ein binärer Suchbaum (BST), wenn für jeden inneren Knoten v von T die Suchbaumeigenschaft gilt: Der

Mehr

Hardware Virtualisierungs Support für PikeOS

Hardware Virtualisierungs Support für PikeOS Virtualisierungs Support für PikeOS Design eines Virtual Machine Monitors auf Basis eines Mikrokernels Tobias Stumpf SYSGO AG, Am Pfaenstein 14, 55270 Klein-Winternheim HS Furtwangen, Fakultät Computer

Mehr

4 Greedy-Algorithmen (gierige Algorithmen)

4 Greedy-Algorithmen (gierige Algorithmen) Greedy-Algorithmen (gierige Algorithmen) Greedy-Algorithmen werden oft für die exakte oder approximative Lösung von Optimierungsproblemen verwendet. Typischerweise konstruiert ein Greedy-Algorithmus eine

Mehr

Technische Informatik 1 Übung 2 Assembler (Rechenübung) Georgia Giannopoulou (ggeorgia@tik.ee.ethz.ch) 22./23. Oktober 2015

Technische Informatik 1 Übung 2 Assembler (Rechenübung) Georgia Giannopoulou (ggeorgia@tik.ee.ethz.ch) 22./23. Oktober 2015 Technische Informatik 1 Übung 2 Assembler (Rechenübung) Georgia Giannopoulou (ggeorgia@tik.ee.ethz.ch) 22./23. Oktober 2015 Ziele der Übung Aufgabe 1 Aufbau und Aufruf von Funktionen in Assembler Codeanalyse

Mehr

Seminar Komplexe Objekte in Datenbanken

Seminar Komplexe Objekte in Datenbanken Seminar Komplexe Objekte in Datenbanken OPTICS: Ordering Points To Identify the Clustering Structure Lehrstuhl für Informatik IX - Univ.-Prof. Dr. Thomas Seidl, RWTH-Aachen http://www-i9.informatik.rwth-aachen.de

Mehr

VHDL Verhaltensmodellierung

VHDL Verhaltensmodellierung VHDL Verhaltensmodellierung Dr.-Ing. Matthias Sand Lehrstuhl für Informatik 3 (Rechnerarchitektur) Friedrich-Alexander-Universität Erlangen-Nürnberg WS 2008/2009 VHDL Verhaltensmodellierung 1/26 2008-10-20

Mehr

Java Virtual Machine (JVM) Bytecode

Java Virtual Machine (JVM) Bytecode Java Virtual Machine (JVM) durch Java-Interpreter (java) realisiert abstrakte Maschine = Softwareschicht zwischen Anwendung und Betriebssystem verantwortlich für Laden von Klassen, Ausführen des Bytecodes,

Mehr

Grundlagen der Parallelisierung

Grundlagen der Parallelisierung Grundlagen der Parallelisierung Philipp Kegel, Sergei Gorlatch AG Parallele und Verteilte Systeme Institut für Informatik Westfälische Wilhelms-Universität Münster 3. Juli 2009 Inhaltsverzeichnis 1 Einführung

Mehr

Objektorientierte Programmierung. Kapitel 12: Interfaces

Objektorientierte Programmierung. Kapitel 12: Interfaces 12. Interfaces 1/14 Objektorientierte Programmierung Kapitel 12: Interfaces Stefan Brass Martin-Luther-Universität Halle-Wittenberg Wintersemester 2012/13 http://www.informatik.uni-halle.de/ brass/oop12/

Mehr

Laufzeit und Komplexität

Laufzeit und Komplexität Laufzeit und Komplexität Laufzeit eines Algorithmus Benchmarking versus Analyse Abstraktion Rechenzeit, Anzahl Schritte Bester, Mittlerer, Schlechtester Fall Beispiel: Lineare Suche Komplexitätsklassen

Mehr

Architektur Verteilter Systeme Teil 6: Interprozess-Kommunikation

Architektur Verteilter Systeme Teil 6: Interprozess-Kommunikation Architektur Verteilter Systeme Teil 6: Interprozess-Kommunikation 09.05.15 1 Literatur [6-1] http://php.net/manual/de/book.sockets.php [6-2] http://de.wikipedia.org/wiki/socket_(software) [6-3] http://php.net/manual/de/book.network.php

Mehr

IO Performance in virtualisierten Umgebungen

IO Performance in virtualisierten Umgebungen IO Performance in virtualisierten Umgebungen Bruno Harsch El. Ing. HTL/FH Managing Partner Tel +41 52 366 39 01 bruno.harsch@idh.ch www.idh.ch IDH GmbH Lauchefeld 31 CH-9548 Matzingen 2 Die Firma IDH wurde

Mehr

Perzentile mit Hadoop ermitteln

Perzentile mit Hadoop ermitteln Perzentile mit Hadoop ermitteln Ausgangspunkt Ziel dieses Projektes war, einen Hadoop Job zu entwickeln, der mit Hilfe gegebener Parameter Simulationen durchführt und aus den Ergebnissen die Perzentile

Mehr

Mathematische Grundlagen der Kryptographie. 1. Ganze Zahlen 2. Kongruenzen und Restklassenringe. Stefan Brandstädter Jennifer Karstens

Mathematische Grundlagen der Kryptographie. 1. Ganze Zahlen 2. Kongruenzen und Restklassenringe. Stefan Brandstädter Jennifer Karstens Mathematische Grundlagen der Kryptographie 1. Ganze Zahlen 2. Kongruenzen und Restklassenringe Stefan Brandstädter Jennifer Karstens 18. Januar 2005 Inhaltsverzeichnis 1 Ganze Zahlen 1 1.1 Grundlagen............................

Mehr

Oracle BI Publisher in der Oracle Business Intelligence Enterprise Edition Plus. Eine Mehrwertdiskussion

Oracle BI Publisher in der Oracle Business Intelligence Enterprise Edition Plus. Eine Mehrwertdiskussion Oracle BI Publisher in der Oracle Business Intelligence Enterprise Edition Plus Eine Mehrwertdiskussion Der Oracle BI Publisher als Teil der Oracle BI Suite versus Oracle BI Publisher Standalone Der Oracle

Mehr

Java Einführung Methoden in Klassen

Java Einführung Methoden in Klassen Java Einführung Methoden in Klassen Lehrziel der Einheit Methoden Signatur (=Deklaration) einer Methode Zugriff/Sichtbarkeit Rückgabewerte Parameter Aufruf von Methoden (Nachrichten) Information Hiding

Mehr

CS2101 Nebenläufige und Verteilte Programme Bachelor of Science (Informatik)

CS2101 Nebenläufige und Verteilte Programme Bachelor of Science (Informatik) Prof. Dr. Th. Letschert CS2101 Nebenläufige und Verteilte Programme Bachelor of Science (Informatik) Vorlesung 7 Th Letschert FH Gießen-Friedberg Ressourcen Verwaltung passive Ressourcen aktive Ressourcen

Mehr

Zur Erinnerung: Threads. Threadverwaltung. Threads: Prioritäten. Beispiel Flugbuchungsprogramm. Nichtdeterminismus

Zur Erinnerung: Threads. Threadverwaltung. Threads: Prioritäten. Beispiel Flugbuchungsprogramm. Nichtdeterminismus Zur Erinnerung: Threads Programmierung (fortgeschrittene Konzepte) Threads, Monitore, Semaphore und speisende en Wolf-Ulrich Raffel (uli@wuraffel.de) Möglichkeiten, Threads zu definieren Bildung einer

Mehr

Übungen zur Softwaretechnik

Übungen zur Softwaretechnik Technische Universität München Fakultät für Informatik Lehrstuhl IV: Software & Systems Engineering Markus Pister, Dr. Bernhard Rumpe WS 2002/2003 Lösungsblatt 1 17. Oktober 2002 www4.in.tum.de/~rumpe/se

Mehr

9 Verteilte Verklemmungserkennung

9 Verteilte Verklemmungserkennung 9 Verteilte Verklemmungserkennung 9.1 Grundlagen Für die Existenz einer Verklemmung notwendige Bedingungen Exklusive Betriebsmittelbelegung Betriebsmittel können nachgefordert werden Betriebsmittel können

Mehr

Bedienung von BlueJ. Klassenanzeige

Bedienung von BlueJ. Klassenanzeige Im Folgenden werden wichtige Funktionen für den Einsatz von BlueJ im Unterricht beschrieben. Hierbei wird auf den Umgang mit Projekten, Klassen und Objekten eingegangen. Abgeschlossen wird dieses Dokument

Mehr

3.2 Binäre Suche. Usr/local/www/ifi/fk/menschen/schmid/folien/infovk.ppt 1

3.2 Binäre Suche. Usr/local/www/ifi/fk/menschen/schmid/folien/infovk.ppt 1 3.2 Binäre Suche Beispiel 6.5.1: Intervallschachtelung (oder binäre Suche) (Hier ist n die Anzahl der Elemente im Feld!) Ein Feld A: array (1..n) of Integer sei gegeben. Das Feld sei sortiert, d.h.: A(i)

Mehr

Klausur zu High Performance Computing 12. Juli 2013

Klausur zu High Performance Computing 12. Juli 2013 Britta Nestler, Alexander Vondrous, Fakultät IWI, Hochschule Karlsruhe Klausur zu High Performance Computing 12. Juli 2013 Es sind keine Hilfsmittel zugelassen. Bearbeitungszeit: 90 Minuten Aufgabe 1:

Mehr

HEUTE. Effizienzbeispiel: bekannte Version (Übung 04.11.04) Mathematik: Was ist Effizienz? vollständige Induktion

HEUTE. Effizienzbeispiel: bekannte Version (Übung 04.11.04) Mathematik: Was ist Effizienz? vollständige Induktion 17.11.04 1 HEUTE 17.11.04 3 Effizienzbeispiel: bekannte Version (Übung 04.11.04) Mathematik: was ist Effizienz? vollständige Induktion JAVA: Arrays die for -Schleife die Sprunganweisungen break und continue

Mehr

VWA Rhein-Neckar Dipl.-Ing. Thomas Kloepfer. Kommunikation I (Internet) Übung 4 PHP

VWA Rhein-Neckar Dipl.-Ing. Thomas Kloepfer. Kommunikation I (Internet) Übung 4 PHP VWA Rhein-Neckar Dipl.-Ing. Thomas Kloepfer Kommunikation I (Internet) Übung 4 PHP SS 2004 Inhaltsverzeichnis 1. PHP die serverseitige Programmiersprache...1 1.1. PHP - Bereiche in HTML definieren...1

Mehr

Autor: Michael Spahn Version: 1.0 1/10 Vertraulichkeit: öffentlich Status: Final Metaways Infosystems GmbH

Autor: Michael Spahn Version: 1.0 1/10 Vertraulichkeit: öffentlich Status: Final Metaways Infosystems GmbH Java Einleitung - Handout Kurzbeschreibung: Eine kleine Einführung in die Programmierung mit Java. Dokument: Autor: Michael Spahn Version 1.0 Status: Final Datum: 23.10.2012 Vertraulichkeit: öffentlich

Mehr

13 Java 4 - Entwurfsmuster am Beispiel des Rucksackproblems

13 Java 4 - Entwurfsmuster am Beispiel des Rucksackproblems 13 Java 4 - Entwurfsmuster am Beispiel des Rucksackproblems 13.1 Modellierung des Rucksackproblems 13.2 Lösung mit Greedy-Algorithmus 13.3 Lösung mit Backtracking 13.4 Lösung mit Dynamischer Programmierung

Mehr

leave: mov flag, 0 ; 0 in flag speichern: Lock freigeben ret

leave: mov flag, 0 ; 0 in flag speichern: Lock freigeben ret Sep 19 14:20:18 amd64 sshd[20494]: Accepted rsa for esser from ::ffff:87.234.201.207 port 61557 Sep 19 14:27:41 amd64 syslog-ng[7653]: STATS: dropped 0 Sep 20 01:00:01 amd64 /usr/sbin/cron[29278]: (root)

Mehr

Parallele und funktionale Programmierung Wintersemester 2013/14. 8. Übung Abgabe bis 20.12.2013, 16:00 Uhr

Parallele und funktionale Programmierung Wintersemester 2013/14. 8. Übung Abgabe bis 20.12.2013, 16:00 Uhr 8. Übung Abgabe bis 20.12.2013, 16:00 Uhr Aufgabe 8.1: Zeigerverdopplung Ermitteln Sie an folgendem Beispiel den Rang für jedes Listenelement sequentiell und mit dem in der Vorlesung vorgestellten parallelen

Mehr

1. Musterlösung. Problem 1: Average-case-Laufzeit vs. Worst-case-Laufzeit

1. Musterlösung. Problem 1: Average-case-Laufzeit vs. Worst-case-Laufzeit Universität Karlsruhe Algorithmentechnik Fakultät für Informatik WS 06/07 ITI Wagner Musterlösung Problem : Average-case-Laufzeit vs Worst-case-Laufzeit pt (a) Folgender Algorithmus löst das Problem der

Mehr

CPU-Scheduling - Grundkonzepte

CPU-Scheduling - Grundkonzepte CPU-Scheduling - Grundkonzepte Sommersemester 2015 Seite 1 Gesamtüberblick 1. Einführung in Computersysteme 2. Entwicklung von Betriebssystemen 3. Architekturansätze 4. Interruptverarbeitung in Betriebssystemen

Mehr

Timm M. Steinbeck und Arne Wiebalck Lehrstuhl für Technische Informatik Universität Heidelberg. Prozess-Monitoring auf CPU-Takt Ebene

Timm M. Steinbeck und Arne Wiebalck Lehrstuhl für Technische Informatik Universität Heidelberg. Prozess-Monitoring auf CPU-Takt Ebene Timm M. Steinbeck und Arne Wiebalck Lehrstuhl für Technische Informatik Universität Heidelberg Prozess-Monitoring auf CPU-Takt Ebene Einleitung Unser Arbeitsgebiet: ALICE Teilchenphysik Experiment Cluster

Mehr

Erstellung eines SharkNet Installers für Windows mit Inno Setup Compiler 5.4.2

Erstellung eines SharkNet Installers für Windows mit Inno Setup Compiler 5.4.2 Erstellung eines SharkNet Installers für Windows mit Inno Setup Compiler 5.4.2 1. Benötigte Software Zur Erstellung des Installers wird folgende Software benötigt. Es wird sich in dieser Dokumentation

Mehr

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 11/12. Kapitel 13. Bäume. Bäume

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 11/12. Kapitel 13. Bäume. Bäume 1 Kapitel 13 Ziele 2 Den Begriff des Baums in der Informatik kennenlernen als verkettete Datenstruktur repräsentieren können Rekursive Funktionen auf n verstehen und schreiben können Verschiedene Möglichkeiten

Mehr

Rechnerarchitektur und Betriebssysteme (CS201): Semaphor, Monitor, Deadlocks, Re-Entrance

Rechnerarchitektur und Betriebssysteme (CS201): Semaphor, Monitor, Deadlocks, Re-Entrance Rechnerarchitektur und Betriebssysteme (CS201): Semaphor, Monitor, Deadlocks, Re-Entrance 5. November 2013 Prof. Dr. Christian Tschudin Departement Mathematik und Informatik, Universität Basel Repetition

Mehr

Institut für Betriebswirtschaftslehre Services & Operations Management

Institut für Betriebswirtschaftslehre Services & Operations Management Services & Operations Management Prof. Dr. Helmut Dietl Modulübersicht 1. Operations Strategie 2. Process Analytics 3. Qualitätsmanagement: SPC 4. Plattformmanagement 5. Sportmanagement Seite 2 Lernziele

Mehr

Java Einführung Operatoren Kapitel 2 und 3

Java Einführung Operatoren Kapitel 2 und 3 Java Einführung Operatoren Kapitel 2 und 3 Inhalt dieser Einheit Operatoren (unär, binär, ternär) Rangfolge der Operatoren Zuweisungsoperatoren Vergleichsoperatoren Logische Operatoren 2 Operatoren Abhängig

Mehr

KURZANLEITUNG CLOUD BLOCK STORAGE

KURZANLEITUNG CLOUD BLOCK STORAGE KURZANLEITUNG CLOUD BLOCK STORAGE Version 1.12 01.07.2014 SEITE _ 2 INHALTSVERZEICHNIS 1. Einleitung......Seite 03 2. Anlegen eines dauerhaften Block Storage...Seite 04 3. Hinzufügen von Block Storage

Mehr

Arbeiten mit Arrays. 4.1 Eigenschaften. 4.1.1 Schlüssel und Element. Kapitel 4

Arbeiten mit Arrays. 4.1 Eigenschaften. 4.1.1 Schlüssel und Element. Kapitel 4 Arbeiten mit s Eine effiziente Programmierung mit PHP ohne seine s ist kaum vorstellbar. Diese Datenstruktur muss man verstanden haben, sonst brauchen wir mit weitergehenden Programmiertechniken wie der

Mehr

Codierungstheorie Rudolf Scharlau, SoSe 2006 9

Codierungstheorie Rudolf Scharlau, SoSe 2006 9 Codierungstheorie Rudolf Scharlau, SoSe 2006 9 2 Optimale Codes Optimalität bezieht sich auf eine gegebene Quelle, d.h. eine Wahrscheinlichkeitsverteilung auf den Symbolen s 1,..., s q des Quellalphabets

Mehr

Grundlagen Programmierung

Grundlagen Programmierung 1. Aufgabe (Spielen mit Objekten) Gegeben sei der auch von der Veranstaltungsseite erhältliche Programmcode auf der rechten Seite, der im Detail zuerst nicht verstanden werden muss. a) Erzeugen Sie sich

Mehr

Kurzeinführung LABTALK

Kurzeinführung LABTALK Kurzeinführung LABTALK Mit der Interpreter-Sprache LabTalk, die von ORIGIN zur Verfügung gestellt wird, können bequem Datenmanipulationen sowie Zugriffe direkt auf das Programm (Veränderungen der Oberfläche,

Mehr

NH-Schuldenverwaltung 2015 1. Neuerungen 2015. Excel-Ausgabe bei fast allen Auswertungen verfügbar

NH-Schuldenverwaltung 2015 1. Neuerungen 2015. Excel-Ausgabe bei fast allen Auswertungen verfügbar NH-Schuldenverwaltung 2015 1 Neuerungen 2015 Excel-Ausgabe bei fast allen Auswertungen verfügbar Fortan ist es möglich unter dem Menüpunkt Listen nahezu alle Auswertungen der Einzelpunkte auch nach Excel

Mehr

Multicore Herausforderungen an das Software-Engineering. Prof. Dr.-Ing. Michael Uelschen Hochschule Osnabrück 15.09.2010

Multicore Herausforderungen an das Software-Engineering. Prof. Dr.-Ing. Michael Uelschen Hochschule Osnabrück 15.09.2010 Multicore Herausforderungen an das Software-Engineering Prof. Dr.-Ing. Michael Uelschen Hochschule Osnabrück 15.09.2010 Inhalt _ Motivation _ Herausforderung 1: Hardware _ Herausforderung 2: Software-Partitionierung

Mehr

Ausarbeitung des Interpreter Referats

Ausarbeitung des Interpreter Referats Ausarbeitung des Interpreter Referats Gliederung 1. Programmiersprache 1.2. Syntax 1.2.1. Konkrete Syntax 1.2.2. Abstrakter Syntax Baum (Abstrakte Syntax) 2. Parser 2.1. Syntaktische Struktur einer Sprache

Mehr

In Tabelle 2.1 sehen Sie das Ergebnis beider Ausführungen auf meiner Maschine.

In Tabelle 2.1 sehen Sie das Ergebnis beider Ausführungen auf meiner Maschine. Kapitel 2 Datenverwaltung durch SQL Server Wir wollen das obige Skript zwei Mal laufen lassen, einmal mit und einmal ohne eingeschalteten Schreibcache der Festplatte. Für eine lokale Festplatte können

Mehr

C++ - Einführung in die Programmiersprache Polymorphismus und Vererbung. Eltern

C++ - Einführung in die Programmiersprache Polymorphismus und Vererbung. Eltern C++ - Einführung in die Programmiersprache Polymorphismus und Vererbung Eltern Kind Kind Vererbung Definition von Klassen auf Basis von bestehenden Klassen. Implementierung von ist ein. bildet ein hierarchisches

Mehr

183.579, SS2012 Übungsgruppen: Do., 14.6. Mi., 20.6.2012

183.579, SS2012 Übungsgruppen: Do., 14.6. Mi., 20.6.2012 VU Technische Grundlagen der Informatik Übung 8: Systemsoftware und Netzwerke 183.579, SS2012 Übungsgruppen: o., 14.6. Mi., 20.6.2012 ufgabe 1: Virtual Memory Zeichnen Sie ein System das Paging zur Speicherverwaltung

Mehr

Numerische Datentypen. Simon Weidmann

Numerische Datentypen. Simon Weidmann Numerische Datentypen Simon Weidmann 08.05.2014 1 Ganzzahlige Typen 1.1 Generelles Bei Datentypen muss man immer zwei elementare Eigenschaften unterscheiden: Zuerst gibt es den Wertebereich, zweitens die

Mehr

Verträge für die funktionale Programmierung Design und Implementierung

Verträge für die funktionale Programmierung Design und Implementierung 1 Verträge für die funktionale Programmierung Design und Implementierung RALF HINZE Institut für Informatik III, Universität Bonn Römerstraße 164, 53117 Bonn, Germany Email: ralf@informatik.uni-bonn.de

Mehr

L6. Operatoren und Ausdrücke

L6. Operatoren und Ausdrücke L6. Operatoren und Ausdrücke 1. Arithmetische Operatoren: +, -, *, /, %, --, ++ 2. Zuweisung-Operatoren: =, +=, -=, *=, /= 3. Vergleichsoperatoren: =, ==,!= 4. Logische Operatoren:!, &&, 5.

Mehr

1. Grundlegende Konzepte der Informatik

1. Grundlegende Konzepte der Informatik 1. Grundlegende Konzepte der Informatik Inhalt Algorithmen Darstellung von Algorithmen mit Programmablaufplänen Beispiele für Algorithmen Aussagenlogik Zahlensysteme Kodierung Peter Sobe 1 Algorithmen

Mehr

Java Kurs für Anfänger Einheit 5 Methoden

Java Kurs für Anfänger Einheit 5 Methoden Java Kurs für Anfänger Einheit 5 Methoden Ludwig-Maximilians-Universität München (Institut für Informatik: Programmierung und Softwaretechnik von Prof.Wirsing) 22. Juni 2009 Inhaltsverzeichnis Methoden

Mehr

Die Bedeutung abstrakter Datentypen in der objektorientierten Programmierung. Klaus Kusche, September 2014

Die Bedeutung abstrakter Datentypen in der objektorientierten Programmierung. Klaus Kusche, September 2014 Die Bedeutung abstrakter Datentypen in der objektorientierten Programmierung Klaus Kusche, September 2014 Inhalt Ziel & Voraussetzungen Was sind abstrakte Datentypen? Was kann man damit grundsätzlich?

Mehr