Institut für Informatik Arbeitsgruppe Softwaretechnik Warburger Str Paderborn. Java Real-Time. Seminarausarbeitung im Rahmen des Seminars

Größe: px
Ab Seite anzeigen:

Download "Institut für Informatik Arbeitsgruppe Softwaretechnik Warburger Str. 100 33098 Paderborn. Java Real-Time. Seminarausarbeitung im Rahmen des Seminars"

Transkript

1 Institut für Informatik Arbeitsgruppe Softwaretechnik Warburger Str Paderborn Java Real-Time Seminarausarbeitung im Rahmen des Seminars Trends in der Softwaretechnik für Echtzeitsysteme Sommersemester 2003 von Stefan Scharberth Bodenfelder Str Uslar betreut von Dr. Holger Giese Paderborn, September 2003

2 Inhaltsverzeichnis 1 Einleitung Echtzeitsysteme Vorteile von Java Echtzeitfähigkeit von Java Realtime Specification for Java Aufbau eines Java RT Systems Speichermanagement HeapMemory ImmortalMemory Scoped Memory Mögliche Referenzen Threads Java Thread RealtimeThread NoHeapRealtimeThread Periodisch / Aperiodisch AysncEventHandler BoundAsyncEventHandler Scheduling PriorityScheduler ReleaseParameter Thread Synchronisation Priority Inversion Wait-Free-Queues WaitFreeWriteQueue WaitFreeReadQueue WaitFreeDeQueue Allgemeine Methoden Beispiel SteamBoiler Umsetzung mit Java RT Zusammenfassung und Fazit... 21

3 1 Einleitung 3 1 Einleitung Der Markt für Echtzeitsysteme (engl. realtime system) ist in den letzten Jahren stark gewachsen. Echtzeitsysteme werden in vielen Bereichen eingesetzt, von der Raumfahrt über Telekommunikation bis hin zu Haushaltsgeräten sind sie nicht mehr wegzudenken. Durch den ständig wachsenden Kostendruck, werden Firmen dazu gezwungen, Echtzeitsysteme immer effizienter zu entwickelt und schneller auf den Markt zu bringen. Aus diesen Gründen ist die Sprache Java sehr interessant für den Echtzeitbereich geworden, da es mit ihr möglich ist, schnell komplexe Software zu entwickeln. Bevor diese Arbeit jedoch näher auf Java und ihre Vorteile eingeht, werden erst einmal Echtzeitsysteme eingeführt. 1.1 Echtzeitsysteme Echtzeitsysteme werden dadurch charakterisiert, dass sie neben der Forderung ein korrektes Ergebnis zu liefern, Zeitrestriktionen einhalten müssen. Dies bedeutet, dass alle Aufgaben, die ein Echtzeitsystem erfüllen muss, Zeitvorgaben (engl. Deadline) haben. Es werden zwei Arten von Echtzeitsystemen unterschieden, harte und weiche. Unter harten Echtzeitsystemen werden solche Systeme verstanden, bei denen die Zeitvorgaben zu 100 % einzuhalten sind. Bei nicht einhalten ist das Ergebnis als falsch zu interpretieren, selbst wenn es korrekt ist. Harte Echtzeitsysteme werden dort eingesetzt, wo das Verfehlen von Zeitanforderungen katastrophale Folgen haben kann, z.b. Kernkraftwerk, Robotersteuerung oder Airbagsystem bei einem Auto. Bei weichen Echtzeitsystemen hingegen werden einzelne Verstöße gegen die Zeitvorgaben toleriert. Dies bedeutet, dass die Güte des Ergebnisses abgestuft wird, wenn es die Zeitanforderungen überschreitet. Weiche Echtzeitsysteme werden oft in Multimediabereich eingesetzt, z.b. bei Video- oder Audioübertragungen, wo eine kurze Verzögerung akzeptabel ist. Schaden Deadline Schaden Deadline Zeit harte Echtzeit weiche Echtzeit Abbildung 1-1: harte und weiche Echtzeit Zeit 1.2 Vorteile von Java Es existieren bereits viele Möglichkeiten Echtzeitsysteme zu entwickeln. Warum ist es also interessant Java Real-Time als Programmiersprache einzusetzen und nicht eine andere, bewährtere Sprache zu nutzen? In der Einleitung wurde bereits erwähnt, dass in den letzten Jahren ein immer größerer Kostendruck, bei der Entwicklung von Echtzeitsystemen, entstanden ist. Dies führt dazu, dass neben dem Kriterium sicher funktionierende Software herzustellen, immer mehr eine günstige und schnelle Entwicklung in den Vordergrund rückt. Genau hier hat Java seine Vorteile. Jeder, der schon einmal mit Java gearbeitet hat, kennt den Slogan write once run everywhere, der das bekannteste Feature von Java wiedergibt, die Portabilität. Portabilität bedeutet, dass der Java Bytecode ohne Veränderungen auf jeder Plattform ausführbar ist, falls eine Java Virtual Machine für diese Plattform existiert. Dies ist ein entscheidender Vorteil bei der Entwicklung, da jetzt nur noch eine Anwendung für alle

4 1 Einleitung 4 Plattformen programmiert werden muss. Auch die Wiederverwendung wird durch die Portabilität entscheidend verbessert, da man auch Klassen aus Projekten wieder verwenden kann, die für andere Plattformen entwickelt wurden. Weitere Vorteile von Java sind unter anderem Objektorientierung, Robustheit, Sicherheit, Dynamik und Verteilung. Um diese Vorteile zu vertiefen sei auf weiterführende Literatur [JavaNut97] verwiesen. 1.3 Echtzeitfähigkeit von Java Java hat sich in den letzten Jahren auf Grund der oben genannten Vorteile weit verbreitet und auch im Umfeld von Echtzeitanwendungen wurden Entwickler darauf aufmerksam. In der ursprünglichen Form ist Java für Echtzeitsysteme wenig geeignet. Das hat den Grund, dass es nie für den Einsatz in zeitkritische Anwendungen konzipiert war. Die folgenden Punkte stellen die Probleme von Java in Echtzeitsystemen dar. Speicherverwaltung: In Java gibt es nur einen Speicherbereich, den Heap Memmory in dem alle Objekte abgespeichert werden. Es gibt keine Möglichkeit die Lebensdauer von Objekten zu bestimmen, da der Garbarge Collector (GC) für das Löschen von nicht mehr referenzierten Objekten zuständig ist. Nichtdeterministisches Verhalten: Der Garbage Collector schaltet sich in undefinierten Zeitabständen ein und löscht nicht mehr referenzierte Objekte. Da der GC die höchste Ausführungspriorität in Java besitzt, verdrängt er den gerade ausführenden Thread auf unvorhersagbare Zeit. Dadurch ist die genaue Laufzeit der einzelnen Thread nicht bestimmbar. Scheduling: Der Java Scheduler genügt den Echtzeitanforderungen nicht. In Echtzeitsystemen müssen Startzeitpunkt, Deadline und Periode definiert werden können. In Java existiert nur die Möglichkeit einem Thread eine Priorität zu zuweisen oder ihn mit Thread.sleep(millSec) zu unterbrechen. Um Java trotz dieser Probleme in Echtzeit Systemen einzusetzen zu können, musste die Sprache erweitert werden. Diese Erweiterungen wurden in der Realtime Specification for Java [RTSJ00] zusammengefasst. 1.4 Realtime Specification for Java Bevor die Realtime Specification for Java entwickelt wurde, wurden Richtlinien für diese Spezifikation festgelegt. Zu diesen Richtlinien gehören: Abwärtskompatibel, d.h. es sollen Standard Java Programme uneingeschränkt lauffähig sein. Portabilität soll weiterhin unterstützt werden. Eine deterministische Ausführung von Java Code muss möglich sein. Es soll keine syntaktische Erweiterung geben, wie z.b. neue Schlüsselwörter. RTSJ soll den aktuellen Stand der Echtzeitentwicklung abdecken und für spätere Erweiterungen offen sein. In Realtime Specification for Java werden die die Erweiterungen beschrieben, die vorgenommen wurden, um Java echtzeitfähig zu machen. Für diese Echtzeiterweiterungen musste eine Ergänzungen der bestehenden API (Application Programming Interface) vorgenommen werden. Die neue API wird dem Programmierer im dem Package javax.realtime.* zur Verfügung gestellt und beinhaltet unter anderen echtzeitfähige Threads und neue Speicherbereiche. Die wichtigsten Erweiterungen, die das Package zur Verfügung stellt, werden in den Kapiteln Speichermanagement, Threads, Scheduling und Thread

5 1 Einleitung 5 Synchronisation vorgestellt. Um diese Erweiterungen nutzen zu können, wird ein echtzeitfähiges System benötigt. Der Aufbau eines solchen Systems wird im folgenden Kapitel, Aufbau eines Java RT Systems, vorgestellt. 1.5 Aufbau eines Java RT Systems Der Aufbau eines Java Echtzeitsystems besteht aus den drei Schichten Echtzeitbetriebsystem (Realtime Operation System, RTOS), Echtzeit Java Virtual Machine (TJVM 1 ) und Java Sourecode bzw. Java Libraries. Die unterste Schicht bildet das Echtzeitbetriebsystem. Es dient als Schnittstelle zwischen der Hardware und der TJVM. Weiterhin stellt das RTOS einen Scheduler zur Verfügung welches den entscheidenden Unterschied zu einen nicht echtzeitfähigen Betriebsystem (OS) ausmacht. In der mittleren Schicht ist die TJVM, die als Laufzeitumgebung für das Java Echtzeitprogramm dient. Die Unterschiede zu einer normalen JVM bestehen darin, dass die TJVM die Echtzeiterweiterungen, die im Package javax.realtime.* zusammengefasst sind, unterstützt. In der obersten Schicht befindet sich der Java Sourcecode und die zur Verfügung gestellten Java Libraries. Bei einem Echtzeitsystem enthalten die Libraries zusätzlich das Package javax.realtime.*, welches bei Java RT einfach importiert werden kann. Damit stehen dann alle Echtzeit spezifischen Erweiterungen für Java zur Verfügung. Java Application Java Libraries Java Application Java + JavaRealTime Libraries JVM TJVM OS RTOS Abbildung 1-2: Java und Java RT Schichten In den folgenden Kapitel dieser Arbeit wird eine Übersicht über die wichtigsten Echtzeit Erweiterungen von Java RT gegeben. Das Kapitel Speichermanagement zeigt die Erweiterung des Speicherbereiches. Es wird vorgestellt wie die Lebensdauer von Objekten vom Garbage Collector entkoppelt werden kann. Im Kapitel Threads wird gezeigt, wie Threads eine höhere Priorität wie der Garbage Collector erhalten können, damit sie ein deterministisches Verhalten bekommen. Außerdem geht dieses Kapitel darauf ein, wie den Threads Zeitvorgaben zugeteilt werden können. Das Kapitel Scheduling werden die Scheduling Parameter der Threads erläutert und der Standard Java RT Scheduler, der PriorityScheduler, wird vorgestellt. Da in Echtzeitsystemen mehrere Threads existierten können, müssen diese untereinander synchronisiert werden. Das Kapitel Thread Synchronisation beschriebt wie Echtzeit Threads untereinander und Echtzeit Threads mit normalen Java Threads synchronisiert werden können. Zum Schluss dieser Arbeit wird im Kapitel SteamBoiler Beispiel eine Beschreibung 1 Timesys Java Virtual Machine. Timesys ist das Unternehmen welches die erste Referenz Implementation von RTSJ auf den Markt gebracht hat. [TS]

