Infrastruktur und Betriebssysteme III. Martin Plümicke

Größe: px
Ab Seite anzeigen:

Download "Infrastruktur und Betriebssysteme III. Martin Plümicke"

Transkript

1 Infrastruktur und Betriebssysteme III Martin Plümicke 25. Februar 2002

2 Inhaltsverzeichnis 1 Einführung in Betriebssysteme 3 2 Überblick Systemkomponenten Prozess Management Hauptspeicherverwaltung Datei Systeme I/O Systeme Shell Systemaufrufe Prozesskontrolle Filemanipulation Gerätemanipulation Informationsverwaltung Kommunikation Java Virual Machine Programmiersprache API Virtuelle Maschine Prozesse Einführung Threads Vorteile von Threads Userlevel und Kernel-Threads Java Threads CPU Prozess Scheduling (Prozessablaufplanung) First Come, First Served (FCFS) Kürzester Auftrag zuerst Prioritäts Scheduling Round Robin Algorithmus Mehrstufiges Scheduling Java Thread Scheduling Prozesssynkronisation Aktives Warten Peterson Lösung TSL Instruktion

3 3.4.4 Zustandsveränderungen von Prozessen Semaphore Kritische Regionen Monitore Prozesssynkronisation in Java Klassische Synkronisationsprobleme Deadlocks I/O Systeme Dateisysteme I/O Systeme Datei Systeme Memory Management System Paging Segmentierung Reale Betriebssysteme Unix Linux Windows NT

4 3.4 Prozesssynkronisation In diesem Abschnitt wollen wir die Probleme betrachten, die möglicherweise eintreten können, wenn Prozesse miteinander kommunizieren. Kritische Bereiche Betrachten wir zunächst ein Beispiel, um uns mögliche Schwierigkeiten bei der Prozesskommunikation deutlich zu machen. In der Regel wird in Unix Systemen das Drucken durch folgenden Mechanismus geregelt: Es gibt eine Druckerqueue in die verschiedene Prozesse Druckaufträge eintragen dürfen. Der Druckerdeamon (Prozess, der das Ausdrucken ausführt) arbeitet die Queue dann Schritt für Schritt ab. Möchte nun ein Prozess einen Druckauftrag erteilen, so stellt er an die Queue die Anfrage nach dem nächsten freien Platz und erhält eine Adresse. Wenn nun in diesem Moment der Scheduler entscheidet diesen Prozess auf rechenbereit zu setzen und ein nächster Prozess ebenfalls einen Druckauftrag erteilen will. Dieser neue Prozess erhält nun die gleiche Adresse und schreibt seinen Druckauftrag an diese Adresse. Nun kommt der erste Prozess wieder zum Zuge. Er schreibt nun seinerseits den Druckauftrag an diese Adresse und der Druckauftrag des zweiten Prozesses geht verloren. Worin liegt in diesem Beipsiel nun das Problem? Das Problem ist, dass beide Prozesse auf eine Variable, nämlich die Variable des nächsten freien Platzes in der Queue zugreifen. Also brauchen wir um das Problem zu lösen so etwas wie einen wechselseitigen Ausschluss, der es immer nur einem Prozess erlaubt für eine bestimmte Zeit auf eine solche Variable zuzugreifen. Man nennt die Abschnitte eines Programms, die auf solche kritischen Resource zugreifen Kritische Bereiche. Der wechselseitige Ausschluss sollte grundsätzlich folgenden vier Bedingungen genügen. 1. Zu jedem Zeitpunkt darf sich nur ein Prozess in seinem kritischen Bereich befinden 2. Es dürfen keine Annahmen über Ausführgeschwindigkeit und oder Anzahl der Prozessoren gemacht werden. 3. Kein Prozess der sich außerhalb seines kritischen Bereichs befindet darf einen anderen Prozess blockieren. 4. Kein Prozess soll unendlich lange auf seine Fortführung warten müssen. Die erste Bedingung ist die Bedingung für die Lösung des benannten Problems. Die zweite Bedingung soll die Portabilität und Anwendbarkeit unter verschiedenen Rahmenbedingungen (z.b. es werden mehr oder weniger Prozesse auf dem Rechner gleichzeitig abgearbeitet) ermöglichen. Die dritte Bedingung ist eine Effizienzbedingung und die vierte Bedingung stellt sicher, dass sich ein System durch den wechselseitigen Ausschluss nicht selber blockiert Aktives Warten Einen ersten Ansatz dieses Problem zu lösen bietet das aktive Warten. Betrachten wir die zwei C Programmstücke in Abbildung In den beiden Programmstücken ist die Variable turn eine Variable auf die beide Prozesse gleichermaßen zugreifen können. Dies lässt sich beispielsweise durch das Thread-Konzept (vgl. Kapitel 3.2) realisieren. Wenn nun Prozess 1 in einen kritischen Bereich eintreten will, so wird die Variable turn auf 0 geprüft. Ist sie ungleich 0 bleibt der Prozess in der While Schleife bis die Variable den Wert 0 annimmt. Die Variable turn wird durch Prozess