6 1 Einleitung 6 eines Echtzeitsystems und dessen Umsetzung in Java RT gegeben. Zu diesem Beispiel existiert eine Implementation, die im Anhang zu finden ist. 2 Speichermanagement in Java RT In Java werden alle Objekte im Heap Speicher angelegt, der vom GC verwaltet wird. Da der Heap deswegen nicht echtzeitfähig ist, wurden in der RTSJ zusätzlich neben dem Heap Memory zwei weitere Speicherbereiche definiert, Immortal Memory und Scope Memory. 2.1 Heap Memory Jede echtzeit JVM und jede normale JVM hat genau eine HeapMemory Instanz. Der Vorteil des Heapspeichers besteht darin, dass der Programmierer nicht selbst den Speicher verwalten muss, da diese Arbeit der GC übernimmt. Objekte können mit dem Aufruf new Class() angelegt werden. Auf alles was darüber hinaus geht, hat der Programmierer keinen Einfluss mehr. Da der GC den Heap Memory verwaltet, hat er von allen Threads, die diesen Speicherbereich benutzen, die höchste Priorität. Dies führt dazu, dass er alle Thread für unbestimmte Zeit verdrängen kann, die auf dem Heap arbeiten. Dadurch ist eine Ausführung von harten Echtzeitanwendungen auf dem Heap Memory nicht möglich. Lediglich für weiche Echtzeitanwendungen, wo eine Verzögerung durch den GC toleriert werden kann, ist dieser Speicherbereich geeignet. Wenn ein Java RT Anwendung gestartet wird, befindet sie sich zunächst im Heap Memory. Das bedeutet, wird ein neues Objekt angelegt, so liegt dieses im Heap. Wurde der Heap Memory durch deinen Speicherwechsel verlassen ist es weiterhin möglich darin Objekte anzulegen oder java.lang.runable auszuführen, wie das folgende Beispiel zeigt. HeapMemory hm = HeapMemory.instance(); //Referenz auf Heap Memory holen hm.enter(runable); // ein Runable im Heap ausführen, Threads Object obj = hm.newinstance(class); //ein Objekt im Heap anlegen 2.2 Immortal Memory Wie auch beim Heap Memory existiert in einer echtzeit JVM nur eine ImmortalMemory Instanz. Der Unterschied zu dem Heap Memory besteht darin, dass der GC keinen Zugriff auf diesen Speicherbereich hat. Hier angelegt Objekte existieren bis zum Ende der Anwendung. Es gibt keine Möglichkeit vor Ende der Applikation das Objekt aus dem Speicher zu entfernen. Aus diesem Grund sollten man hier nur Objekte angelegen, die während der gesamten Anwendung gebraucht werden. Da der GC auf diesen Speicherbereich keinen Zugriff hat, ist er für harte Echtzeitanwendungen geeignet. Hier angelegte Objekte dürfen auch auf Objekte im Heap Memory oder auf andere Objekte im Immortal Memory referenzieren. Im Heap angelegte Objekte ist es ebenfalls gestattet auf Immortal Objekte zu verweisen. Die Ausführung von java.lang.runable Klasse und das Anlegen eines Objektes im Immortal Memory, falls sich der aktuelle Thread in einem anderen Speicherberich befindet, ist analog zum Heap Memory. //Referenz auf Immortal Memory holen ImmortalMemory im = ImmortalMemory.instance(); im.enter(runable); // ein Runable im Immortal ausführen Object obj = im.newinstance(class); // ein Objekt im Immortal anlegen

7 3 Threads Scoped Memory Anderes als bei Immortal und Heap können vom Scoped Memory mehrere Instanzen in einer echtzeit JVM existieren. Der GC bereinigt den Scope nicht automatisch, daher ist er für harte Echtzeitanwendungen verwendbar. Ein Objekt im Scoped Memory hat aber dennoch eine beschränke Lebenszeit. Jeder Scoped Memory hat einen Referenzzähler, der angibt wie viele Threads Zugriff auf ihn haben. Hat der Zähler den Wert Null, so werden alle Objekte, die sich in diesem Scoped Memory befinden gelöscht. Es besteht keine Möglichkeit einzelne Objekte zulöschen, nur der komplette Scope kann gelöscht werden. In einem Scope können weitere Scopes angelegt werden, diese werden dann als Children und der Erzeuger als Parent bezeichnet. Es ist möglich, dass ein Scope beliebig viele Children hat, aber er besitzt einen eindeutigen Parent Scope. Diese Verschachtelung von Scope Bereichen wird auf einen Stack abgebildet wie die Abbildung 2-1 zeigt. T1 A T2 A A Parent B D B D C E C Abbildung 2-1: Scope Stack E Child Thread T1 befindet sich im Scope C, der B als Parent hat. Thread T2 befindet sich im Scope E, der D als Parent hat. Die beiden Scope Bereiche B und D haben einen gemeinsamen Parent Scoped A. Auch A hat einen Parent Scope, den so genannten Primordial-Scope, der den Heap und Immortal repräsentiert und gleichzeitig das unterste Element im Stack darstellt. Referenzen auf Objekte eines Scope Bereichs sind nur aus dem gleichen Scope oder aus einen seiner Child Scopes möglich. Das bedeutet das Thread T1 Referenzen auf Objekte im Bereich C, B, A, Heap und Immortal haben kann, aber nicht auf Objekte aus D und E. Analog für Thread T2, er darf Referenzen auf die Scopes E, D, A, Heap und Immortal haben, aber nicht auf B und C. Falls ein Thread T3 im Scope B existiert, kann er auf Objekte in B, A, Heap und Immortal referenzieren aber nicht auf C, da C ein Child Scope von B ist somit nicht referenziert werden darf. Diese Einschränkungen haben den Grund, dass eine Referenz nie länger existieren darf als das Objekt auf welches referenziert wird. Da im Scope Stack immer nur der oberste Scope gelöscht werden kann, dürfen aus einem Scope alle Objekte referenziert werden die in Scopes darunter liegen, da diese mindestens genau so lange existieren wie die Referenz. Würde Java RT das Referenzieren des darüber liegenden Scopes erlauben, so kann es passieren, dass eine Referenz auf ein Objekt zeigt welches nicht mehr existiert. Dies würde zu einem Fehler führen und ist deswegen verboten. Zugriff auf einen Scopebereich haben damit alle Thread die in dem selben Scope oder in einem darüber liegenden Scope laufen. Existieren keine Thread mehr in diesen Scopes, so ist der Referenzzähler auf Null und alle Objekte im Scope werden gelöscht. Den Zugriff auf einen darunter liegenden Scope zeigt das folgende Beispiel:

8 3 Threads 8 // die aktuelle Stack tiefe int depth = RealtimeThread.getMemoryAreaStackDepth(); // hole den eine Referenz auf den Parent Scoped MemoryArea mem = RealtimeThread.getOuterMemoryArea(depth - 1); Object obj = mem.newinstance(class); // ein Objekt im ParentScope anlegen Vor der Benutzung eines Scoped Memories, muss er erst einmal angelegt werden, dass geschieht durch eine Objekt Erzeugung der Klasse LTMemory oder VTMemory. LTMemory mem = new LTMemory( 1024 * 16, 1024 * 16); Dieser Aufruf legt einen neuen Scoped Memory mit der Größe von 16 Kilobyte an wobei der erste Parameter die initiale Größe und der zweite Parameter die maximale Größe angibt. Wie schon erwähnt existieren zwei Arten von Scope Memories LTMemory (linear time memory) und VTMemory (variable time memory). Der Unterschied zwischen den beiden Speicherarten ist der Algorithmus der den freien Speicher verwaltet. Der LTMemory garantiert eine lineare Zeit bei der Zuordnung eines neuen Objektes zu dem noch freien Speicher. Die Zeit ist dabei abhängig von der Größe des neuen Objektes. Beim VTMemory kann der Programmierer einen eigenen Algorithmus verwenden, um den Speicher zu verwalten, näheres dazu [Dib02]. Da alle Objekte in einem Scope Memory gelöscht werden, wenn sich kein Thread mehr in ihm befindet, bietet er somit eine Möglichkeit dynamische Datenstrukturen in harter Echtzeit zu verwenden. Das folgende Beispiel ist aus dem [Dib02] entnommen und zeigt die Run Methode eines Threads, die bei jedem Schleifendurchlauf eine Runnable Klasse in einem Scoped Memory ausführt. Nach jeder Ausführung wird der Scope Bereich wieder verlassen und somit werden alle Objekte in ihm gelöscht. Beim nächsten Schleifedurchlauf steht somit wieder ein leerer Scope zur Verfügung. public void run() { LTMemory mem=new LTMemory(1024*16, 1024*16) //Scoped Memory anlegen while (true) { mem.enter (java.lang.runnable); // Runnable im Scope ausführen } } 2.4 Mögliche Referenzierungen zwischen den Speicherbereichen Wie schon bei den einzelnen Speicherbereichen kurz erwähnt, besteht die Möglichkeit, dass Objekte aus anderen Speicherbereichen referenziert werden können. Ein Objekt das in einem Scope Memory liegt kann beispielsweise eine Referenz auf ein Objekt im Immortal Memory besitzen, aber ein Objekt im Immortal Memory darf keine Referenz auf ein Objekt in einem Scope Memory halten. Der Grund für diese eingeschränkten Referenzierungen ist, dass so keine Referenzen länger existieren können als die Objekte auf die sie referenzieren. Die nachstehende Tabelle gibt einen Überblick über alle Referenzen die in RTSJ erlaubt sind.

9 3 Threads 9 Referenz zum Heap Referenz zum Referenz zum Immortal Scope Heap Ja Ja Nein Immortal Ja Ja Nein Scope Ja Ja eingeschränkt 2 Abbildung 2-2: mögliche Speicherreferenzen 3 Threads Um das Problem zulösen, dass Threads vom Garbage Collector verdrängt werden können, wurde die Java RT API um zwei neue Threads erweitert. Neben dem normalen Java Thread gibt es in Java RT noch zwei weitere Threads, die für Echtzeitanwendungen geeignet sind. Die beiden neuen Threads, RealtimeThread und NoHeapRealtimeThread, erben vom normalen Java Thread und haben spezifische Echtzeit Erweiterungen. In folgenden Kapitel werden alle drei Threads mit ihren Eigenschaften und ihren Anwendungsbereichen vorgestellt. Thread RealtimeThread NoHeapRealtimeThread Abbildung 3-1: Thread Hierarchie 3.1 Java Thread Für nicht zeitkritische Aufgaben ist es weiterhin möglich einen normalen Java Thread zu verwenden. Dieser hat immer eine niedrigere Priorität als ein Echtzeit Thread und bekommt daher nur Ausführungszeit zugewiesen, wenn alle Echtzeit Threads abgearbeitet sind. 2 Eingeschränkt bedeutet, Referenzen auf den gleichen oder im Stack darunter befindliche Scopes sind möglich.

10 3 Threads 10 Priority NoHeap Realtime Thread Realtime Thread Thread Garbarge Collector Realtime No Realtime Abbildung 3-2: Thread Prioritäten 3.2 RealtimeThread Ein RealtimeThread eignet sich nur für weiche Echtzeitanwendungen, da er eine niedrigere Priorität als der GC hat und jederzeit durch ihn unterbrochen werden kann. Der Vorteil von der niedrigeren Priorität ist, dass er den Heap Speicher weiterhin benutzen kann, was nicht möglich wäre wenn er eine höhere Priorität als der GC hätte. Wie schon im Kapitel Speichermanagement erwähnt, hat der Heap Memory den Vorteil, dass der GC die gesamte Verwaltung dieses Speichers übernimmt und dem Entwickler somit die Arbeit erleichtert. Die wichtigsten Unterschiede zu einem normalen Java Thread sind, dass er einen anderer Prioritätsbereich hat und das ihm Zeitrestriktionen vorgegeben werden können. Während ein Thread eine Priorität von 1 bis 10 besitzt, hat ein Realtime Thread eine Priorität über 11. Diese wird beim Erzeugen des Threads mit dem Scheduling Parameter gesetzt. Die Zeitrestriktionen werden durch den Release Parameter dem Thread übergeben. Der Parameter beinhaltet eine Startzeit, eine Periode, eine Deadline, eine maximale Ausführungszeit, ein OverRunHandler und ein MissHandler. Auf die Bedeutung der einzelnen Release Parameter wird im Kapitel Scheduling genau eingegangen. Zusätzlich zu einem normalen Thread bietet ein RealtimeThread die Möglichkeit an, dem Konstruktor den Speicherbereich (engl. memoryarea) zu übergeben in dem der Thread gestartet werden soll. Es können Instanzen von allen drei Speicherbereichen, Heap, Immortal und Scope, übergeben werden. So kann der neue Thread in einen anderen Speicherbereich wie der aktuelle Thread erzeugt werden. Ein weiterer Parameter, der Speicherparameter (engl. memoryparameter), spezifiziert die Speicherbeschränkungen. Über diesen Parameter kann eine maximale Grösse des ImmortalMemory beziehungsweise des HeapMemory angegeben werden, die der Thread benutzen darf. Wird dieser Parameter nicht gesetzt, so darf der Thread beliebig viel Speicher verwenden. Bei der Thread Erzeugung kann der Thread einer Gruppe zugeteilt werden. Dies geschieht mit dem ProcessingGroupParameter. Der ProcessingGroupParameter besteht, wie auch der ReleaseParameter, aus einer Startzeit, einer Periode, einer Deadline, einer maximalen Ausführungszeit, einem OverRunHandler und einem MissHandler. Soll ein Thread einer Gruppe zugeteilt werden, so wird dem Konstruktor des Thread, die Referenz auf das ProcessingGroupParameter Objekt übergeben. Alle Threads, die das gleiche ProcessingGroupParameter Objekt bekommenhaben, befinden sich in der selben Gruppe. Ein Vorteil der Gruppeneinteilung ist beispielsweise, dass mehrere Threads eine gemeinsame

11 3 Threads 11 maximale Ausführungszeit haben. Dies bedeutete, steht der Gruppe 200 Millisekunden Ausführungszeit zur Verfügung und verbraucht der erste Thread davon 80 Millisekunden, so haben die restlichen Threads dieser Gruppe noch 120 Millisekunden zur Verfügung. Im folgenden Beispiel wird die Erzeugung eines Realtime Thread dargestellt. Die Priorität und die Release Parameter wurden zur Vollständigkeit in diesem Beispiel mit aufgenommen. Eine ausführliche Beschreibung dieser Parameter folgt im Kapitel Scheduling. //Priorität setzen PriorityParameters priority = new PriorityParameters (50); //Release Parameter RelativeTime start = new RelativeTime (200, 0); RelativeTime period = new RelativeTime (500, 0); RelativeTime deadline = new RelativeTime (300, 0); RelativeTime cost = new RelativeTime (100, 0); //maximale Ausführungszeit MyMissHandler mmh = new MyMissHandler(); MyOverrunHandler moh = new MyOverrunHandler(); PeriodicParameters periodic = new PeriodicParameters (start, period, cost, deadline, mmh, moh); //Einen neuen Scope Speicherbereich mit der Größe 1 MB anlegen. LTMemory memoryarea = new LTMemory (1024 * 1024, 1024 * 1024); //Ein ProcessingGroupParameter Objekt erzeugen RelativeTime groupstart = new RelativeTime (200, 0); RelativeTime groupperiod = new RelativeTime (500, 0); RelativeTime groupdeadline = new RelativeTime (300, 0); RelativeTime groupcost = new RelativeTime (100, 0); MyMissHandler groupmmh = new MyMissHandler(); MyOverrunHandler groupmoh = new MyOverrunHandler(); ProcessingGroupParameter processinggroupparameter = new ProcessingGroupParameter ( groupstart, groupperiod, groupcost, groupdeadline, groupmmh, groupmoh); //Speicherbeschränkungen festlegen // kein Immortal Speicher, keine Speicherbeschränkung bei Heap MemoryParamters memoryparamters = new MemoryParamters( MemoryParamters.NO_MAX, //Heap 0); //Immortal //Thread erzeugen Realtimethread rt = new RealtimeThread( priority, // Priorität setzen periodic, // Zeitrestriktionen memoryparameters, // Speicherbeschränkungen memoryarea, // Speicherbereich processinggroupparameter, //Gruppenzuteilung java.lang.runnable); 3.3 NoHeapRealtimeThread Im Gegensatz zum RealtimeThread ist der NoHeapRealtimeThread für harte Echtzeitanwendungen geeignet. Er hat eine höhere Priorität als der GC und kann daher nicht von ihm verdrängt werden. Wegen der höheren Priorität kann er aber keine Objekte mehr auf dem Heap referenzieren. Genau wie der RealtimeThread hat er eine höhere Priorität als 11, aber der Entwickler ist selbst dafür verantwortlich dass alle NoHeapRealtimeThreads eine höhere Priorität haben als RealtimeThreads. Es darf nicht vorkommen, dass ein

12 3 Threads 12 NoHeapRealtimeThread eine Priorität von 50 hat und ein RealtimeThread eine Priorität von 60, da sonst der NoHeapRealtimeThread auch von dem GC verdrängt werden könnte. Außer der verschiedenen Priorität und dem Zugriff auf den Heap Memory sind die beiden Echtzeit Threads identisch. Aus diesem Grund wurde auf ein Beispiel für die Erzeugung eines NoHeapRealtimeThreads verzichtet. 3.4 Periodisch / Aperiodisch Eine Ausführung der beiden Echtzeit Threads, RealtimeThread und NoHeapRealtimeThread, ist periodisch und aperiodisch möglich. Aperiodisch bedeutet, der Thread wird in unregelmäßigen und unbekannten Zeitabständen gestartet. Bei einer periodischen Ausführung hingegen wird der Thread in gleichen Zeitabständen regelmäßig neu gestartet. Diese Abstände heißen Periode und können im Release Parameter angegeben werden. Ein periodischer Thread muss innerhalb seiner Periode beendet sein, da das System ihn sonst in der nächsten Periode nicht neu starten kann. Jeder periodische Echtzeit Thread sollte eine Schleife mit dem Methodenaufruf waitfornextperiod() enhalten. Der Thread legt sich mit diesem Befehl schlafen und wartet auf seine nächste Periode. Sobald die nächste Periode des Thread beginnt, wird dieser automatisch vom System geweckt und arbeitet einmal seine Schleife ab, bis er wieder zu waitfornextperiod() kommt. public void run() { while (true) {... waitfornextperiod(); } } 3.5 AysncEventHandler Zusätzlich zu den Threads gibt es in Java RT AsyncEventHandler (AEH) und AsyncEvent (AE). Diese beiden Klassen dienen dazu, um auf externe Ereignisse zu reagieren. Ein Plattform abhängiger Mechanismus informiert die echtzeit JVM über ein externes Ereignis, beispielsweise das Auslösen eines Interrupt. Jedes Ereignis bekommt einen Namen zugeteilt und kann über asyncevent.bindto( Ereignisname ) an ein Java AsyncEvent Objekt gebunden werden. Zwischen den AysncEvents und den AsyncEventHandlern besteht eine N zu N Beziehung, das heißt ein AE kann mehrere AEH starten und ein AHE kann auf mehrere AE warten. Mit dem Befehl asyncevent.addhandler(handler) kann ein AEH an ein AE gebunden werden. Bei der Erzeugung des Handlers wird per Parameter festgelegt ob ein RealtimeThread oder ein NoHeapRealtimeThread erzeugt wird, wenn der Handler aufgerufen wurde. AsyncEventHandler(boolean nonheap, java.lang.runnable logic); 3.6 BoundAsyncEventHandler Außer dem AEH gibt es noch den BoundAsyncEventHandler (BAEH). Der Unterschied besteht darin, dass beim BAEH in der Initialisierung ein Thread angelegt wird, der sobald ein Aufruf des Handlers erfolgt nur noch starten muss. Beim AEH wird bei jedem Aufruf ein neuer Thread erzeugt und anschließend gestartet. Nach der Ausführung wird der Thread wieder gelöscht. Der Vorteil eines BAEH ist die Reaktionszeit auf ein Ereignis, er kann schneller darauf reagieren, da alle Threads bereits existieren. Dem entgegen steht der Nachteil, dass dadurch mehr Ressourcen belegt sind.