5 Prozess 1: Prozess 2: while (TRUE) { while (TRUE) { while (turn!=0) while (turn!=1) ; ; critical_section(); critical_section(); turn = 1; turn = 0; noncritical_section(); noncritical_section(); Abbildung 3.13: Aktives Warten 2 auf 0 gesetzt, wenn er seinen kritischen Bereich verlässt. Dann kann auch Prozess 1 in seinen kritischen Bereich eintreten. Nun ist es aber Prozess 2 unmöglich wiederum in seinen kritischen Bereich einzutreten, solange turn nicht auf 1 gesetzt wird. Der Ansatz des aktiven Wartens ist eine Lösung des Problems, sollte aber nur dann verwendet werden, wenn sicher ist, dass die Prozesse jeweils nicht allzulange warten müssen, weil das aktive Warten Rechenzeit verbraucht. Außerdem wird verlangt, dass Prozesse streng abwechselnd in ihre kritischen Bereiche eintreten, was in der Regel auch nicht den gegebenen Problemen entspricht Peterson Lösung Peterson hat 1981 vorgeschlagen zwei Prozeduren zu benutzen, die jeweils aufgerufen werden, wenn ein Prozess in seinen kritischen Bereich eintritt bzw. wenn er ihn wieder verlässt. In dieser void enter_region (int process) int other; { other = 1 - process; interested [process] = 1; loser = process; /* loser ist immer der */ /* Zweite der kommt */ while (loser = process && interested [other]); void leave_region (int process) { interested [process] = 0; Abbildung 3.14: Peterson Lösung Lösung haben die Prozesse die Nummern 0 und 1. Betrachten wir einen Prozess, der gerade in die Prozedur enter region eintritt. Zunächst wird der andere Prozess festgestellt. Dann wird das Feld interested für den betrachteten Prozess gesetzt. Und nun erhält die Variable loser die Prozessnummer des betrachteten Prozesses. Hat nun auch der andere Prozess Interesse in seinen kritischen Bereich einzutreten (interested [other] = 1), so ist entweder der andere Prozess in seinem kritischen Bereich, dann muss der betrachtete Prozess warten. Wenn der andere Prozess aber auch gerade versucht in seinen kritschen Bereich einzutreten, so wird loser umgesetzt und der betrachtete Prozess kann in seinen kritschen Bereich eintreten. Verlässt der andere Prozess

6 durch leave region seinen kritischen Bereich, so wird interested [other] = 0 gesetzt und der betrachtete Prozess kann in seinen kritischen Bereich eintreten. Dieser Ansatz erlaubt, dass Prozesse nicht unbedingt abwechselnd in ihre kritischen Bereiche eintreten müssen. Es wird aber auch hier aktiv gewartet. Aufgabe: Implementieren Sie die Peterson Lösung in Java. Gegeben sei dazu das folgende Interface MutualExclusion public interface MutualExclusion { public void enter_region(int process); public void leave_region(int process); Programmieren Sie die Lösung als Klasse, die MutualExclusion implementiert. Hinweis: Sie müssen die Variablen auf die mehrere Threads zugreifen können als volatile deklarieren. Programmieren Sie einen Thread, der in seiner Methode run in den kritischen Bereich eintritt und ihn wieder verlässt. Programmieren Sie eine Klasse, die mehrere Threads anlegt und startet Testen Sie ihr Programm, indem Sie innerhalb des kritsichen Bereichs einen Ausgabeaufruf einfügen, der eindeutig anzeigt, welcher Thread im Moment abgearbeitet wird. Kommentieren Sie einmal die Aufrufe von enter region und leave region aus und beobachten Sie den Unterschied TSL Instruktion Für den nächsten Ansatz setzten wir voraus, dass die Maschinensprache einen Test and Set Lock Befehl (TSL) enthält. Der TSL Befehl kopiert den Inhalt einer bestimmten Adresse in ein Register und setzt den Inhalt der Adresse auf einen Wert ungleich 0. Diese Operation erfolgt ungeteilt. Es ist also keine Unterbrechung zwischen kopieren und Wert auf ungleich 0 setzen möglich. Als Lösung geben wir nun ein Stück Pseudo Assembler Code an: enter_region: tsl flag, register ; kopiere flag in register und setze flag auf 1 cmp register, #0 ; war flag gleich 0 bne enter_region ; falls nicht gleich, verzweige ; nach enter_region, also warte ret ; Eintritt in kritischen Bereich ok leave_region move #0, flag ret ; lösche flag Auch die Lösung mit dem TSL Befehl hat den Nachteil, dass sie aktives Warten benutzt. Das heißt es wird zum einen Rechenzeit verschwendet. Zum anderen birgt das aktive Warten aber auch noch weitere Gefahren in sich. Wenn zum Beispiel der Scheduler einem Prozess sehr viel Rechenzeit zuteilt, der gerade aktiv wartet, kann das das Computersystem extem bremsen und ggf. sogar blockieren, wenn aus irgendeinem Grund der Prozess der sich in seinem kritischen Bereich befindet nicht mehr in den rechnenden Zustand versetzt wird.

7 3.4.4 Zustandsveränderungen von Prozessen Eine weitere Idee wäre Prozesse anstatt sie aktiv warten zu lassen in den blockierten Zustand zu versetzen. Dann kann es auch nicht mehr vorkommen, dass ein Prozess, der sich im aktiven Warten befindet, sehr viel Rechenzeit zugeordet bekommt. Betrachten wir dazu ein weiteres Beispiel das auf kritische Resourcen zugreift, das Erzeuger Verbraucher Problem 2 void producer () { int item; while(1) /* N = max. Pfuffergroesse */ { produce_item(&item); /* erzeuge Eintrag */ if (count == N) /* Wenn Puffer voll, */ sleep(); /* lege Dich schlafen */ enter_item(item); /* trage erzeugtes Element in Puffer ein */ count = count + 1; /* erhöhe Anzahl der Puffereinträge */ if (count == 1) /* War der Puffer leer, */ wakeup(consumer) /* so wecke den Verbraucher */ void consumer () { int item; while (1) { if (count == 0) /* Wenn Puffer leer, */ sleep(); /* lege Dich schlafen */ remove_item(&item); /* entnehme Eintrag aus dem Puffer */ count = count - 1; /* vermindere Anzahl der Puffereinträge */ if (count == N - 1) /* War Puffer voll, */ wakeup(producer); /* wecke Erzeuger auf */ consume_item(); /* verarbeite Eintrag */ Abbildung 3.15: Erzeuger Verbraucher Problem mit kritischen Resourcen In dem C Programm in Abblidung 3.15 wird davon ausgegangen, dass in C Betriebssystemstemaufrufe sleep, welcher sich selber blockiert (schlafen legt), und wakeup(process), welcher den Prozess process vom blockierten in den rechenbereiten Zustand überführt (aufweckt), existieren. Vergleiche Abbildung 3.2. Das Beispiel in Abbildung 3.15 führt genauso wie das Druckerbeipiel am Anfang des Kapitels möglicherweise zu großen Problemen. Nehmen wir an, der Verbraucher stellt im Moment fest, dass count den Wert 0 hat, legt sich aber noch nicht schlafen, sondern wird vom Scheduler in den rechenbereiten Zustand gesetzt. Der Scheduler setzt nun den Erzeuger in den rechnenden Zustand. Der Erzeuger setzt die Variable count auf 1 und sendet an den rechenbereiten Zustand consumer eine wakeup Signal. Dieser ignoriert dieses Signal, weil er ja wach ist und legt sich schlafen, wenn er vom Scheduler wieder in der rechnenden Zustand versetzt wird. Der Erzeuger arbeitet dann bis der Puffer voll ist und legt sich auch schlafen. Nun sind beide Prozesse blockiert und das System arbeitet nicht mehr. Wir haben einen Deadlock erreicht. 2 Bsp.: cat file1 file2 more.

8 3.4.5 Semaphore Zur Lösung dieses Problems hat E. W. Dijkstra 1965 vorgeschlagen sogenannte Semaphore einzuführen. Semaphore sind Integer-Variablen auf denen zwei Operationen up und down definiert sind. up und down sind Verallgemeinerungen von sleep und wakeup. Wird down auf eine Variable mit größer als 0 angewandt, so wird der Wert um 1 erniedrigt. Wird down auf 0 angewandt so legt sich der Prozess schlafen. Die Operation up angewandt auf einen Semaphor der den Wert 0 enthält, weckt einen (zufällig ausgewählten) Prozess aus, der sich bezüglich des Semaphors schlafen gelegt hat, und weckt ihn auf. Der Wert bleibt 0. Ist kein Prozess bezüglich des Semaphors blockiert, wird der Semaphor um 1 erhöht. Sowohl die up- als auch die down Operation sind atomare Operationen. Das heißt es ist nicht möglich die Ausführung von up oder down zu unterbrechen. Dies ist entscheidend, um das aufgezeigte Problem zu lösen. Betrachten wir nun die Lösung des Erzeuger Verbraucher Problems mit Hilfe von Semaphoren (Abbildung 3.16). In der Lösung des Erzeuger Verbraucher Problems werden drei Semaphore eingesetzt. Der Semaphor empty zählt die leeren Puffereinträge und legt den Erzeuger schlafen, falls der Puffer voll ist. Der Semaphor full zählt die Puffereinträge und legt den Verbraucher schlafen, falls der Puffer leer ist. Der Semaphor mutex stellt sicher, dass sich immer nur ein Prozess in seinem kritischen Bereich befindet. Dieser Semaphor nimmt nur die Werte 0 und 1 an. Man nennt ihn deshalb auch binären Semaphor. Das Konzept der Semaphoren direkt beispielsweise in der Sprache C zu programmieren bringt einige Probleme bei der Fehlersuche mit sich. Betrachten wir zum Beispiel den Fehler, dass ein Programmierer versehentlich up und down verwechselt: up(mutex)... critical_section()... down(mutex) Durch diesen Fehler ist es möglich, dass sich verschiedene Prozesse gemeinsamen in ihren kritischen Bereichen befinden. Der Fehler führt möglicherweise selten zu falschen Ergebnissen, weil er sich nur dann auswirkt, wenn sich tatsächlich verschiedene Prozesse gleichzeitig in ihren kritischen Bereichen befinden. Außerdem ist der Fehler nur sehr schwer reproduzierbar. Ein weiterer möglicher Programmierfehler wäre, dass man ausversehen zweimal die down Operationen verwendet: down(mutex)... critical_section()... down(mutex) Das Programm würde in diesem Fall immer mit einem Deadlock enden, denn der Prozess wird immer nachdem er den kritischen Bereich verlassen schlafengelegt. Um das Auftreten von Fehlern dieser Art zu minimieren, gibt es eine ganze Reihe von Konstrukten in höheren Programmiersprachen, die es ermöglichen, Lösungen auf einer höheren Ebene anzugeben. Wir werden hier das Konzept der Kritischen Regionen und der Monitore vorstellen Kritische Regionen Zunächst führt man in einer höheren Programmiersprache 3 ein zusätzliches Schlüsselwort shared ein, mit dessen Hilfe man Variablen deklariert, auf die verschiedene Prozesse zugreifen dürfen: 3 Wir verwenden hier eine pascal ähnliche Systax und deuten damit eine gegenüber C höhere Programmiersprache an.

9 typedef int semaphore; semaphore mutex = 1; /* kontolliert Eintritt in kritischen Bereich */ semaphore empty = N; /* zählt leere Puffereinträge */ semaphore full = 0; /* zählt volle Puffereinträge */ void producer () { int item; while(1) { produce_item(&item); /* erzeuge Eintrag */ down (&empty); /* wenn Puffer nicht voll, erniedrige empty, sonst lege Dich schlafen */ down (&mutex); /* falls anderer Prozess auf den Puffer zugreift, lege Dich schlafen, sonst erniedrige mutex */ enter_item(item); /* trage erzeugtes Element in Puffer ein */ up(&mutex); /* falls anderer Prozess auf den Puffer zugreifen wollte, wecke ihn auf, sonst erhöhe mutex */ up(&full); /* falls anderer Prozess leeren Puffer vorgefunden hatte, wecke ihn auf, sonst erhöhe full */ void consumer () { int item; while (1) { down (&full) ; /* wenn Puffer nicht leer, erniedrige full, sonst lege Dich schlafen */ down (&mutex); /* falls anderer Prozess auf den Puffer zugreift, lege Dich schlafen, sonst erniedrige mutex */ remove_item(&item); /* entnehme Eintrag aus dem Puffer */ up(&mutex); /* falls anderer Prozess auf den Puffer zugreifen wollte, wecke ihn auf, sonst erhöhe mutex */ up(&empty); /* falls anderer Prozess vollen Puffer vorgefunden hatte, wecke ihn auf, sonst erhöhe empty */ consume_item(); /* verarbeite Eintrag */ Abbildung 3.16: Lösung des Erzeuger Verbraucher Problems mit Semaphoren

10 var v : shared T; Hier wird eine Variable v von Typ T deklariert, auf die mehrere Prozesse zugreifen können. Auf Variablen, die als shared deklariert sind, darf man nur innerhalb von Region Umgebungen zugreifen: region v when B do S; Die Semantik der Region Umgebungen ist so festgelegt, dass solange das Programmstück S ausgeführt wird, kein anderer Prozess auf die Variable v zugreifen darf. B ist ein boole scher Ausdruck, der erfüllt sein muss, damit der Prozess mit S nt. Als ein Beispiel für die Region Umgebungen wollen wir nun das Erzeuger Verbraucher Problem implementieren (Abbildung 3.17). var queue : shared record pool : array [0..N] of integer; start, end, count : integer end procedure producer; var item : integer; produce_item(item); region queue when count < N do enter_item(item); end; (* producer *) procedure consumer; var item : integer; region queue when count > 0 do remove_item (item); consume_item(item); end; (* consumer *) Abbildung 3.17: Erzeuger Verbraucher Problem in der Region Umgebung Betrachten wir nun eine mögliche Übersetzung der Region Umgebungen: region x when B do S; In Abbildung 3.18 ist in C mit Semaphoren eine Übersetzung angegeben. Die Übersetzung implementiert eine Warteschleife die jeweils alle Prozesse die zum Start der Region Umgebungen kommen zunächst durch eine zweistufige Warteschleife schickt, wenn die Bedingung B (noch) nicht erfüllt ist. Schritt für Schritt wird für die wartenden Prozesse die Bedingung wieder geprüft. Drei binäre Semaphoren sind wie folgt vorinitialisiert: mutex = 1, first = 0, second = 0. Zunächst wird der Prozess bezüglich first schlafen gelegt. Wenn nun ein anderer Prozess S verläßt, wird dieser Prozess durch up aufgeweckt. Der so aufgeweckte Prozess weckt dann in der zweiten Stufen alle Prozesse auf, die sich bezüglich first

11 down(mutex) while (not B) { first-count = first-count + 1; if (second-count > 0) up(second); else up(mutex); down(first); first-count = first-count - 1; second-count = second-count + 1; if (first-count > 0) up(first); else up(second); down(second); second-count = second-count - 1; S; if (first-count > 0) up(first); else { if (second-count > 0) up(second); else up(mutex); Abbildung 3.18: Implementierung der Region Umgebung schlafen gelegt haben. Diese so aufgeweckten Prozesse legen sich nun bezüglich second schlafen. Der letzte Prozess der bezüglich first aufgeweckt wurde, weckt seinerseits einen Prozess auf, der sich bezüglich second schlafen gelegt hat. Für diesen aufgeweckten Prozess wird die Bedingung B erneut überprüft. Wenn B erfüllt ist, durchläuft der betrachtete Prozess das Programmstück S. Die Variablen first-count und second-count beinhalten die Anzahl der im Moment bezüglich des jeweiligen Semaphors schlafen gelegten Prozesse. Man muss die Warteschleife zweistufig programmieren, weil sich sonst mehrere wartende Prozesse ständig gegenseitig aufwecken würden, ohne dass ein anderer Prozess seinen kritischen Bereich verlassen hätte. Damit wäre die Implementierung falsch Monitore Ein Monitor ist ebenfalls ein Konstrukt einer höheren Programmiersprache. In einem Monitor werden mehrere Prozeduren und Variablen zusammengefaßt. Die Idee ist nun, dass in jedem Monitor eines Programms sich gleichzeitig immer nur ein Prozess befinden darf. Falls ein weiterer Prozess in den Monitor eintreten will, muss er sich schlafen legen und warten bis der andere Prozess den Monitor verlassen hat. Auf Variablen, die in einem Monitor deklariert sind, dürfen immer nur Prozeduren des gleichen Monitors zugreifen. Dieses Konzept stellt sicher, dass sich immer nur ein Prozess innerhalb eines Monitors befindet. Für die Programmierung ist das aber nicht ausreichend. Es sollte zusätzlich durch Befehle möglich sein, Prozesse zu blockieren und wieder aufzuwecken. Dazu führt man einen neuen Typ von Variablen ein: condition. Es gibt zwei Operationen wait und signal, die auf Variablen vom Typ condition anwendbar sind. Die

12 Operation wait blockiert einen Prozess bezüglich einer condition Variablen. signal weckt einen beliebigen Prozess bezüglich einer condition Variablen wieder auf. Nehmen wir nun an ein Prozess P weckt einen Prozess Q auf. In dieser Situation gibt es mehrere Möglichkeiten, die eintreten können: 1. P wartet bis Q den Monitor verlässt oder blockiert wird. 2. Q wartet bis P den Monitor verlässt oder blockiert wird. In der Praxis gibt es verschiedene Implementierungen. Wir werden später eine Implementierungen für Fall 2 angeben. In der existierenden Programmiersprache Concurrent Pascal sind Monitore aber beispielsweise so realisiert, dass P sofort den Monitor verlässt, wenn Q aufgeweckt wurde. Das bedeutet allerdings, dass jeder Prozess innerhalb eines Monitors nur ein signal senden kann. Betrachten wir nun einen Lösungsansatz für das Erzeuger Verbraucher Problem mit einem Monitor (Abbildung 3.19). Wir müssen zwei neue Prozeduren enter und remove einführen, die beide in dem gleichen Monitor implementiert sind. Abschließend geben wir noch eine mögliche Übersetzung von Monitoren an. Für jeden Monitor führen wir einen Semaphor mutex ein (initialiert mit 1). Beim Eintreten in dem Monitor muss down( mutex ) ausgeführt werden. Zusätzlich wird noch ein Semaphor next und eine Integer-Variable next-count eingeführt, welche die Prozesse zählt, die auf den Eintritt in den Monitor warten. Jede Prozedur F eines Monitors wird dann übersetzt nach: down(mutex); Rumpf von F ; if next-count > 0 up(next); else up(mutex); Für jede condition Variable x wird ein Semaphor x-sem und eine Integer-Variable x-count eingeführt (beide mit 0 initialiert). Die Operation wait(x) wird dann wie folgt implementiert: x-count = x-count + 1; if next-count > 0 up(next); else up(mutex); down(x-sem); x-count = x-count - 1; Bleibt noch die Übersetzung der Operation signal(x): if x-count > 0 { next-count = next-count + 1; up(x-sem); down(next) next-count = next-count - 1;

13 monitor ProducerConsumer var full, empty : condition; count : integer; procedure enter(item : integer); if count = N then wait(full); enter_item(item); count := count + 1; if count = 1 then signal(empty) end; (* enter *) procedure remove(var item : integer); if count = 0 then wait(empty); remove_item(item); count := count - 1; if count = N -1 signal(full); end; (* remove *) end; (* ProducerConsumer *) procedure producer; var item : integer; produce_item(item); enter(item); end; (* producer *) procedure consumer; var item : integer; remove(item); consume_item(item); end; (* consumer *) Abbildung 3.19: Lösung des Erzeuger Verbraucher Problem mit einem Monitor Prozesssynkronisation in Java In Java gibt es ebenfalls die Möglichkeit durch wechselseitigen Ausschluss auf kritische Bereiche zuzugreifen. Neben der Peterson Lösung (Abschnitt 3.4.2) bietet Java die Möglichkeit kritische Bereiche als Methoden durch das Schlüsselwort synchronized zu realisieren. In Java besitzt jedes Objekt genau ein Lock 4. Wenn ein Objekt referenziert wird (Zugriff auf das Objekt selbst, ein Attribut oder eine Methode des Objekts), wird der Lock üblicherweise ignoriert. Nur wenn die 4 Unter einem Lock kann man sich ein Bit vorstellen, das entweder gesetzt oder nicht gesetzt ist

14 Methode auf die zugegriffen wird durch synchronized ausgezeichnet ist, wird der Lock betrachtet. Ist in diesem Fall der Lock von einem anderen Thread bereits gesetzt worden, so wird der aktuelle Thread blockiert und in eine Menge von wartenden Threads eingetragen. Wenn der Lock nicht gesetzt ist, so setzt der aktuelle Thread den Lock und arbeitet die synchronized Methode ab. Beim Verlassen der Methode wird der Lock wieder aufgehoben. Wenn nun die Menge der wartenden Threads nicht leer ist, so wird ein zufälliger Thread bestimmt, der dann den Lock setzt und in den rechenbereiten Zustand überführt wird. Betrachten wir im Folgenden das Erzeuger Verbraucher Problem implementiert in Java. Zunächst die Klasse BoundedBuffer, die den Speicher (Buffer) mit ihren Methoden enter item und remove item (Abbildung 3.20). In den Methoden enter item und remove item werden, wenn der Speicher voll bzw. leer ist jeweils die Methode wait aufgerufen. Die Methode wait ist eine Methode der Klasse Object. Sie hat die Eigenschaften: 1. Der derzeitige Lock wird aufgehoben. 2. Der Thread wird in den blockierten Zustand überführt. 3. Der Thread wird in die Menge der wartenden Threads bezüglich des waits eingefügt 5. Am Ende der beiden Methoden wird jeweils die Methode notify aufgerufen. Auch diese Methode hat die Klasse BoundedBuffer von der Klasse Object geerbt. Die Methode notify hat folgende Eigenschaften: 1. Es wird zufällig ein Prozess aus der Menge der bezüglich wait in diesem Objekt blockiert wurden ausgewählt. 2. Er wird in in die Menge der auf einen Lock wartenden Threads eingefügt. Die Klasse Producer (Abbildung 3.21) ist für die Produktion der Speichereinträge verantwortlich. Es werden Objekte der Klasse NewItem in Abhängigkeit einer int Variablen angelegt. Diese werden dann durch den Aufruf der Methode enter item in den Speicher eingetragen. Die Klasse Consumer (Abbildung 3.22) ist das Gegenstück zu Consumer und funktioniert analog. Bleibt noch eine Klasse, die die Erzeuger Verbraucher Implementierung steuert: BufferServer (Abbildung 3.23). Es werden jeweils die Threads Producer und Consumer gestartet. Aufgabe 1. Implementieren Sie eine Klasse Semaphor in Java. Semaphor soll die Methoden up und down beinhalten. 2. Implementieren sie das Erzeuger Verbraucher Problem mit den im 1. Teil der Aufgabe implementierten Semaphoren. 3. Ändern Sie ihre Erzeuger Verbraucher Implementierung so, dass der wechselseitige Ausschluss statt durch einen binären Semaphor mutex, durch ihre Implementierung der Peterson Lösung realisiert wird. 5 Diese Menge ist eine unterschiedliche Menge zu der Menge der wartenden Threads, die auf einen Lock wartet.

15 public class BoundedBuffer { private static final int BUFFER_SIZE = 5; private int count, in, out; private Object[] buffer; public BoundedBuffer() { count = 0; in = 0; out = 0; buffer = new Object[BUFFER_SIZE]; public synchronized void enter_item(object item) { while (count == BUFFER_SIZE) { try { wait(); catch (InterruptedException e) { ++count; buffer[in] = item; in = (in + 1) % BUFFER_SIZE; notify(); public synchronized Object remove_item() { Object item; while (count == 0) { try { wait(); catch (InterruptedException e) { --count; item = buffer[out]; out = (out + 1) % BUFFER_SIZE; notify(); return item; Abbildung 3.20: Bounded Buffer

16 public class Producer extends Thread { private BoundedBuffer buffer; public Producer(BoundedBuffer b) { buffer = b; public void run () { NewItem n; int i = 0; while (true) { n = new NewItem(i); buffer.enter_item(n); System.out.println("Entered: " + n.getstring()); i++; Abbildung 3.21: Producer public class Consumer extends Thread { private BoundedBuffer buffer; public Consumer(BoundedBuffer b) { buffer = b; public void run () { NewItem n; int i = 0; while (true) { n = (NewItem)buffer.remove_item(); System.out.println("Removed: " + n.getstring()); Abbildung 3.22: Consumer Klassische Synkronisationsprobleme Zum Abschluss des Abschnitts über Prozesssynkronisation wollen wir noch ein klassisches Syncronisationsproblem darstellen.

17 public class BufferServer { public static void main (String[] args) { BoundedBuffer server = new BoundedBuffer(); Producer producerthread = new Producer(server); Consumer consumerthread = new Consumer(server); producerthread.start(); consumerthread.start(); Abbildung 3.23: Steuert die Erzeuger Verbraucher Implementierung Essende Philosophen Dieses Problem wurde von Dijkstra gestellt: Für fünf Philosophen besteht das Leben nur aus abwechselnden Phasen des Essens und des Denkens. Wenn ein Philosoph hungrig wird, versucht er in beliebiger Reihenfolge nacheinander sein linkes und sein rechtes Stäbchen aufzunehmen. Hat er erfolgreich beide Stäbchen aufgenommen, ist er eine Weile, legt dann die Stäbchen wieder ab und setzt das Denken fort. Übersetzt in die Welt der Prozesssynkronisation bildet jeder Philosoph einen Prozess, der nacheinander Abbildung 3.24: Essende Philosophen das linke bzw. das rechte Stäbchen aufnimmt. Angenommen alle Philosophen nehmen zunächst das linke Stäbchen auf. Dann kann keiner mehr sein rechtes Stäbchen aufnehmen. Wir haben einen Deadlock erreicht. Eine Idee dieses Problem zu lösen wäre, dass jeder Philosoph das linke Stäbchen wieder ablegt, wenn das rechte nicht mehr aufgenommen werden kann. Der Philosoph wartet dann eine bestimmte Zeit und versucht es erneut. Nun kann es passieren, dass alle Philosophen gleichzeitig starten. Dann ergibt sich ebenfalls keine Lösung, weil sie dann immer gleichzeitig Stäbchen aufnehmen und wieder hinlegen. Diesen Zustand nennt man Verhungern. Eine mögliche Lösung wäre die Wartezeit zufällig zu wählen. In der Regel wird das zur Lösung führen. Allerdings ist dies eine unsichere Lösung, die bei kritischen Steuerungen, wie Flugzeugen oder Atomkraftwerken sicher nicht angebracht ist. Eine sichere Lösung ist die Benutzung von Hilfsmitteln der Prozesssynkronisation. Wir geben nun eine Lösung mit Monitoren an. Das Array state repräsentiert den Zustand des jeweiligen Philosophen. Das Array besteht aus Bedingungsvaraiblen. Die zugehörigen Prozess werden in der Prozedur pickup blockiert, falls ein Nachbar eines

18 monitor dining-philosphers var state : array [0..4] of (thinking, hungry, eating); var self : array [0..4] of condition; procedure pickup(i : 0..4); state[i] := thinking; test(i); if state[i] <> eating then wait(self[i]) end; (* pickup *) procedure putdown(k : 1..4); state[i] := thinking; test(i+4 mod 5); test(i+1 mod 5); end; (* putdown *) procedure test(k : 0..4); if state[k+4 mod 5] <> eating and state[k] = hungry and state[k+1 mod 5] <> eating then state[k] := eating; signal(self[k]); end (* then *) end; (* test *) (* Monitor Initialisierung *) for i := 0 to 4 do state[i] := thinking; end (* monitor *) Abbildung 3.25: Lösung mit Monitoren für das essende Philosophen Problem hungrigen Philosophen gerade ist. Wenn nun ein Philosoph das Essen beendet (Prozedur putdown) wird überprüft, ob ein Nachbar hungrig ist (blockiert ist). Nach Möglichkeit wird dieser dann aufgeweckt in den essenden Zustand versetzt. Für weitere interessante klassische Syncronisationsprobleme sei auf die Literatur verwiesen [?,?].

Monitore. Klicken bearbeiten

Monitore. Klicken bearbeiten Sascha Kretzschmann Institut für Informatik Monitore Formatvorlage und deren Umsetzung des Untertitelmasters durch Klicken bearbeiten Inhalt 1. Monitore und Concurrent Pascal 1.1 Warum Monitore? 1.2 Monitordefinition

Mehr

Softwarelösungen: Versuch 4

Softwarelösungen: Versuch 4 Softwarelösungen: Versuch 4 Nichtstun in Schleife wird ersetzt durch zeitweilige Zurücknahme der Anforderung, um es anderen Prozessen zu erlauben, die Ressource zu belegen: /* Prozess 0 */ wiederhole flag[0]

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

Systeme 1. Kapitel 6. Nebenläufigkeit und wechselseitiger Ausschluss

Systeme 1. Kapitel 6. Nebenläufigkeit und wechselseitiger Ausschluss Systeme 1 Kapitel 6 Nebenläufigkeit und wechselseitiger Ausschluss Threads Die Adressräume verschiedener Prozesse sind getrennt und geschützt gegen den Zugriff anderer Prozesse. Threads sind leichtgewichtige

Mehr

Objektorientierte Programmierung

Objektorientierte Programmierung Objektorientierte Programmierung 1 Geschichte Dahl, Nygaard: Simula 67 (Algol 60 + Objektorientierung) Kay et al.: Smalltalk (erste rein-objektorientierte Sprache) Object Pascal, Objective C, C++ (wiederum

Mehr

Zählen von Objekten einer bestimmten Klasse

Zählen von Objekten einer bestimmten Klasse Zählen von Objekten einer bestimmten Klasse Ziel, Inhalt Zur Übung versuchen wir eine Klasse zu schreiben, mit der es möglich ist Objekte einer bestimmten Klasse zu zählen. Wir werden den ++ und den --

Mehr

Verteilte Systeme CS5001

Verteilte Systeme CS5001 Verteilte Systeme CS5001 Th. Letschert TH Mittelhessen Gießen University of Applied Sciences Client-Server-Anwendungen: Vom passiven (shared state) Monitor zum aktiven Monitor Monitor (Hoare, Brinch-Hansen,

Mehr

2A Basistechniken: Weitere Aufgaben

2A Basistechniken: Weitere Aufgaben 2A Basistechniken: Weitere Aufgaben 2A.3 Programmierung unter UNIX/Linux 1. Gegeben sind einige Ausschnitte von C-Programmen, die unter UNIX/Linux ausgeführt werden sollen. Beantworten Sie die zugehörigen

Mehr

Erweiterung der Aufgabe. Die Notenberechnung soll nicht nur für einen Schüler, sondern für bis zu 35 Schüler gehen:

Erweiterung der Aufgabe. Die Notenberechnung soll nicht nur für einen Schüler, sondern für bis zu 35 Schüler gehen: VBA Programmierung mit Excel Schleifen 1/6 Erweiterung der Aufgabe Die Notenberechnung soll nicht nur für einen Schüler, sondern für bis zu 35 Schüler gehen: Es müssen also 11 (B L) x 35 = 385 Zellen berücksichtigt

Mehr

Primzahlen und RSA-Verschlüsselung

Primzahlen und RSA-Verschlüsselung Primzahlen und RSA-Verschlüsselung Michael Fütterer und Jonathan Zachhuber 1 Einiges zu Primzahlen Ein paar Definitionen: Wir bezeichnen mit Z die Menge der positiven und negativen ganzen Zahlen, also

Mehr

Einführung in die Programmierung

Einführung in die Programmierung Technische Universität München WS 2003/2004 Institut für Informatik Prof. Dr. Christoph Zenger Testklausur Einführung in die Programmierung Probeklausur Java (Lösungsvorschlag) 1 Die Klasse ArrayList In

Mehr

#define N 5 // Anzahl der Philosophen. while (TRUE) { // Der Philosoph denkt

#define N 5 // Anzahl der Philosophen. while (TRUE) { // Der Philosoph denkt 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

Outlook. sysplus.ch outlook - mail-grundlagen Seite 1/8. Mail-Grundlagen. Posteingang

Outlook. sysplus.ch outlook - mail-grundlagen Seite 1/8. Mail-Grundlagen. Posteingang sysplus.ch outlook - mail-grundlagen Seite 1/8 Outlook Mail-Grundlagen Posteingang Es gibt verschiedene Möglichkeiten, um zum Posteingang zu gelangen. Man kann links im Outlook-Fenster auf die Schaltfläche

Mehr

5 DATEN. 5.1. Variablen. Variablen können beliebige Werte zugewiesen und im Gegensatz zu

5 DATEN. 5.1. Variablen. Variablen können beliebige Werte zugewiesen und im Gegensatz zu Daten Makro + VBA effektiv 5 DATEN 5.1. Variablen Variablen können beliebige Werte zugewiesen und im Gegensatz zu Konstanten jederzeit im Programm verändert werden. Als Variablen können beliebige Zeichenketten

Mehr

Lineargleichungssysteme: Additions-/ Subtraktionsverfahren

Lineargleichungssysteme: Additions-/ Subtraktionsverfahren Lineargleichungssysteme: Additions-/ Subtraktionsverfahren W. Kippels 22. Februar 2014 Inhaltsverzeichnis 1 Einleitung 2 2 Lineargleichungssysteme zweiten Grades 2 3 Lineargleichungssysteme höheren als

Mehr

Grundlagen der Theoretischen Informatik, SoSe 2008

Grundlagen der Theoretischen Informatik, SoSe 2008 1. Aufgabenblatt zur Vorlesung Grundlagen der Theoretischen Informatik, SoSe 2008 (Dr. Frank Hoffmann) Lösung von Manuel Jain und Benjamin Bortfeldt Aufgabe 2 Zustandsdiagramme (6 Punkte, wird korrigiert)

Mehr

Anleitung über den Umgang mit Schildern

Anleitung über den Umgang mit Schildern Anleitung über den Umgang mit Schildern -Vorwort -Wo bekommt man Schilder? -Wo und wie speichert man die Schilder? -Wie füge ich die Schilder in meinen Track ein? -Welche Bauteile kann man noch für Schilder

Mehr

Fachgebiet Informationssysteme Prof. Dr.-Ing. N. Fuhr. Programmierung Prof. Dr.-Ing. Nobert Fuhr. Übungsblatt Nr. 6

Fachgebiet Informationssysteme Prof. Dr.-Ing. N. Fuhr. Programmierung Prof. Dr.-Ing. Nobert Fuhr. Übungsblatt Nr. 6 Gudrun Fischer Sascha Kriewel programmierung@is.informatik.uni-duisburg.de Anmeldung zur Klausur! Übungsblatt Nr. 6 Um an der Klausur teilzunehmen, müssen sich Studierende der angewandten Informatik in

Mehr

1 topologisches Sortieren

1 topologisches Sortieren Wolfgang Hönig / Andreas Ecke WS 09/0 topologisches Sortieren. Überblick. Solange noch Knoten vorhanden: a) Suche Knoten v, zu dem keine Kante führt (Falls nicht vorhanden keine topologische Sortierung

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

Mediator 9 - Lernprogramm

Mediator 9 - Lernprogramm Mediator 9 - Lernprogramm Ein Lernprogramm mit Mediator erstellen Mediator 9 bietet viele Möglichkeiten, CBT-Module (Computer Based Training = Computerunterstütztes Lernen) zu erstellen, z. B. Drag & Drop

Mehr

Zwischenablage (Bilder, Texte,...)

Zwischenablage (Bilder, Texte,...) Zwischenablage was ist das? Informationen über. die Bedeutung der Windows-Zwischenablage Kopieren und Einfügen mit der Zwischenablage Vermeiden von Fehlern beim Arbeiten mit der Zwischenablage Bei diesen

Mehr

Übungen zu Einführung in die Informatik: Programmierung und Software-Entwicklung: Lösungsvorschlag

Übungen zu Einführung in die Informatik: Programmierung und Software-Entwicklung: Lösungsvorschlag Ludwig-Maximilians-Universität München WS 2015/16 Institut für Informatik Übungsblatt 9 Prof. Dr. R. Hennicker, A. Klarl Übungen zu Einführung in die Informatik: Programmierung und Software-Entwicklung:

Mehr

Über Arrays und verkettete Listen Listen in Delphi

Über Arrays und verkettete Listen Listen in Delphi Über Arrays und verkettete Listen Listen in Delphi Michael Puff mail@michael-puff.de 2010-03-26 Inhaltsverzeichnis Inhaltsverzeichnis 1 Einführung 3 2 Arrays 4 3 Einfach verkettete Listen 7 4 Doppelt verkettete

Mehr

Übungen 19.01.2012 Programmieren 1 Felix Rohrer. Übungen

Übungen 19.01.2012 Programmieren 1 Felix Rohrer. Übungen Übungen if / else / else if... 2... 2 Aufgabe 2:... 2 Aufgabe 3:... 2 Aufgabe 4:... 2 Aufgabe 5:... 2 Aufgabe 6:... 2 Aufgabe 7:... 3 Aufgabe 8:... 3 Aufgabe 9:... 3 Aufgabe 10:... 3 switch... 4... 4 Aufgabe

Mehr

Bitte verwenden Sie nur dokumentenechtes Schreibmaterial!

Bitte verwenden Sie nur dokumentenechtes Schreibmaterial! VO 182.711 Prüfung Betriebssysteme 8. November 2013 KNr. MNr. Zuname, Vorname Ges.)(100) 1.)(35) 2.)(20) 3.)(45) Zusatzblätter: Bitte verwenden Sie nur dokumentenechtes Schreibmaterial! 1 Synchronisation

Mehr

14.4.2016. Technische Hochschule Georg Agricola WORKSHOP TEIL 3. IKT (Informations- und Kommunikationstechnik) an einer MorseApp erklärt

14.4.2016. Technische Hochschule Georg Agricola WORKSHOP TEIL 3. IKT (Informations- und Kommunikationstechnik) an einer MorseApp erklärt 14.4.2016 Technische Hochschule Georg Agricola WORKSHOP TEIL 3 IKT (Informations- und Kommunikationstechnik) an einer MorseApp erklärt Inhaltsverzeichnis 1. Kurzfassung zur Projekterstellung... 2 2. Morse-Tabelle...

Mehr

Es kann maximal ein Prozess die Umladestelle benutzen.

Es kann maximal ein Prozess die Umladestelle benutzen. SoSe 0 Konzepte und Methoden der Systemsoftware Universität Paderborn Fachgebiet Rechnernetze Präsenzübung (Musterlösung) 0-06-0 bis 0-06-06 Aufgabe : Erzeuger/Verbraucher-Pattern Ein Getränkemarkt hat

Mehr

Grundlagen verteilter Systeme

Grundlagen verteilter Systeme Universität Augsburg Insitut für Informatik Prof. Dr. Bernhard Bauer Wolf Fischer Christian Saad Wintersemester 08/09 Übungsblatt 3 12.11.08 Grundlagen verteilter Systeme Lösungsvorschlag Aufgabe 1: a)

Mehr

Folge 18 - Vererbung

Folge 18 - Vererbung Workshop Folge 18 - Vererbung 18.1 Ein einfacher Fall der Vererbung Schritt 1 - Vorbereitungen Besorgen Sie sich - vielleicht aus einer der Übungen der Folge 17 - ein fertiges und lauffähiges Listenprojekt,

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

Speicher in der Cloud

Speicher in der Cloud Speicher in der Cloud Kostenbremse, Sicherheitsrisiko oder Basis für die unternehmensweite Kollaboration? von Cornelius Höchel-Winter 2013 ComConsult Research GmbH, Aachen 3 SYNCHRONISATION TEUFELSZEUG

Mehr

Enigmail Konfiguration

Enigmail Konfiguration Enigmail Konfiguration 11.06.2006 Steffen.Teubner@Arcor.de Enigmail ist in der Grundkonfiguration so eingestellt, dass alles funktioniert ohne weitere Einstellungen vornehmen zu müssen. Für alle, die es

Mehr

Java Kurs für Anfänger Einheit 4 Klassen und Objekte

Java Kurs für Anfänger Einheit 4 Klassen und Objekte Java Kurs für Anfänger Einheit 4 Klassen und Ludwig-Maximilians-Universität München (Institut für Informatik: Programmierung und Softwaretechnik von Prof.Wirsing) 13. Juni 2009 Inhaltsverzeichnis klasse

Mehr

Print2CAD 2017, 8th Generation. Netzwerkversionen

Print2CAD 2017, 8th Generation. Netzwerkversionen Installation der Netzwerkversion Kazmierczak Software Print2CAD 2017, 8th Generation Print2CAD 2017, 8th Generation Netzwerkversionen Einführung Installationshinweise Die Programme von Kazmierczak Software

Mehr

Menü Macro. WinIBW2-Macros unter Windows7? Macros aufnehmen

Menü Macro. WinIBW2-Macros unter Windows7? Macros aufnehmen Menü Macro WinIBW2-Macros unter Windows7?... 1 Macros aufnehmen... 1 Menübefehle und Schaltflächen in Macros verwenden... 4 Macros bearbeiten... 4 Macros löschen... 5 Macro-Dateien... 5 Macros importieren...

Mehr

Programmierkurs Java

Programmierkurs Java Programmierkurs Java Dr. Dietrich Boles Aufgaben zu UE16-Rekursion (Stand 09.12.2011) Aufgabe 1: Implementieren Sie in Java ein Programm, das solange einzelne Zeichen vom Terminal einliest, bis ein #-Zeichen

Mehr

Beweisbar sichere Verschlüsselung

Beweisbar sichere Verschlüsselung Beweisbar sichere Verschlüsselung ITS-Wahlpflichtvorlesung Dr. Bodo Möller Ruhr-Universität Bochum Horst-Görtz-Institut für IT-Sicherheit Lehrstuhl für Kommunikationssicherheit bmoeller@crypto.rub.de 6

Mehr

AutoCAD 2007 - Dienstprogramm zur Lizenzübertragung

AutoCAD 2007 - Dienstprogramm zur Lizenzübertragung AutoCAD 2007 - Dienstprogramm zur Lizenzübertragung Problem: Um AutoCAD abwechselnd auf mehreren Rechnern einsetzen zu können konnte man bis AutoCAD 2000 einfach den Dongle umstecken. Seit AutoCAD 2000i

Mehr

Binäre Bäume. 1. Allgemeines. 2. Funktionsweise. 2.1 Eintragen

Binäre Bäume. 1. Allgemeines. 2. Funktionsweise. 2.1 Eintragen Binäre Bäume 1. Allgemeines Binäre Bäume werden grundsätzlich verwendet, um Zahlen der Größe nach, oder Wörter dem Alphabet nach zu sortieren. Dem einfacheren Verständnis zu Liebe werde ich mich hier besonders

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

Programmierung 2. Übersetzer: Code-Erzeugung. Sebastian Hack. Klaas Boesche. Sommersemester 2012. hack@cs.uni-saarland.de. boesche@cs.uni-saarland.

Programmierung 2. Übersetzer: Code-Erzeugung. Sebastian Hack. Klaas Boesche. Sommersemester 2012. hack@cs.uni-saarland.de. boesche@cs.uni-saarland. 1 Programmierung 2 Übersetzer: Code-Erzeugung Sebastian Hack hack@cs.uni-saarland.de Klaas Boesche boesche@cs.uni-saarland.de Sommersemester 2012 Bytecodes Der Java Übersetzer erzeugt keine Maschinensprache

Mehr

ec@ros2-installer ecaros2 Installer procar informatik AG 1 Stand: FS 09/2012 Eschenweg 7 64331 Weiterstadt

ec@ros2-installer ecaros2 Installer procar informatik AG 1 Stand: FS 09/2012 Eschenweg 7 64331 Weiterstadt ecaros2 Installer procar informatik AG 1 Stand: FS 09/2012 Inhaltsverzeichnis 1 Download des ecaros2-installer...3 2 Aufruf des ecaros2-installer...3 2.1 Konsolen-Fenster (Windows)...3 2.2 Konsolen-Fenster

Mehr

Grundlagen der Programmierung Prof. H. Mössenböck. 14. Schrittweise Verfeinerung

Grundlagen der Programmierung Prof. H. Mössenböck. 14. Schrittweise Verfeinerung Grundlagen der Programmierung Prof. H. Mössenböck 14. Schrittweise Verfeinerung Entwurfsmethode für Algorithmen Wie kommt man von der Aufgabenstellung zum Programm? Beispiel geg.: Text aus Wörtern ges.:

Mehr

L10N-Manager 3. Netzwerktreffen der Hochschulübersetzer/i nnen Mannheim 10. Mai 2016

L10N-Manager 3. Netzwerktreffen der Hochschulübersetzer/i nnen Mannheim 10. Mai 2016 L10N-Manager 3. Netzwerktreffen der Hochschulübersetzer/i nnen Mannheim 10. Mai 2016 Referentin: Dr. Kelly Neudorfer Universität Hohenheim Was wir jetzt besprechen werden ist eine Frage, mit denen viele

Mehr

Wir arbeiten mit Zufallszahlen

Wir arbeiten mit Zufallszahlen Abb. 1: Bei Kartenspielen müssen zu Beginn die Karten zufällig ausgeteilt werden. Wir arbeiten mit Zufallszahlen Jedesmal wenn ein neues Patience-Spiel gestartet wird, muss das Computerprogramm die Karten

Mehr

Professionelle Seminare im Bereich MS-Office

Professionelle Seminare im Bereich MS-Office Der Name BEREICH.VERSCHIEBEN() ist etwas unglücklich gewählt. Man kann mit der Funktion Bereiche zwar verschieben, man kann Bereiche aber auch verkleinern oder vergrößern. Besser wäre es, die Funktion

Mehr

Arbeiten mit UMLed und Delphi

Arbeiten mit UMLed und Delphi Arbeiten mit UMLed und Delphi Diese Anleitung soll zeigen, wie man Klassen mit dem UML ( Unified Modeling Language ) Editor UMLed erstellt, in Delphi exportiert und dort so einbindet, dass diese (bis auf

Mehr

II. Grundlagen der Programmierung. 9. Datenstrukturen. Daten zusammenfassen. In Java (Forts.): In Java:

II. Grundlagen der Programmierung. 9. Datenstrukturen. Daten zusammenfassen. In Java (Forts.): In Java: Technische Informatik für Ingenieure (TIfI) WS 2005/2006, Vorlesung 9 II. Grundlagen der Programmierung Ekkart Kindler Funktionen und Prozeduren Datenstrukturen 9. Datenstrukturen Daten zusammenfassen

Mehr

1 Vom Problem zum Programm

1 Vom Problem zum Programm Hintergrundinformationen zur Vorlesung GRUNDLAGEN DER INFORMATIK I Studiengang Elektrotechnik WS 02/03 AG Betriebssysteme FB3 Kirsten Berkenkötter 1 Vom Problem zum Programm Aufgabenstellung analysieren

Mehr

Java: Vererbung. Teil 3: super() www.informatikzentrale.de

Java: Vererbung. Teil 3: super() www.informatikzentrale.de Java: Vererbung Teil 3: super() Konstruktor und Vererbung Kindklasse ruft SELBSTSTÄNDIG und IMMER zuerst den Konstruktor der Elternklasse auf! Konstruktor und Vererbung Kindklasse ruft SELBSTSTÄNDIG und

Mehr

Advoware mit VPN Zugriff lokaler Server / PC auf externe Datenbank

Advoware mit VPN Zugriff lokaler Server / PC auf externe Datenbank Advoware mit VPN Zugriff lokaler Server / PC auf externe Datenbank Die Entscheidung Advoware über VPN direkt auf dem lokalen PC / Netzwerk mit Zugriff auf die Datenbank des zentralen Servers am anderen

Mehr

Persönliche Zukunftsplanung mit Menschen, denen nicht zugetraut wird, dass sie für sich selbst sprechen können Von Susanne Göbel und Josef Ströbl

Persönliche Zukunftsplanung mit Menschen, denen nicht zugetraut wird, dass sie für sich selbst sprechen können Von Susanne Göbel und Josef Ströbl Persönliche Zukunftsplanung mit Menschen, denen nicht zugetraut Von Susanne Göbel und Josef Ströbl Die Ideen der Persönlichen Zukunftsplanung stammen aus Nordamerika. Dort werden Zukunftsplanungen schon

Mehr

5. Tutorium zu Programmieren

5. Tutorium zu Programmieren 5. Tutorium zu Programmieren Dennis Ewert Gruppe 6 Universität Karlsruhe Institut für Programmstrukturen und Datenorganisation (IPD) Lehrstuhl Programmierparadigmen WS 2008/2009 c 2008 by IPD Snelting

Mehr

ecaros2 - Accountmanager

ecaros2 - Accountmanager ecaros2 - Accountmanager procar informatik AG 1 Stand: FS 09/2012 Inhaltsverzeichnis 1 Aufruf des ecaros2-accountmanager...3 2 Bedienung Accountmanager...4 procar informatik AG 2 Stand: FS 09/2012 1 Aufruf

Mehr

U08 Entwurfsmuster (II)

U08 Entwurfsmuster (II) U08 Entwurfsmuster (II) Inhalt der Übung Diskussion und Implementierung von Entwurfsmustern Übungsaufgaben Aufgabe 1 (Queue) Gegeben ist das folgende Analysemodell einer Warteschlange (Queue): Eine Warteschlange

Mehr

1 Mathematische Grundlagen

1 Mathematische Grundlagen Mathematische Grundlagen - 1-1 Mathematische Grundlagen Der Begriff der Menge ist einer der grundlegenden Begriffe in der Mathematik. Mengen dienen dazu, Dinge oder Objekte zu einer Einheit zusammenzufassen.

Mehr

HANDBUCH PHOENIX II - DOKUMENTENVERWALTUNG

HANDBUCH PHOENIX II - DOKUMENTENVERWALTUNG it4sport GmbH HANDBUCH PHOENIX II - DOKUMENTENVERWALTUNG Stand 10.07.2014 Version 2.0 1. INHALTSVERZEICHNIS 2. Abbildungsverzeichnis... 3 3. Dokumentenumfang... 4 4. Dokumente anzeigen... 5 4.1 Dokumente

Mehr

Datenbanken Kapitel 2

Datenbanken Kapitel 2 Datenbanken Kapitel 2 1 Eine existierende Datenbank öffnen Eine Datenbank, die mit Microsoft Access erschaffen wurde, kann mit dem gleichen Programm auch wieder geladen werden: Die einfachste Methode ist,

Mehr

Software Engineering Klassendiagramme Assoziationen

Software Engineering Klassendiagramme Assoziationen Software Engineering Klassendiagramme Assoziationen Prof. Adrian A. Müller, PMP, PSM 1, CSM Fachbereich Informatik und Mikrosystemtechnik 1 Lesen von Multiplizitäten (1) Multiplizitäten werden folgendermaßen

Mehr

Wordpress: Blogbeiträge richtig löschen, archivieren und weiterleiten

Wordpress: Blogbeiträge richtig löschen, archivieren und weiterleiten Wordpress: Blogbeiträge richtig löschen, archivieren und weiterleiten Version 1.0 Wordpress: Blogbeiträge richtig löschen, archivieren und weiterleiten In unserer Anleitung zeigen wir Dir, wie Du Blogbeiträge

Mehr

Was ist Sozial-Raum-Orientierung?

Was ist Sozial-Raum-Orientierung? Was ist Sozial-Raum-Orientierung? Dr. Wolfgang Hinte Universität Duisburg-Essen Institut für Stadt-Entwicklung und Sozial-Raum-Orientierte Arbeit Das ist eine Zusammen-Fassung des Vortrages: Sozialräume

Mehr

S/W mit PhotoLine. Inhaltsverzeichnis. PhotoLine

S/W mit PhotoLine. Inhaltsverzeichnis. PhotoLine PhotoLine S/W mit PhotoLine Erstellt mit Version 16.11 Ich liebe Schwarzweiß-Bilder und schaue mir neidisch die Meisterwerke an, die andere Fotografen zustande bringen. Schon lange versuche ich, auch so

Mehr

I.1 Die Parrot Assemblersprache

I.1 Die Parrot Assemblersprache I.1 Die Parrot Assemblersprache Die virtuelle CPU Parrot ermöglicht die Verarbeitung der Parrot Assemblersprache (PASM). Zum Einstieg soll ein erstes Beispiel die Ausführung einer PASM-Datei zeigen. Legen

Mehr

Große Übung Praktische Informatik 1

Große Übung Praktische Informatik 1 Große Übung Praktische Informatik 1 2005-12-08 fuessler@informatik.uni-mannheim.de http://www.informatik.uni-mannheim.de/pi4/people/fuessler 1: Announcements / Orga Weihnachtsklausur zählt als Übungsblatt,

Mehr

Professionelle Seminare im Bereich MS-Office

Professionelle Seminare im Bereich MS-Office Serienbrief aus Outlook heraus Schritt 1 Zuerst sollten Sie die Kontakte einblenden, damit Ihnen der Seriendruck zur Verfügung steht. Schritt 2 Danach wählen Sie bitte Gerhard Grünholz 1 Schritt 3 Es öffnet

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 keine Pommes... Praktikum A 230 C 207 (Madeleine + Esma) F 112 F 113

Mehr

Diese Anleitung wurde erstellt von Niclas Lüchau und Daniel Scherer. Erste Anmeldung. Schritt 1: Anmeldung..2. Schritt 2: Passwort setzen 3

Diese Anleitung wurde erstellt von Niclas Lüchau und Daniel Scherer. Erste Anmeldung. Schritt 1: Anmeldung..2. Schritt 2: Passwort setzen 3 Diese Anleitung wurde erstellt von Niclas Lüchau und Daniel Scherer Inhalt Erste Anmeldung. Schritt 1: Anmeldung..2 Schritt 2: Passwort setzen 3 Schritt 3: Nachträgliches Ändern des Passworts..4 Schreiben

Mehr

Anton Ochsenkühn. amac BUCH VERLAG. Ecxel 2016. für Mac. amac-buch Verlag

Anton Ochsenkühn. amac BUCH VERLAG. Ecxel 2016. für Mac. amac-buch Verlag Anton Ochsenkühn amac BUCH VERLAG Ecxel 2016 für Mac amac-buch Verlag 2 Word-Dokumentenkatalog! Zudem können unterhalb von Neu noch Zuletzt verwendet eingeblendet werden. Damit hat der Anwender einen sehr

Mehr

4 Aufzählungen und Listen erstellen

4 Aufzählungen und Listen erstellen 4 4 Aufzählungen und Listen erstellen Beim Strukturieren von Dokumenten und Inhalten stellen Listen und Aufzählungen wichtige Werkzeuge dar. Mit ihnen lässt sich so ziemlich alles sortieren, was auf einer

Mehr

AGROPLUS Buchhaltung. Daten-Server und Sicherheitskopie. Version vom 21.10.2013b

AGROPLUS Buchhaltung. Daten-Server und Sicherheitskopie. Version vom 21.10.2013b AGROPLUS Buchhaltung Daten-Server und Sicherheitskopie Version vom 21.10.2013b 3a) Der Daten-Server Modus und der Tresor Der Daten-Server ist eine Betriebsart welche dem Nutzer eine grosse Flexibilität

Mehr

Dokumentation Schedulingverfahren

Dokumentation Schedulingverfahren Dokumentation Schedulingverfahren von Norbert Galuschek Gordian Maugg Alexander Hahn Rebekka Weissinger June 23, 2011 1 Contents 1 Aufgabe 3 2 Vorgehensweise 4 2.1 Warum Android.......................

Mehr

Kontakte Dorfstrasse 143 CH - 8802 Kilchberg Telefon 01 / 716 10 00 Telefax 01 / 716 10 05 info@hp-engineering.com www.hp-engineering.

Kontakte Dorfstrasse 143 CH - 8802 Kilchberg Telefon 01 / 716 10 00 Telefax 01 / 716 10 05 info@hp-engineering.com www.hp-engineering. Kontakte Kontakte Seite 1 Kontakte Seite 2 Inhaltsverzeichnis 1. ALLGEMEINE INFORMATIONEN ZU DEN KONTAKTEN 4 2. WICHTIGE INFORMATIONEN ZUR BEDIENUNG VON CUMULUS 4 3. STAMMDATEN FÜR DIE KONTAKTE 4 4. ARBEITEN

Mehr

Widerrufsbelehrung der Free-Linked GmbH. Stand: Juni 2014

Widerrufsbelehrung der Free-Linked GmbH. Stand: Juni 2014 Widerrufsbelehrung der Stand: Juni 2014 www.free-linked.de www.buddy-watcher.de Inhaltsverzeichnis Widerrufsbelehrung Verträge für die Lieferung von Waren... 3 Muster-Widerrufsformular... 5 2 Widerrufsbelehrung

Mehr

ONLINE-AKADEMIE. "Diplomierter NLP Anwender für Schule und Unterricht" Ziele

ONLINE-AKADEMIE. Diplomierter NLP Anwender für Schule und Unterricht Ziele ONLINE-AKADEMIE Ziele Wenn man von Menschen hört, die etwas Großartiges in ihrem Leben geleistet haben, erfahren wir oft, dass diese ihr Ziel über Jahre verfolgt haben oder diesen Wunsch schon bereits

Mehr

mysql - Clients MySQL - Abfragen eine serverbasierenden Datenbank

mysql - Clients MySQL - Abfragen eine serverbasierenden Datenbank mysql - Clients MySQL - Abfragen eine serverbasierenden Datenbank In den ersten beiden Abschnitten (rbanken1.pdf und rbanken2.pdf) haben wir uns mit am Ende mysql beschäftigt und kennengelernt, wie man

Mehr

Geld Verdienen im Internet leicht gemacht

Geld Verdienen im Internet leicht gemacht Geld Verdienen im Internet leicht gemacht Hallo, Sie haben sich dieses E-book wahrscheinlich herunter geladen, weil Sie gerne lernen würden wie sie im Internet Geld verdienen können, oder? Denn genau das

Mehr

AutoTexte und AutoKorrektur unter Outlook verwenden

AutoTexte und AutoKorrektur unter Outlook verwenden AutoTexte und AutoKorrektur unter Outlook verwenden Die Hilfsmittel "AutoKorrektur" und "AutoTexte", die schon unter Microsoft Word das Arbeiten erleichtern, sind natürlich auch unter Outlook verfügbar.

Mehr

Wie halte ich Ordnung auf meiner Festplatte?

Wie halte ich Ordnung auf meiner Festplatte? Wie halte ich Ordnung auf meiner Festplatte? Was hältst du von folgender Ordnung? Du hast zu Hause einen Schrank. Alles was dir im Wege ist, Zeitungen, Briefe, schmutzige Wäsche, Essensreste, Küchenabfälle,

Mehr

Informationsblatt Induktionsbeweis

Informationsblatt Induktionsbeweis Sommer 015 Informationsblatt Induktionsbeweis 31. März 015 Motivation Die vollständige Induktion ist ein wichtiges Beweisverfahren in der Informatik. Sie wird häufig dazu gebraucht, um mathematische Formeln

Mehr

Anleitung zur Erstellung von Serienbriefen (Word 2003) unter Berücksichtigung von Titeln (wie Dr., Dr. med. usw.)

Anleitung zur Erstellung von Serienbriefen (Word 2003) unter Berücksichtigung von Titeln (wie Dr., Dr. med. usw.) Seite 1/7 Anleitung zur Erstellung von Serienbriefen (Word 2003) unter Berücksichtigung von Titeln (wie Dr., Dr. med. usw.) Hier sehen Sie eine Anleitung wie man einen Serienbrief erstellt. Die Anleitung

Mehr

Wir machen neue Politik für Baden-Württemberg

Wir machen neue Politik für Baden-Württemberg Wir machen neue Politik für Baden-Württemberg Am 27. März 2011 haben die Menschen in Baden-Württemberg gewählt. Sie wollten eine andere Politik als vorher. Die Menschen haben die GRÜNEN und die SPD in

Mehr

Kulturelle Evolution 12

Kulturelle Evolution 12 3.3 Kulturelle Evolution Kulturelle Evolution Kulturelle Evolution 12 Seit die Menschen Erfindungen machen wie z.b. das Rad oder den Pflug, haben sie sich im Körperbau kaum mehr verändert. Dafür war einfach

Mehr

Erstellen der Barcode-Etiketten:

Erstellen der Barcode-Etiketten: Erstellen der Barcode-Etiketten: 1.) Zuerst muss die Schriftart Code-39-Logitogo installiert werden! Das ist eine einmalige Sache und muss nicht zu jeder Börse gemacht werden! Dazu speichert man zunächst

Mehr

Elternzeit Was ist das?

Elternzeit Was ist das? Elternzeit Was ist das? Wenn Eltern sich nach der Geburt ihres Kindes ausschließlich um ihr Kind kümmern möchten, können sie bei ihrem Arbeitgeber Elternzeit beantragen. Während der Elternzeit ruht das

Mehr

Abwesenheitsnotiz im Exchange Server 2010

Abwesenheitsnotiz im Exchange Server 2010 Abwesenheitsnotiz im Exchange Server 2010 1.) Richten Sie die Abwesenheitsnotiz in Outlook 2010 ein und definieren Sie, an welche Absender diese gesendet werden soll. Klicken Sie dazu auf Datei -> Informationen

Mehr

Mit dem sogenannten Seriendruck können Etiketten und Briefe mit einer Adressdatei (z. B. Excel) verknüpft werden.

Mit dem sogenannten Seriendruck können Etiketten und Briefe mit einer Adressdatei (z. B. Excel) verknüpft werden. WORD 2010 Etiketten drucken Mit dem sogenannten Seriendruck können Etiketten und Briefe mit einer Adressdatei (z. B. Excel) verknüpft werden. Diese Anwendung erfolgt über die Registerkarte Sendungen 1

Mehr

Qualität und Verlässlichkeit Das verstehen die Deutschen unter Geschäftsmoral!

Qualität und Verlässlichkeit Das verstehen die Deutschen unter Geschäftsmoral! Beitrag: 1:43 Minuten Anmoderationsvorschlag: Unseriöse Internetanbieter, falsch deklarierte Lebensmittel oder die jüngsten ADAC-Skandale. Solche Fälle mit einer doch eher fragwürdigen Geschäftsmoral gibt

Mehr

Alle Schlüssel-Karten (blaue Rückseite) werden den Schlüssel-Farben nach sortiert und in vier getrennte Stapel mit der Bildseite nach oben gelegt.

Alle Schlüssel-Karten (blaue Rückseite) werden den Schlüssel-Farben nach sortiert und in vier getrennte Stapel mit der Bildseite nach oben gelegt. Gentlemen", bitte zur Kasse! Ravensburger Spiele Nr. 01 264 0 Autoren: Wolfgang Kramer und Jürgen P. K. Grunau Grafik: Erhard Dietl Ein Gaunerspiel für 3-6 Gentlemen" ab 10 Jahren Inhalt: 35 Tresor-Karten

Mehr

50. Mathematik-Olympiade 2. Stufe (Regionalrunde) Klasse 11 13. 501322 Lösung 10 Punkte

50. Mathematik-Olympiade 2. Stufe (Regionalrunde) Klasse 11 13. 501322 Lösung 10 Punkte 50. Mathematik-Olympiade. Stufe (Regionalrunde) Klasse 3 Lösungen c 00 Aufgabenausschuss des Mathematik-Olympiaden e.v. www.mathematik-olympiaden.de. Alle Rechte vorbehalten. 503 Lösung 0 Punkte Es seien

Mehr

Ihr IT-Administrator oder unser Support wird Ihnen im Zweifelsfall gerne weiterhelfen.

Ihr IT-Administrator oder unser Support wird Ihnen im Zweifelsfall gerne weiterhelfen. Dieses Dokument beschreibt die nötigen Schritte für den Umstieg des von AMS.4 eingesetzten Firebird-Datenbankservers auf die Version 2.5. Beachten Sie dabei, dass diese Schritte nur bei einer Server-Installation

Mehr

C++ Grundlagen. ++ bedeutet Erweiterung zum Ansi C Standard. Hier wird eine Funktion eingeleitet

C++ Grundlagen. ++ bedeutet Erweiterung zum Ansi C Standard. Hier wird eine Funktion eingeleitet C++ Grundlagen ++ bedeutet Erweiterung zum Ansi C Standard Hier wird eine Funktion eingeleitet Aufbau: In dieser Datei stehen die Befehle, die gestartet werden, wenn das Programm gestartet wird Int main()

Mehr

Programme im Griff Was bringt Ihnen dieses Kapitel?

Programme im Griff Was bringt Ihnen dieses Kapitel? 3-8272-5838-3 Windows Me 2 Programme im Griff Was bringt Ihnen dieses Kapitel? Wenn Sie unter Windows arbeiten (z.b. einen Brief schreiben, etwas ausdrucken oder ein Fenster öffnen), steckt letztendlich

Mehr

Kurzanleitung. MEYTON Aufbau einer Internetverbindung. 1 Von 11

Kurzanleitung. MEYTON Aufbau einer Internetverbindung. 1 Von 11 Kurzanleitung MEYTON Aufbau einer Internetverbindung 1 Von 11 Inhaltsverzeichnis Installation eines Internetzugangs...3 Ist mein Router bereits im MEYTON Netzwerk?...3 Start des YAST Programms...4 Auswahl

Mehr

Einführung in die Programmierung Blockkurs Java

Einführung in die Programmierung Blockkurs Java Michael Bader 8. 12. April 2002 Freitag Inhaltsübersicht Exceptions und Errors Ausnahmebehandlung: try/catch/finally Threads Zugriffskontrolle bei gemeinsamen Variablen: synchronized, wait(), notify()

Mehr

Erstellen von x-y-diagrammen in OpenOffice.calc

Erstellen von x-y-diagrammen in OpenOffice.calc Erstellen von x-y-diagrammen in OpenOffice.calc In dieser kleinen Anleitung geht es nur darum, aus einer bestehenden Tabelle ein x-y-diagramm zu erzeugen. D.h. es müssen in der Tabelle mindestens zwei

Mehr

Flyer, Sharepics usw. mit LibreOffice oder OpenOffice erstellen

Flyer, Sharepics usw. mit LibreOffice oder OpenOffice erstellen Flyer, Sharepics usw. mit LibreOffice oder OpenOffice erstellen Wir wollen, dass ihr einfach für eure Ideen und Vorschläge werben könnt. Egal ob in ausgedruckten Flyern, oder in sozialen Netzwerken und

Mehr

Webalizer HOWTO. Stand: 18.06.2012

Webalizer HOWTO. Stand: 18.06.2012 Webalizer HOWTO Stand: 18.06.2012 Copyright 2003 by manitu. Alle Rechte vorbehalten. Alle verwendeten Bezeichnungen dienen lediglich der Kennzeichnung und können z.t. eingetragene Warenzeichen sein, ohne

Mehr

Anwendungsbeispiele Buchhaltung

Anwendungsbeispiele Buchhaltung Rechnungen erstellen mit Webling Webling ist ein Produkt der Firma: Inhaltsverzeichnis 1 Rechnungen erstellen mit Webling 1.1 Rechnung erstellen und ausdrucken 1.2 Rechnung mit Einzahlungsschein erstellen

Mehr

Stepperfocuser 2.0 mit Bootloader

Stepperfocuser 2.0 mit Bootloader Stepperfocuser 2.0 mit Bootloader Info Für den Stepperfocuser 2.0 gibt es einen Bootloader. Dieser ermöglicht es, die Firmware zu aktualisieren ohne dass man ein spezielles Programmiergerät benötigt. Die

Mehr