13 4 Scheduling 13 4 Scheduling In einer Java Virtual Machine besteht die Möglichkeit beliebig viele Threads zu starten. Alle Thread brauchen für ihre Ausführung Systemressourcen, die sie vom Scheduler zugeteilt bekommen. Ziel ist es, eine Zuteilung der Ressourcen zu erreichen, so dass jeder Thread rechtzeitig abgearbeitet werden kann und das eine faire Verteilung der Systemressourcen stattfindet. In Java RT existiert eine abstrakte Klasse Scheduler von der alle konkreten Scheduler Implementationen erben. Neben dem Standard Scheduler, dem PriorityScheduler, bietet Java RT die Möglichkeit weitere eigene Scheduler zu implementieren. Dabei muss man selber darauf achten das eine Interaktion zwischen allen verwendeten Scheduler gewährleistet ist. Wie eine konkrete Interaktion aussehen könnte wurde nicht näher spezifiziert. Durch diese Architektur wurde aber erreicht, dass Erweiterungen einfach möglich sind. Alle konkreten Scheduler sind als Singelton zu implementieren, dass bedeutet, es kann nur eine Instanz von der Klasse existieren. Um eine Referenz auf das eine Objekt zubekommen bietet jeder Scheduler eine Static Methode instance() an. Jeder Thread hat genau einen Scheduler, der ihm die Ressourcen zuteilt. Mit dem Methodenaufruf realtimethread.setscheduler(scheduler) kann der Scheduler für einen Thread geändert werden. Wird keiner gesetzt, verwendet Java den Standard Scheduler, den PriorityScheduler. Außerdem bietet die Klasse Scheduler eine static Funktion Scheduler.setDefaultScheduler(scheduler) an, womit ein anderer Scheduler als Standard definiert wird. Bei neu erzeugten Threads verwendet Java RT jetzt den neue Standard Scheduler, wenn kein Anderer explizit gesetzt wurde. Auf bereits existierenden Threads hat dieser Wechsel keinen Einfluss, das bedeutet, falls ein existierender Thread den Standard Scheduler A bisher verwendet hat und der Standard Scheduler nun auf B wechselt, so bekommt er weiterhin den Prozessor von A zugeteilt. 4.1 PriorityScheduler Wie schon erwähnt ist der PriorityScheduler der Standard Scheduler in Java RT. Es ist der Einzige, den die RTSJ mit bestimmten Eigenschaften vorschreibt. Er muss prioritätsbasiert sein, das bedeutet, dass jeder Thread eine Priorität zugewiesen bekommt. Ein Thread mit einer höheren Priorität wird gegenüber einem Thread mit niedrigerer Priorität bevorzugt. Die Priorität kann beim Erzeugen festgelegt werden und ist während der Laufzeit veränderbar. Wird keine festlegt so übernimmt der neue Thread die Priorität vom Erzeugenden, sofern dies möglich ist. So kann z. B. ein NoHeapRealtimeThread die Priorität von einem anderen NoHeapRealtimeThread erben, aber nicht von einem RealtimeThread, da diese in unterschiedlichen Prioritätsbereichen liegen. Kann die Priorität nicht übernommen werden so gibt es für jeden Threadtyp eine Standardpriorität, die er zugeteilt bekommt. In der RTSJ wird vorgeschrieben, dass der PriorityScheduler neben den 10 Prioritäten für normale Java Threads, mindestens 32 Prioritäten für Echtzeit Threads zur Verfügung stellen muss. Der PriorityScheduler von der Firma Timesys [TS] bietet z. B. 255 Prioritäten an. Falls mehrere Thread die gleiche Priorität besitzen bekommt der Thread Vorrang, der zuerst die Systemressource angefordert hat, also First Come First Serve (FCFS). Zusätzlich muss der PriorityScheduler auch preemptives Scheduling unterstützen, das bedeutet, dass jederzeit ein höher priorisierter Thread den laufenden unterbrechen kann. Er muss also nicht warten bis der niedriger priorisierte Thread die Ressourcen selbst wieder frei gibt. Das folgende Beispiel zeigt wie die Priorität bei einem RealtimeThread gesetzt werden kann. //setze die Priorität auf 31 // MIN_PRIRORITY ist eine Konstante mit dem Wert 11 SchedulingParameter sched = new PriorityParameters( PriorityScheduler.MIN_PRIORTITY+20);

14 4 Scheduling 14 RealtimeThread rt = new RealtimeThread(sched); //verändern der Priorität auf 20 SchedulingParameter sched = new PriorityParameters(20); rt.setschedulingparameter(sched); Nach welchem Schedulingverfahren die Prioritäten den Threads zugewiesen werden ist dem Entwickler selbst überlassen. Es wird lediglich darauf verwiesen, dass das Rate Monotonic Verfahren bei periodischen Thread zu guten Ergebnissen führt. Das Rate Monotonic ordnet den Threads mit den niedrigsten Perioden die höchsten Prioritäten zu, näheres dazu kann [Dib02] entnommen werden. 4.2 ReleaseParameter Jeder Echtzeit Thread kann neben seiner Priorität auch ReleaseParameter besitzen. Im Release Parameter sind alle Zeitvorgaben spezifiziert, die der Thread einhalten muss. Da es periodische und aperiodische Echtzeit Threads gibt, müssen auch die ReleaseParameter in PeriodicParameter und AperiodicParameter unterteilt werden. Die PeriodicParameter setzen sich Zusammen aus der Startzeit, der Periode, der Deadline und der Ausführungszeit (starttime, period, deadline, cost). AperiodicParameter beinhalten dagegen nur eine Deadline und die Aufführungszeit. Alle vier Parameter sind Zeitrestriktionen, die mit Hilfe der Klasse RelativeTime gesetzt werden. RelativeTime starttime = new RelativeTime( 1000, 0); // Millisek., Nanosek. RelativeTime period = new RelativeTime( 100, 0); RelativeTime deadline = new RelativeTime( 50, 0); RelativeTime cost = new RelativeTime( 30, 0); Der Konstruktor von RelativeTime hat zwei Parameter, der erste ist Millesekunden und der zweite Nanosekunden. Im oberen Beispiel wurde der Parmameter starttime auf eine Sekunde, der Parameter period auf 100 Millisekunden usw. gesetzt. Zusätzlich zu den Zeitrestriktionen können auch zwei AsyncEventHandler im ReleaseParameter angegeben werden, ein MissHandler und ein OverrunHandler. MyMissHandler mmh = new MyMissHandler(); MyOverrunHandler moh = new MyOverrunHandler(); // für periodische Threads ReleaseParameter release = PeriodicParameter (starttime, period, deadline, cost, mmh, moh); // für aperiodische Threads ReleaseParameter release = AeriodicParameter ( deadline, cost, mmh, moh); // Thread erzeugen und starten RealtimeThread rt = new RealtimeThread( new PriorityParameters(15), // Priorität 15 release); // ReleaseParameter rt.start(); Die Startzeit (starttime) gibt die Verzögerung an zwischen dem Aufruf rt.start() und dem eigentlichen Starten des Threads an. Das heißt, wenn die Startzeit auf eine Sekunde gesetzt ist startet der Thread genau eine Sekunde nachdem rt.start() aufgerufen wurde. Falls keine Startzeit angegeben ist, startet der Thread sofort. Wie im Kapitel Thread schon erwähnt, haben alle periodischen Threads eine Schleife, die sie immer wieder durchlaufen. Am Ende dieser Schleife steht der Befehl waitfornextperiod() mit dem der Thread schlafen gelegt wird.

15 4 Scheduling 15 Der Parameter Periode gibt an, in welchem Zeitabstand die Periode des Threads neu beginnt. Der Scheduler weckt ihn auf und er kann einmal seine Schleife durcharbeiten bis er wieder zu waitfornextperiod() kommt. Die Deadline spezifiziert einen Zeitpunkt, an dem er Thread spätestens abgearbeitet sein muss. Ist die Deadline z. B. auf 50 Millisekunden gesetzt, so muss der Thread spätestens 50 Millisekunden nach seinem Startzeitpunkt abgearbeitet sein, sonst kommt es zu einem Fehler im Echtzeitsystem. Bei einem periodischen Thread muss die Deadline immer kleiner oder gleich der Periode sein, da sonst der Thread noch ausgeführt werden könnte, obwohl schon eine neue Periode für ihn begonnen hat, was nicht vorkommen darf. Ist keine Deadline angegeben, so wird sie bei periodischen Threads gleich der Periode. Der vierte Parameter gibt die maximale Zeit an, die ein Thread den Prozessor maximal benutzen darf, dieser wird als Kosten (engl. cost) bezeichnet. Zum Beispiel, wenn die Kosten 50 Millisekunden sind, darf der Thread zwischen seinem Startzeitpunkt und seiner Deadline maximal 50 Millisekunden ausgeführt werden. Daher müssen die Kosten immer kleiner oder gleich der Deadline sein. Die Ausführung kann dabei in mehrere Blöcke unterteilt werden, falls ihn ein höher priorisierter Thread unterbricht. Alle Blöcke müssen aber vor erreichen der Deadline abgearbeitet sein und dürfen zusammen nicht die maximale Ausführungszeit überschreiten. Falls ein Thread doch seine maximale Ausführungszeit überschreitet, führt das erstmal zu keinem Fehler, falls er seine Deadline einhält. Es besteht aber die Möglichkeit das andere Threads dadurch ihre Deadline verpassen, weil ihnen weniger Ausführungszeit zur Verfügung stand. Werden keine Kosten angegeben so werden sie automatisch auf die Deadline gesetzt. Hält ein Thread seine Zeitvorgaben nicht ein, so wird dies durch einen AsyncEventHandler behandelt. Der MissHandler startet, falls die Deadline verfehlt wurde und der OverrunHandler, wenn der Thread seine maximale Ausführungszeit überschreitet. Bei periodischen Threads wird die Periode während der Ausführung eines Handlers unterbrochen, kann aber durch den Aufruf realtimethread.scheduleperiodic() im Handler wieder gestartet werden. Wie ein Handler auf das Verfehlen der Vorgaben reagieren soll, muss der Entwickler selbst festlegen, da es von der jeweiligen Anwendung abhängig ist. Sind keine Handler angegeben so reagiert der Scheduler nicht auf das Verfehlen der Zeitvorgaben und arbeitet die Threads weiter ab. Thread1 Ausführungszeit > cost > overrunhandler Periode Thread2 deadline > misshandler Start Periode Abbildung 4-1: ReleaseParameter

16 5 Thread Synchronisation 16 5 Thread Synchronisation In einer Echtzeit Java Virtual Machine können Threads parallel laufen. Wenn mehrere Threads auf die gleichen Objekte oder Methoden zugreifen wollen, müssen diese Zugriffe synchronisiert werden, da diese sonst zu Problemen führen können, z. B. ein Thread verändert gerade ein Objekt während ein Anderer dieses gerade liest. Java RT benutzt wie auch Java, Monitore die einen kritischen Bereich überwachen. Ein kritischer Bereich wird mit synchronized { } definiert und darf nicht von zwei Thread gleichzeitig betreten werden. Tritt ein Thread in einen kritischen Bereich ein, sperrt der Monitor diesen für alle Anderen. Will ein Thread einen gesperrten Abschnitt betreten, so wird dieser blockiert und in die Warteschlange eingereiht. Ist der kritische Bereich wieder freigegeben, darf als nächstes der Thread mit der höchsten Priorität eintreten, der sich in der Warteschlage befindet. Habe Threads die gleiche Priorität so wird der Bevorzug, der schon länger wartet (First Come First Serve). 5.1 Priority Inversion Durch Monitore kann es vorkommen, dass höher priorisierter Thread von einem mit niedrigerer Priorität blockiert wird. Im ungünstigsten Fall kann es sogar passieren dass der höchst priorisierte Thread sogar auf alle Anderen warten muss. Dies kann vorkommen, wenn er in einen kritischen Bereich eintreten will, der aber von dem Thread mit der niedrigsten Priorität blockiert wird. Es werden erst alle Anderen ausgeführt bevor der Thread mit der niedrigsten Priorität den Prozessor bekommt und den blockierten Bereichs wieder frei gibt. Erst jetzt kann der höchst priorisierte Thread in den kritischen Abschnitt eintreten und sein Programm weiter abarbeiten. Dieser Effekt wird als Priority Inversion bezeichnet und muss in einem Echtzeitsystem verhindert werden. Um dieses Problem zu lösen existieren 2 Protokolle in Java RT, Priority Inheritance (PI) und Priority Ceiling Emulation (PCE). Beim PI Protokoll wird das Problem gelöst indem Prioritäten kurzfristig vererbt werden. Befindet sich ein Thread in einem kritischen Bereich, kann er die Priorität der Threads aus der Warteschlange erben, falls diese höher ist. Sind mehrere in der Warteschlange so wird die höchste Priorität verwendet. Nach Freigabe des Bereichs wird die Priorität wieder zurückgesetzt. Beim PCE Protokoll hingegen wird den einzelnen Ressourcen selbst eine Priorität zugeteilt. Sie sollte gleich der Priorität sein, die der höchst priorisierte Thread hat, der in diesen Abschnitt eintreten kann. Für ausführlichere Informationen über PI und PCE sei auf [Dib02] verwiesen. Im Gegensatz zu Java muss ein Java RT Monitor immer eins der beiden oberen Protokolle PI oder PCE verwenden. Dabei ist PI der Standard und wird von RTSJ verlangt. Falls PCE auch angeboten wird, kann der Entwickler entscheiden, für welches Protokoll für die jeweilige Ressource verwendet werden soll. MyClass mc = new MyClass(); // für PI PriorityInheritance pi = PriorityInheritance.instance(); MonitorControl.setMonitorControl(mc,pi); // für PCE - Priorität 27 PriorityCeilingEmulation pce = new PriorityCeilingEmulation(27); MonitorControl.setMonitorControl(mc,pce); Beide Protokolle lösen das Problem der Priority Inversion indem sie den Threads kurzfristig neue Prioritäten zuweisen. Das funktioniert nur unter der Voraussetzung, dass allen Threads die gleiche Priorität zugewiesen werden kann. In Java RT gibt es aber drei verschiedene Threads, die alle in unterschiedliche Prioritätsbereichen liegen. Ein normaler Java Thread kann nicht die gleiche Priorität besitzen, wie ein RealtimeThread. Deswegen können die beiden Protokolle nur zur Synchronisation zwischen gleichen Threads verwendet werden.

17 5 Thread Synchronisation Wait-Free-Queues Um zwei unterschiedliche Threads zu synchronisieren, bietet Java RT die so genannten Wait- Free-Queues an, die WaitFreeWriteQueue (WFWQ), die WaitFreeReadQueue (WFRQ) und die WaitFreeDeQueue (WFDQ). Alle drei Queues verbinden jeweils genau zwei Threads miteinander, wobei sich an jedem Ende der Queue genau ein Thread befindet. Beim Anlegen der Queue müssen dem Konstruktor beide Threads übergeben werden. Nur diese Threads können später über die Queue kommunizieren. Falls sich ein Kommunikationspartner ändert, muss eine neue Queue angelegt werden. Außerdem wird beim Erzeugen der Queue genau festgelegt welches Ende für welchen Thread bestimmt ist, dadurch wird verhindert, dass ein Thread auf das falsche Ende zugreifen kann. Alle Queues haben alle ein blockierendes und ein nicht blockierendes Ende. Werden zwei Threads aus unterschiedlichen Prioritätsbereichen damit synchronisiert, so sollte der Thread mit der höheren Priorität das nicht blockierende Ende bekommen, damit der niedrigere Thread ihn nicht bei seiner Ausführung behindern kann WaitFreeWriteQueue Die WaitFreeWriteQueue erlaubt ein nicht blockierendes Schreiben und ein blockierendes Lesen. Sie biete nur die Möglichkeit einer unidirektionalen Kommunikation, wobei der höher priorisierte Thread am nicht blockierenden Ende schreibt (Writer-Thread) und der niedriger priorisierte Thread am blockierenden Ende liest (Reader-Thread). Es können so nur Daten von einem höher priorisierten zu einem niedriger priorisierten Thread geschickt werden. Ein Anwendungsfall für diese Queue ist beispielsweise eine Visualisierung eines Echtzeitsystems. Die Visualisierung selbst muss dazu nicht unbedingt in Echtzeit laufen, sie muss aber Daten von dem Echtzeit Threads erhalten, um diese visualisieren zu können. Weiterhin ist es nicht nötig, dass die Visualisierung Daten zum Echtzeit Thread schicken muss, weswegen eine unidirektionale Verbindung ausreicht. Der Writer-Thread kann mit dem Methodeaufruf wfwq.write(myobject) Objekte in Queue legen. Wurde ein Objekt erfolgreich hineingelegt so wird der Booleanwert True zurückgegeben. Lautet der Rückgabewert False, so deutet das darauf hin, dass die Queue voll ist und keine weiteren Objekte aufnehmen kann. In diesem Fall bleib dem Writer Thread die Möglichkeit statt write die Methode force zu benutzen, die das letzte Element in der Queue überschreibt. Auf der anderen Seite der Queue kann der Reader Thread die hineingelegten Objekte mit dem Aufruf wfwq.read() wieder herausholen. Ist sie leer, so wird der Thread blockiert bis sich wieder ein Element in der Queue befindet. WaitFreeWriteQueue wfwq = new WaitFreeWriteQueue( mynoheaprealtimethread, // Threads der in die Queue schreibt myrealtimethread, // Threads der aus der Queue liest elements, // Größe der Queue memmoryarea); // Speicherbereich wo die Queue angelegt wird WaitFreeReadQueue Die WaitFreeReadQueue ist genau wie die WaitFreeWriteQueue für eine unidirektionale Kommunikation. Der Unterschied ist das sie blockierendes Schreiben und ein nicht blockierendes Lesen erlaubt. Dadurch bildet sie genau die entgegengesetzte Kommunikationsrichtung ab. Das bedeutet Daten können nur von einem niedriger priorisierten Thread zu einem höher priorisierten Thread geschickt werden. Mit dem Aufruf wfrq.read() kann der Reader ein Element aus der Queue holen. Ist diese leer, so wird Null zurückgegeben. Zusätzlich können auch Elemente mit dem Befehl wfrq.waitfordata() aus der Queue gelesen werden. Dabei wird der Thread allerdings solange blockiert bis mindesten ein

18 5 Thread Synchronisation 18 Element wieder in der Queue ist. WaitForData sollte also nur in Fällen benutzt werden, wenn der Thread ohne das Element aus der Queue ist weiterarbeiten kann. Um diese Methode benutzen zu können, muss im Konstruktor der WFRQ eine Boolean Variable gesetzt werden. Um in die Queue zu schreiben wird wfrq.write(myobject) verwendet. Ist die maximale Anzahl von Elementen bereits erreicht so wird der Writer Thread solange blockiert bis wieder mindestens ein Speicherplatz frei ist WaitFreeDeQueue Soll eine bidirektionale Kommunikation zwischen zwei Threads realisiert werden, muss man entweder eine WFWQ und eine WFRQ verwenden oder eine WaitFreeDeQueue. Die WFDQ hat die Methoden blockingread, blockingwrite, force, nonblockingread und nonblockingwrite. Sie legt im Hintergrund eine WFWQ und eine WFRQ an und leite die Methodenaufrufe einfach an die dementsprechende Queue weiter Allgemeine Methoden Alle drei Queues haben zusätzlich noch allgemeine Methoden. Dazu gehören size, clear, isemty und isfull. Size liefert die Anzahl der Elemente zurück, die sich gerade in der Queue befinden, während clear diese löscht. IsEmpty und isfull liefern jeweils einen Boolean Wert, ob die Queue leer bzw. voll ist. Mit IsEmpty kann man z. B. vor dem Lesen am blockierenden Ende überprüfen, ob die Operation möglich ist ohne zu warten, weil die Queue nicht leer ist. IsFull kann analog vor dem Schreiben verwendet werden. if (!(wfwq.isempty())) Object myobject = wfwq.read(); // falls WFWQ nicht leer ist // lese Element 6 Beispiel SteamBoiler Im folgenden Beispiel soll der Wasserstand eines SteamBoilers (Durchlauferhitzer) geregelt werden. Dazu werden Sensoren und Aktoren verwendet. Sie dienen als Schnittstelle zwischen dem Echtzeitcomputersystem und der physikalischen Welt. Über Sensoren werden Daten für das Echtzeitcomputersystem erfasst während über Aktoren das System die physikalische Welt steuern kann. In diesem Beispiel gibt es zwei Sensoren und sechs Aktoren. Der erste Sensor gibt den Wasserstand (engl. waterlevel) des SteamBoilers an und der zweite den austretenden Dampf (engl. exiting Steam). Die sechs Aktoren bestehen aus vier Pumpen (engl. pump) einem Ventil (engl. valve) und einer Heizung. Die Aufgabe des Echtzeitcomputersystems ist es den Wasserstand in dem Steamboiler zwischen dem maximalen (Wmax) und dem minimalen (Wmin) Wasserstand zuhalten. Wird die Heizung des SteamBoilers eingeschaltet so wird das Wasser erwärmt bis des verdunstet und als Dampf den Steamboiler verlässt. Dadurch wird der Wasserstand im Boiler immer niedriger und das Echtzeitsystem muss eine oder mehrere Pumpen aktiveren um Wasser hineinzupumpen. Ist wieder genug Wasser im Boiler können die Pumpen wieder abgeschaltet werden. Erreicht der Wasserstand die maximale Grenze, so öffnet das Echtzeitsystem das Ventil und lässt solange Wasser ab bis er sich wieder im normalen Bereich befindet. Im normalen Betrieb hat das Echtzeitcomputersystem also die Aufgaben die Sensoren auszulesen, mit Hilfe der Sensordaten neue Aktorwerte zu berechnen und diese in die Aktoren zu schreiben. Dabei müssen bestimmte Zeitvorgaben eingehalten werden, sonst könnte es beispielsweise passieren das der Steamboiler ganz leer ist, bevor sich die Pumpen einschalten.

19 6 Beispiel SteamBoiler 19 Bei einem Steamboiler darf das nicht vorkommen, da er sonst beschädigt wird. Deswegen muss für diesen Anwendungsfall ein Echtzeitcomputersystem eingesetzt werden. Exiting Steam Wmax 4 Pumps Waterlevel Wmin Valve Abbildung 6-1: SteamBoiler 6.1 Umsetzung mit Java RT Dieses Beispiele wurde in Java RT mit drei periodischen Threads umgesetzt. Der erste Thread, SteamBoilerSimulation, simuliert die Hardware, also den Steamboiler. Er liest die Aktoren, berechtet die neuen Werte für die Sensordaten und schreibt diese in die Sensoren. Da Hardware in Echtzeit läuft, wurde hierfür ein NoHeapRealtimeThread verwendet, der im Immortal Speicher liegt. Der zweite Thread, SteamBoilerControl, ist für die Steuerung und Überwachung des Steamboilers zuständig. Dieser Thread kann sich in den drei Zuständen Stop, Init und Run befinden. Im Stop Zustand werden einfach alle Aktorwerte auf null. Von Stop kann der Thread in Init wechseln, hier wird überprüft, ob der SteamBoiler betriebsbereit ist. Dazu wird beispielsweide der Wasserstand kontrolliert, ist dieser nicht im vorgeschrieben Bereich werden die Pumpen aktiviert bzw. das Ventil geöffnet. Ist er danach betriebsbereit so wird die Heizung aktiviert und der Zustand des Threads wechselt nach Run. Dort werden periodisch die Sensoren ausgelesen, neue Aktorwerte berechnet und in die Aktoren geschrieben. Tritt ein Fehler auf oder wird der SteamBoiler abgeschaltet, wechselt der Zustand wieder nach Stop und alle Aktorwerte werden auf null gesetzt. Da dieser Thread ein Echtzeitsystem darstellt ist der ebenfalls ein NoheapRealtimeThread. Aber er läuft im Gegensatz zu dem ersten Thread im Scope Memory und nicht im Immortal. Das hat den Vorteil, dass es möglich ist während der Laufzeit neue Objekte und Variablen anzulegen. Der dritte Thread, SteamBoilerVisualization, ist für die Visualisierung des Steamboilers auf dem Bildschirm zuständig. Da die Visualisierung keinen Echtzeitanforderungen unterliegt, reicht ein normaler Java Thread aus, der im Heap Memory läuft.

20 6 Beispiel SteamBoiler 20 Init if (waterlevel < wmin) pumpson(); if (waterlevel > wmax) vavleopen(); if (waterlevel <= wmax && waterlevel >= wmin) init = true; initcycles ; [initcycles == 0] / pumpsoff() & valveclose() Stop stopactors(); initialization / init = false & initcycles = initcyclesconst [init == true] / pumpsoff() & valveclose() & steamboileron() readsensors(); decide(); writeactors(); Run stop Abbildung 6-2: Zustandsdiagramm von SteamBoilerControl Damit das System lauffähig ist, muss der Thread SteamBoilerSimulation mit den beiden Anderen kommunizieren können. Die Kommunikation zu SteamBoilerControl ist über Monitore realisiert, da beide NoHeapRealtimeTreads sind. Für jeden Actor bzw. Sensor existiert ein Monitor, der im Immortal Memmory liegen muss. Würde die Monitore im Scope Memmory liegen so könnte SteamBoilerSimulation nicht darauf zugreifen, weil keine Referenzen vom Immortal auf den Scope erlaubt sind, siehe dazu Kapitel Scoped Memory. Die Kommunikation zwischen den beiden Threads SteamBoilerSimulation und SteamBoilerVisualization dagegen kann nicht über einen Monitor realisiert werden, da der eine ein NoHeapRealtimeThread und der andere ein normaler Java Thread ist. Hierzu muss eine WaitFreeQueue benutzt werden. Da lediglich Daten von der Simulation zur Visualisierung geschickt werden, also nur von einem höher priorisierten zu einem niedriger priorisierten Thread, ist hierfür die WaitFreeWriteQueue geeignet. Die Queue muss im Immortal Memmory liegen, da die Simulation ein NoHeapRealtimeThread ist und deshalb nicht auf den HeapMemmory zugreifen darf. Die folgende Abbildung zeigt die verwendeten Klassen und in welchem Speicherbereich sie sich befinden.

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

Java Real-Time Specification

Java Real-Time Specification Ausgewählte Kapitel eingebetteter Systeme Java Real-Time Specification Tobias Distler 05.07.2006 Java und Echtzeit? Problem Nichtdeterministisches Verhalten der Garbage Collection Weitere Nachteile Scheduling

Mehr

Echtzeitanwendungen mit Java Real Time Specification for Java

Echtzeitanwendungen mit Java Real Time Specification for Java Fakultät Informatik» Institut für Angewandte Informatik» Lehrstuhl für Technische Informationssysteme Echtzeitanwendungen mit Java Real Time Specification for Java Vortrag im Rahmen des Hauptseminars Technische

Mehr

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

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

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

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

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

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

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

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

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

OECD Programme for International Student Assessment PISA 2000. Lösungen der Beispielaufgaben aus dem Mathematiktest. Deutschland

OECD Programme for International Student Assessment PISA 2000. Lösungen der Beispielaufgaben aus dem Mathematiktest. Deutschland OECD Programme for International Student Assessment Deutschland PISA 2000 Lösungen der Beispielaufgaben aus dem Mathematiktest Beispielaufgaben PISA-Hauptstudie 2000 Seite 3 UNIT ÄPFEL Beispielaufgaben

Mehr

teamsync Kurzanleitung

teamsync Kurzanleitung 1 teamsync Kurzanleitung Version 4.0-19. November 2012 2 1 Einleitung Mit teamsync können Sie die Produkte teamspace und projectfacts mit Microsoft Outlook synchronisieren.laden Sie sich teamsync hier

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

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

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

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

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

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

MORE Profile. Pass- und Lizenzverwaltungssystem. Stand: 19.02.2014 MORE Projects GmbH

MORE Profile. Pass- und Lizenzverwaltungssystem. Stand: 19.02.2014 MORE Projects GmbH MORE Profile Pass- und Lizenzverwaltungssystem erstellt von: Thorsten Schumann erreichbar unter: thorsten.schumann@more-projects.de Stand: MORE Projects GmbH Einführung Die in More Profile integrierte

Mehr

CMS.R. Bedienungsanleitung. Modul Cron. Copyright 10.09.2009. www.sruttloff.de CMS.R. - 1 - Revision 1

CMS.R. Bedienungsanleitung. Modul Cron. Copyright 10.09.2009. www.sruttloff.de CMS.R. - 1 - Revision 1 CMS.R. Bedienungsanleitung Modul Cron Revision 1 Copyright 10.09.2009 www.sruttloff.de CMS.R. - 1 - WOZU CRON...3 VERWENDUNG...3 EINSTELLUNGEN...5 TASK ERSTELLEN / BEARBEITEN...6 RECHTE...7 EREIGNISSE...7

Mehr

Echtzeitprogrammierung in Java. Franziska Häger Seminar: Prozesssteuerung und Robotik

Echtzeitprogrammierung in Java. Franziska Häger Seminar: Prozesssteuerung und Robotik Echtzeitprogrammierung in Java Franziska Häger Seminar: Prozesssteuerung und Robotik Agenda Einführung Warum Java? Java Real Time Probleme Real Time Specification for JAVA (RTSJ) Programmierung Threads

Mehr

Synchronisations- Assistent

Synchronisations- Assistent TimePunch Synchronisations- Assistent Benutzerhandbuch Gerhard Stephan Softwareentwicklung -und Vertrieb 25.08.2011 Dokumenten Information: Dokumenten-Name Benutzerhandbuch, Synchronisations-Assistent

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

S7-Hantierungsbausteine für R355, R6000 und R2700

S7-Hantierungsbausteine für R355, R6000 und R2700 S7-Hantierungsbausteine für R355, R6000 und R2700 1. FB90, Zyklus_R/W Dieser Baustein dient zur zentralen Kommunikation zwischen Anwenderprogramm und dem Modul R355 sowie den Geräten R6000 und R2700 über

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

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

Mandant in den einzelnen Anwendungen löschen

Mandant in den einzelnen Anwendungen löschen Mandant in den einzelnen Anwendungen löschen Bereich: ALLGEMEIN - Info für Anwender Nr. 6056 Inhaltsverzeichnis 1. Allgemein 2. FIBU/ANLAG/ZAHLUNG/BILANZ/LOHN/BELEGTRANSFER 3. DMS 4. STEUERN 5. FRISTEN

Mehr

Handbuch ECDL 2003 Basic Modul 5: Datenbank Access starten und neue Datenbank anlegen

Handbuch ECDL 2003 Basic Modul 5: Datenbank Access starten und neue Datenbank anlegen Handbuch ECDL 2003 Basic Modul 5: Datenbank Access starten und neue Datenbank anlegen Dateiname: ecdl5_01_02_documentation_standard.doc Speicherdatum: 14.02.2005 ECDL 2003 Basic Modul 5 Datenbank - Access

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

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

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

2. Im Admin Bereich drücken Sie bitte auf den roten Button Webseite bearbeiten, sodass Sie in den Bearbeitungsbereich Ihrer Homepage gelangen.

2. Im Admin Bereich drücken Sie bitte auf den roten Button Webseite bearbeiten, sodass Sie in den Bearbeitungsbereich Ihrer Homepage gelangen. Bildergalerie einfügen Wenn Sie eine Vielzahl an Bildern zu einem Thema auf Ihre Homepage stellen möchten, steht Ihnen bei Schmetterling Quadra das Modul Bildergalerie zur Verfügung. Ihre Kunden können

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

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

Software Engineering Interaktionsdiagramme

Software Engineering Interaktionsdiagramme Software Engineering Interaktionsdiagramme Prof. Adrian A. Müller, PMP, PSM 1, CSM Fachbereich Informatik und Mikrosystemtechnik 1 Nachrichtenaustausch Welche Nachrichten werden ausgetauscht? (Methodenaufrufe)

Mehr

Gruppenrichtlinien und Softwareverteilung

Gruppenrichtlinien und Softwareverteilung Gruppenrichtlinien und Softwareverteilung Ergänzungen zur Musterlösung Bitte lesen Sie zuerst die gesamte Anleitung durch! Vorbemerkung: Die Begriffe OU (Organizational Unit) und Raum werden in der folgenden

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

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

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

Dokumentation IBIS Monitor

Dokumentation IBIS Monitor Dokumentation IBIS Monitor Seite 1 von 16 11.01.06 Inhaltsverzeichnis 1. Allgemein 2. Installation und Programm starten 3. Programmkonfiguration 4. Aufzeichnung 4.1 Aufzeichnung mitschneiden 4.1.1 Inhalt

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

Ü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

Datensicherung. Beschreibung der Datensicherung

Datensicherung. Beschreibung der Datensicherung Datensicherung Mit dem Datensicherungsprogramm können Sie Ihre persönlichen Daten problemlos Sichern. Es ist möglich eine komplette Datensicherung durchzuführen, aber auch nur die neuen und geänderten

Mehr

Schnittstelle DIGI-Zeiterfassung

Schnittstelle DIGI-Zeiterfassung P.A.P.A. die kaufmännische Softwarelösung Schnittstelle DIGI-Zeiterfassung Inhalt Einleitung... 2 Eingeben der Daten... 2 Datenabgleich... 3 Zusammenfassung... 5 Es gelten ausschließlich unsere Allgemeinen

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

FuxMedia Programm im Netzwerk einrichten am Beispiel von Windows 7

FuxMedia Programm im Netzwerk einrichten am Beispiel von Windows 7 FuxMedia Programm im Netzwerk einrichten am Beispiel von Windows 7 Die Installation der FuxMedia Software erfolgt erst NACH Einrichtung des Netzlaufwerks! Menüleiste einblenden, falls nicht vorhanden Die

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

http://train-the-trainer.fh-joanneum.at IINFO Storyboard

http://train-the-trainer.fh-joanneum.at IINFO Storyboard IINFO Storyboard Allgemeine Bemerkungen und Richtlinien zur Handhabung. Das Storyboard besteht aus einem Web, d.h. einer vernetzten Struktur von HTML-Seiten welche später von den Programmieren direkt als

Mehr

Daten-Synchronisation zwischen dem ZDV-Webmailer und Outlook (2002-2007) Zentrum für Datenverarbeitung der Universität Tübingen

Daten-Synchronisation zwischen dem ZDV-Webmailer und Outlook (2002-2007) Zentrum für Datenverarbeitung der Universität Tübingen Daten-Synchronisation zwischen dem ZDV-Webmailer und Outlook (2002-2007) Zentrum für Datenverarbeitung der Universität Tübingen Inhalt 1. Die Funambol Software... 3 2. Download und Installation... 3 3.

Mehr

Echtzeitscheduling (1)

Echtzeitscheduling (1) Echtzeitscheduling (1) Scheduling in Betriebssystemen Ressourcenausteilung (CPU, Speicher, Kommunikation) Faire Ressourcenvergabe, insbesondere CPU Hohe Interaktivität / kurze Reaktionszeit für interaktive

Mehr

Viele Bilder auf der FA-Homepage

Viele Bilder auf der FA-Homepage Viele Bilder auf der FA-Homepage Standardmäßig lassen sich auf einer FA-Homepage nur 2 Bilder mit zugehörigem Text unterbringen. Sollen es mehr Bilder sein, muss man diese als von einer im Internet

Mehr

C++ Tutorial: Timer 1

C++ Tutorial: Timer 1 C++ Tutorial: Timer 1 Timer v1.0 Einleitung Raum und Zeit sind spätestens seit der kopernikanischen Wende wichtige Gegenstände des Denkens geworden. In einem Programm bestimmt die Zeit die Abläufe und

Mehr

Evident VDDS-Anbindung von MIZ

Evident VDDS-Anbindung von MIZ Evident VDDS-Anbindung von MIZ Die VDDS Schnittstelle erlaubt die Übernahme der Patientendaten aus Evident in MIZ. Außerdem können Sie aus Evident heraus (aus der Patientenkarteikarte) MIZ oder den MIZViewer

Mehr

1. Adressen für den Serienversand (Briefe Katalogdruck Werbung/Anfrage ) auswählen. Die Auswahl kann gespeichert werden.

1. Adressen für den Serienversand (Briefe Katalogdruck Werbung/Anfrage ) auswählen. Die Auswahl kann gespeichert werden. Der Serienversand Was kann man mit der Maske Serienversand machen? 1. Adressen für den Serienversand (Briefe Katalogdruck Werbung/Anfrage ) auswählen. Die Auswahl kann gespeichert werden. 2. Adressen auswählen,

Mehr

Zahlen auf einen Blick

Zahlen auf einen Blick Zahlen auf einen Blick Nicht ohne Grund heißt es: Ein Bild sagt mehr als 1000 Worte. Die meisten Menschen nehmen Informationen schneller auf und behalten diese eher, wenn sie als Schaubild dargeboten werden.

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

Präventionsforum+ Erfahrungsaustausch. HANDOUT GRUPPEN-ADMINISTRATOREN Anlage zum Endnutzer-Handbuch. Stand: 11.09.2014 Änderungen vorbehalten

Präventionsforum+ Erfahrungsaustausch. HANDOUT GRUPPEN-ADMINISTRATOREN Anlage zum Endnutzer-Handbuch. Stand: 11.09.2014 Änderungen vorbehalten Präventionsforum+ Erfahrungsaustausch HANDOUT GRUPPEN-ADMINISTRATOREN Anlage zum Endnutzer-Handbuch Stand: 11.09.2014 Änderungen vorbehalten Anlage zum Endnutzer-Handbuch Handout Gruppen-Administratoren

Mehr

Handbuch. NAFI Online-Spezial. Kunden- / Datenverwaltung. 1. Auflage. (Stand: 24.09.2014)

Handbuch. NAFI Online-Spezial. Kunden- / Datenverwaltung. 1. Auflage. (Stand: 24.09.2014) Handbuch NAFI Online-Spezial 1. Auflage (Stand: 24.09.2014) Copyright 2016 by NAFI GmbH Unerlaubte Vervielfältigungen sind untersagt! Inhaltsangabe Einleitung... 3 Kundenauswahl... 3 Kunde hinzufügen...

Mehr

FAQ Spielvorbereitung Startspieler: Wer ist Startspieler?

FAQ Spielvorbereitung Startspieler: Wer ist Startspieler? FAQ Spielvorbereitung Startspieler: Wer ist Startspieler? In der gedruckten Version der Spielregeln steht: der Startspieler ist der Spieler, dessen Arena unmittelbar links neben dem Kaiser steht [im Uhrzeigersinn].

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

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

Simulation LIF5000. Abbildung 1

Simulation LIF5000. Abbildung 1 Simulation LIF5000 Abbildung 1 Zur Simulation von analogen Schaltungen verwende ich Ltspice/SwitcherCAD III. Dieses Programm ist sehr leistungsfähig und wenn man weis wie, dann kann man damit fast alles

Mehr

Aufklappelemente anlegen

Aufklappelemente anlegen Aufklappelemente anlegen Dieses Dokument beschreibt die grundsätzliche Erstellung der Aufklappelemente in der mittleren und rechten Spalte. Login Melden Sie sich an der jeweiligen Website an, in dem Sie

Mehr

Verhindert, dass eine Methode überschrieben wird. public final int holekontostand() {...} public final class Girokonto extends Konto {...

Verhindert, dass eine Methode überschrieben wird. public final int holekontostand() {...} public final class Girokonto extends Konto {... PIWIN I Kap. 8 Objektorientierte Programmierung - Vererbung 31 Schlüsselwort: final Verhindert, dass eine Methode überschrieben wird public final int holekontostand() {... Erben von einer Klasse verbieten:

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

GEVITAS Farben-Reaktionstest

GEVITAS Farben-Reaktionstest GEVITAS Farben-Reaktionstest GEVITAS Farben-Reaktionstest Inhalt 1. Allgemeines... 1 2. Funktionsweise der Tests... 2 3. Die Ruhetaste und die Auslösetaste... 2 4. Starten der App Hauptmenü... 3 5. Auswahl

Mehr

Anleitung zum neuen Überaumbuchungssystem der Hochschule für Musik und Tanz Köln

Anleitung zum neuen Überaumbuchungssystem der Hochschule für Musik und Tanz Köln Anleitung zum neuen Überaumbuchungssystem der Hochschule für Musik und Tanz Köln Dieses System wird im Sommersemester 2015 getestet und gilt nur für das Übehaus. Das Üben in Räumen des Haupthauses wird

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

PTV VISWALK TIPPS UND TRICKS PTV VISWALK TIPPS UND TRICKS: VERWENDUNG DICHTEBASIERTER TEILROUTEN

PTV VISWALK TIPPS UND TRICKS PTV VISWALK TIPPS UND TRICKS: VERWENDUNG DICHTEBASIERTER TEILROUTEN PTV VISWALK TIPPS UND TRICKS PTV VISWALK TIPPS UND TRICKS: VERWENDUNG DICHTEBASIERTER TEILROUTEN Karlsruhe, April 2015 Verwendung dichte-basierter Teilrouten Stellen Sie sich vor, in einem belebten Gebäude,

Mehr

Anleitung für die Einrichtung weiterer Endgeräte in 4SELLERS SalesControl

Anleitung für die Einrichtung weiterer Endgeräte in 4SELLERS SalesControl SALESCONTROL Anleitung für die Einrichtung weiterer Endgeräte in 4SELLERS SalesControl Version: 1.1 Stand: 04.09.2014 Die Texte und Abbildungen in diesem Leitfaden wurden mit größter Sorgfalt erarbeitet,

Mehr

Kreativ visualisieren

Kreativ visualisieren Kreativ visualisieren Haben Sie schon einmal etwas von sogenannten»sich selbst erfüllenden Prophezeiungen«gehört? Damit ist gemeint, dass ein Ereignis mit hoher Wahrscheinlichkeit eintritt, wenn wir uns

Mehr

Nutzung von GiS BasePac 8 im Netzwerk

Nutzung von GiS BasePac 8 im Netzwerk Allgemeines Grundsätzlich kann das GiS BasePac Programm in allen Netzwerken eingesetzt werden, die Verbindungen als Laufwerk zu lassen (alle WINDOWS Versionen). Die GiS Software unterstützt nur den Zugriff

Mehr

Einzel-E-Mails und unpersönliche Massen-Mails versenden

Einzel-E-Mails und unpersönliche Massen-Mails versenden Einzel-E-Mails und unpersönliche Massen-Mails versenden Copyright 2012 cobra computer s brainware GmbH cobra Adress PLUS ist eingetragenes Warenzeichen der cobra computer s brainware GmbH. Andere Begriffe

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

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

etutor Benutzerhandbuch XQuery Benutzerhandbuch Georg Nitsche

etutor Benutzerhandbuch XQuery Benutzerhandbuch Georg Nitsche etutor Benutzerhandbuch Benutzerhandbuch XQuery Georg Nitsche Version 1.0 Stand März 2006 Versionsverlauf: Version Autor Datum Änderungen 1.0 gn 06.03.2006 Fertigstellung der ersten Version Inhaltsverzeichnis:

Mehr

Lehrer: Einschreibemethoden

Lehrer: Einschreibemethoden Lehrer: Einschreibemethoden Einschreibemethoden Für die Einschreibung in Ihren Kurs gibt es unterschiedliche Methoden. Sie können die Schüler über die Liste eingeschriebene Nutzer Ihrem Kurs zuweisen oder

Mehr

4. BEZIEHUNGEN ZWISCHEN TABELLEN

4. BEZIEHUNGEN ZWISCHEN TABELLEN 4. BEZIEHUNGEN ZWISCHEN TABELLEN Zwischen Tabellen können in MS Access Beziehungen bestehen. Durch das Verwenden von Tabellen, die zueinander in Beziehung stehen, können Sie Folgendes erreichen: Die Größe

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

Dokumentation. Black- und Whitelists. Absenderadressen auf eine Blacklist oder eine Whitelist setzen. Zugriff per Webbrowser

Dokumentation. Black- und Whitelists. Absenderadressen auf eine Blacklist oder eine Whitelist setzen. Zugriff per Webbrowser Dokumentation Black- und Whitelists Absenderadressen auf eine Blacklist oder eine Whitelist setzen. Zugriff per Webbrowser Inhalt INHALT 1 Kategorie Black- und Whitelists... 2 1.1 Was sind Black- und Whitelists?...

Mehr

GEZIELT MEHR SICHERHEIT MIT 4I ACCESS SERVER & 4I CONNECT CLIENT

GEZIELT MEHR SICHERHEIT MIT 4I ACCESS SERVER & 4I CONNECT CLIENT Seite 1/7 GEZIELT MEHR SICHERHEIT MIT 4I ACCESS SERVER & 4I CONNECT CLIENT ZENTRAL LOKALE MANAGEMENT-PLATTFORM FÜR EINE W ELTWEIT SICHERE INDUSTRIELLE KOMMUNIKATION. Seite 2/7 Auf den folgenden Seiten

Mehr

iphone- und ipad-praxis: Kalender optimal synchronisieren

iphone- und ipad-praxis: Kalender optimal synchronisieren 42 iphone- und ipad-praxis: Kalender optimal synchronisieren Die Synchronisierung von ios mit anderen Kalendern ist eine elementare Funktion. Die Standard-App bildet eine gute Basis, für eine optimale

Mehr

Manager. von Peter Pfeifer, Waltraud Pfeifer, Burkhard Münchhagen. Spielanleitung

Manager. von Peter Pfeifer, Waltraud Pfeifer, Burkhard Münchhagen. Spielanleitung Manager von Peter Pfeifer, Waltraud Pfeifer, Burkhard Münchhagen Spielanleitung Manager Ein rasantes Wirtschaftsspiel für 3 bis 6 Spieler. Das Glück Ihrer Firma liegt in Ihren Händen! Bestehen Sie gegen

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

Jederzeit Ordnung halten

Jederzeit Ordnung halten Kapitel Jederzeit Ordnung halten 6 auf Ihrem Mac In diesem Buch war bereits einige Male vom Finder die Rede. Dieses Kapitel wird sich nun ausführlich diesem so wichtigen Programm widmen. Sie werden das

Mehr

Erstellen einer Collage. Zuerst ein leeres Dokument erzeugen, auf dem alle anderen Bilder zusammengefügt werden sollen (über [Datei] > [Neu])

Erstellen einer Collage. Zuerst ein leeres Dokument erzeugen, auf dem alle anderen Bilder zusammengefügt werden sollen (über [Datei] > [Neu]) 3.7 Erstellen einer Collage Zuerst ein leeres Dokument erzeugen, auf dem alle anderen Bilder zusammengefügt werden sollen (über [Datei] > [Neu]) Dann Größe des Dokuments festlegen beispielsweise A4 (weitere

Mehr

AUSBILDUNG eines OBEDIENCE HUNDES

AUSBILDUNG eines OBEDIENCE HUNDES Beginners, CH (Box, Carré), 15 m entfernt Beginners, CH ab 2017 FCI - 1 (Box, Carré), 15 m entfernt mit Platz, 15 m FCI - 2 FCI - 3 mit Platz und Abrufen, 23 m Voransenden in einen Kreis, dann in ein Viereck

Mehr

Produktschulung WinDachJournal

Produktschulung WinDachJournal Produktschulung WinDachJournal Codex GmbH Stand 2009 Inhaltsverzeichnis Einleitung... 3 Starten des Programms... 4 Erfassen von Notizen in WinJournal... 6 Einfügen von vorgefertigten Objekten in WinJournal...

Mehr

Mobile Intranet in Unternehmen

Mobile Intranet in Unternehmen Mobile Intranet in Unternehmen Ergebnisse einer Umfrage unter Intranet Verantwortlichen aexea GmbH - communication. content. consulting Augustenstraße 15 70178 Stuttgart Tel: 0711 87035490 Mobile Intranet

Mehr

Erste Schritte ANLEITUNG Deutsche Sportausweis Vereinsverwaltung Schnittstelle zum Portal des Deutschen Sportausweises unter www.sportausweis.

Erste Schritte ANLEITUNG Deutsche Sportausweis Vereinsverwaltung Schnittstelle zum Portal des Deutschen Sportausweises unter www.sportausweis. Erste Schritte ANLEITUNG Deutsche Sportausweis Vereinsverwaltung Schnittstelle zum Portal des Deutschen Sportausweises unter www.sportausweis.de Inhaltsverzeichnis 1. Einleitung... 3 2. Einrichtung der

Mehr

3.14 Die Programmieroberfläche Programmierung

3.14 Die Programmieroberfläche Programmierung 121 3.14 Die Programmieroberfläche Programmierung Besonderheiten Die Oberflächen der einzelnen Quellen (3S, KW-Software, Siemens-TIA-Portal, logi.cad 3, PAS4000) sind in sich unterschiedlich. Aber auch

Mehr

Stundenerfassung Version 1.8 Anleitung Arbeiten mit Replikaten

Stundenerfassung Version 1.8 Anleitung Arbeiten mit Replikaten Stundenerfassung Version 1.8 Anleitung Arbeiten mit Replikaten 2008 netcadservice GmbH netcadservice GmbH Augustinerstraße 3 D-83395 Freilassing Dieses Programm ist urheberrechtlich geschützt. Eine Weitergabe

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

Objektorientierte Programmierung für Anfänger am Beispiel PHP

Objektorientierte Programmierung für Anfänger am Beispiel PHP Objektorientierte Programmierung für Anfänger am Beispiel PHP Johannes Mittendorfer http://jmittendorfer.hostingsociety.com 19. August 2012 Abstract Dieses Dokument soll die Vorteile der objektorientierten

Mehr

Access [basics] Rechnen in Berichten. Beispieldatenbank. Datensatzweise berechnen. Berechnung im Textfeld. Reporting in Berichten Rechnen in Berichten

Access [basics] Rechnen in Berichten. Beispieldatenbank. Datensatzweise berechnen. Berechnung im Textfeld. Reporting in Berichten Rechnen in Berichten Berichte bieten die gleichen Möglichkeit zur Berechnung von Werten wie Formulare und noch einige mehr. Im Gegensatz zu Formularen bieten Berichte die Möglichkeit, eine laufende Summe zu bilden oder Berechnungen

Mehr