Echtzeitprogrammierung in Java The Real-Time Specification for Java Andrzej Kononowicz Clausthal 2003 Real-Time Java Specification 1 Eignung von Java für Echtzeitsysteme Java wurde nicht zur Programmierung von Echtzeitsysteme entworfen. Nachteile der Standard Java Spezifikation • Nichtvorhersehbares Verhalten • Speicherverwaltung ECHT-Zeit • Scheduling und Synchronisation bedeutet nicht ECHT-Schnell • Schlechte Performance Real-Time Java Specification 2 The Real-Time Specification for Java Geschichte der Entstehung von RTSJ 1998 1999 2000 2002 - The Real-Time for Java Expert Group Community Review Draft Public Release als Buch Reference Implementation durch TimeSys Entwicklungsrichtlinien von RTSJ • • • • • • Vorhersehbare Ausführungszeiten Keine Einschränkung auf spezielle Java-Umgebungen Portabilität (Write Once – Run Anywhere) Abwärtskompatibilität Up-To-Date aber auch offen für zukünftige Entwicklungen Keine syntaktischen Erweiterungen Real-Time Java Specification 3 The Real-Time Specification for Java Die Erweiterungen des Java Standards : 1. Threads und Scheduling 2. Synchronisation 3. Asynchrones Eventhandling 4. Asynchrone Übergabe der Kontrolle 5. Zeit und Zeitmesser 6. Speicherverwaltung Real-Time Java Specification 4 Threads und Scheduling Jedes Objekt, welches das Interface Scheduleable implementiert: • kann einem Scheduler übergeben werden, der es zu gegebener Zeit ausführt • wird charakterisiert durch: - SchedulingParameters - ReleaseParameters - ProcessingGroupParameters - MemoryParameters Real-Time Java Specification 5 Scheduling Parameters SchedulingParameters • Bestimmen die Ausführungsprioritäten • Werden vom Programmierer und nicht durch das System vergeben PriorityParameters priority : int ImportanceParameters importance : int Real-Time Java Specification • Eine Änderung der SchedulingParameter wird sofort vom Scheduler wahrgenommen. • Jede RTSJ-Implementation muss einen Scheduler beinhalten, der mindestens 28 verschiedene Prioritätsstufen unterscheidet. 6 Release Parameters ReleaseParameters cost : RelativeTime deadline : RelativeTime overrunHandler : AsyncEventHandler missHandler : AsyncEventHandler Bestimmen die Auslösungsparamter: • Berarbeitungszeit • Deadline • Reaktion bei Überschreitung der Bearbeitungszeit oder der Deadline PeriodicParameters period : RelativeTime start : HighResolutionTime AperiodicParameters SporadicParameter minimumInterarrival : RelativeTime ProcessingGroupParameter - ähnlich definiert wie PeriodicParameters mit dem Unterschied, dass nicht nur ein Thread, sondern eine Gruppe von Threads unter den selben Constraints ausgeführt werden muss. Real-Time Java Specification 7 Schedulable Objects Runnable (from java.lang) Thread (from java.lang) Schedulable RealtimeThread NoHeapRealtimeThread Real-Time Java Specification AsyncEventHandler BoundAsyncEventHandler 8 RealtimeThread void setScheduler(Scheduler scheduler) throws IllegalThreadStateException; void addToFeasibility(); boolean addIfFeasible(); boolean waitForNextPeriod() throws IllegalThreadStateException; static void sleep(HighResolutionTime time) throws InterruptedException; synchronized void interrupt(); Real-Time Java Specification 9 RealtimeThread vs. NoHeapRealtimeThread RealtimeThread • kann Objekte auf dem Heap zugreifen • kann durch den GC verzögert werden • Anwendung → weniger zeitkritische Aufgaben NoHeapRealtimeThread • kann keine Objekte auf dem Heap zugreifen • wird nicht vom GC beeinflusst. • Anwendung → Aufgaben mit kleinen zeitlichen Toleranzen Real-Time Java Specification 10 Scheduler Scheduler addToFeasibility(s : Schedulable) : void removeFromFeasibility(s : Schedulable) : void isFeasible() : boolean getPolicyName() : java.lang.String PriorityScheduler fireSchedulable(s : Schedulable) : void getMaxPriority() : int getMinPriority() : int getNormPriority() : int Ein Scheduler verwaltet die Ausführung von Objekten die das Schedulable Interface implementieren. Beinhaltet: • Scheduling-Algorithmus • Feasibility-Algorithmus Jede RTSJ Implementation besitzt den PriorityScheduler • unterbrechbar • prioritätsgesteuert • 28 Prioritätsstufen (+10) Anwendungspezifische Scheduler Real-Time Java Specification 11 Beispiel Erstellung eines Threads • Start – 0 ms • Bearbeitungszeit – 30 ms • Deadline – 60 ms • Periode – 100 ms Real-Time Java Specification Beispiel 1 12 The Real-Time Specification for Java Die Erweiterungen des Java Standards : 1. Threads und Scheduling 2. Synchronisation 3. Asynchrones Eventhandling 4. Asynchrone Übergabe der Kontrolle 5. Zeit und Zeitmesser 6. Speicherverwaltung Real-Time Java Specification 13 Synchronized Java – nur gegenseitiger Ausschluss bei kritischen Ressourcen RTSJ – neue Semantik für das Schlüsselwort synchronized. • Jede RTS Implementation muss den Priority-Inheritance Algorithmus implementieren. Die Implementation von Priority-Ceiling Algorithmus ist optional. • Wait-Free Queues erlauben Echtzeitthreads mit normalen Threads zu synchronisieren. MonitorControl PriorityInheritance Real-Time Java Specification PriorityCeilingEmulation 14 The Real-Time Specification for Java Die Erweiterungen des Java Standards : 1. Threads und Scheduling 2. Synchronisation 3. Asynchrones Eventhandling 4. Asynchrone Übergabe der Kontrolle 5. Zeit und Zeitmesser 6. Speicherverwaltung Real-Time Java Specification 15 Asynchrones EventHandling AsyncEvent repräsentiert Hardwareinterrupts, Signale, programmatische Ereignisse, … void fire() void setHandler(AsyncEventHandler handler) void bindTo(String happening) throws UnknownHappeningException AsyncEventHandler von einem AsyncEvent aktiviert wird einem Scheduler übergeben besitzt die selben Parametertypen wie ein RealtimeThread BoundAsyncEventHandler Erbt aus AsyncEventHandler Garantie eines eigenen Threads Real-Time Java Specification 16 Beispiel Beispiel 2 Das Binden eines asynchronen Ereignisses an ein Hardwareinterrupt Real-Time Java Specification 17 The Real-Time Specification for Java Die Erweiterungen des Java Standards : 1. Threads und Scheduling 2. Synchronisation 3. Asynchrones Eventhandling 4. Asynchrone Übergabe der Kontrolle 5. Zeit und Zeitmesser 6. Speicherverwaltung Real-Time Java Specification 18 Asynchrone Übergabe der Kontrolle in Java Frühe Java-Versionen erlaubten: void suspend(); void resume(); void stop(); deprecated !!! Standard Java unterstützt jetzt nur: void interrupt() throws SecurityException; boolean isInterrupted(); public destroy(); → deadlocks Real-Time Java Specification 19 Asynchrone Übergabe der Kontrolle in RTSJ Um den Mechanismus der Asynchronen Übergabe der Kontrolle in RTSJ zu benutzen muss man folgende drei Schritte befolgen: 1. Deklaration der AsynchronouslyInterruptedException 2. Auswahl der Methode, die unterbrechbar sein soll 3. Signalisierung der AsynchronouslyInterruptedException Real-Time Java Specification 20 Asynchrone Übergabe der Kontrolle in RTSJ Ein RealTimeThread t kann durch einen anderen Thread unterbrochen werden indem z.B. die interrupt() Methode aufgerufen wird. Eine AsynchronouslyInterruptedException wird ausgelöst. Die Konsequenzen einer solchen Unterbrechung sind folgende: • Wenn t sich in einer Methode befindet, die AIE nicht voraussetzt, so wird die Ausführung der AIE bis zu der Zeit verschoben, wo t die AIE-verbietende Methode verlässt und eine Methode ausführt die AIE zulässt. • Wenn t sich in einer Methode befindet die AIE voraussetzt so wird die Methode unterbrochen und die alternative Methode wird ausgeführt. • Die AIE kann man natürlich mit einem try{}catch(AIE) Programmblock auffangen. • Wurde t durch eine wait(),sleep() oder join() Methode aufgehalten so wird er rescheduled und die AIE wird aufgerufen. Real-Time Java Specification 21 Asynchrone Übergabe der Kontrolle in RTSJ InterruptedException (from java.lang) Interruptible interruptAction(e : AIE) : void run(e : AIE) : void AsynchronouslyInterruptedException doInterruptible(logic : Interruptible) : boolean fire() : boolean happened(propagate : boolean) : boolean propagate() : void disable() : void enable() : boolean Timed <<constructor>> Timed(time : HighResolutionTime) resetTime(time : HighResolutionTime) : void Real-Time Java Specification 22 The Real-Time Specification for Java Die Erweiterungen des Java Standards : 1. Threads und Scheduling 2. Synchronisation 3. Asynchrones Eventhandling 4. Asynchrone Übergabe der Kontrolle 5. Zeit und Zeitmesser 6. Speicherverwaltung Real-Time Java Specification 23 Zeit in RTSJ Standard Java static long java.lang.System.currentTimeMillis() javax.swing.Timer, java.util.Timer RTSJ HighResolutionTime Comparable getMiliseconds() getNanoseconds() (from java.lang) AbsoluteTime RelativeTime add(time : RelativeTime) : AbsoluteTime substract(time : AbsoluteTime) : RelativeTime substract(time : RelativeTime) : AbsoluteTime add(time : RelativeTime) : RelativeTime substract(time : RelativeTime) : RelativeTime RationalTime getFrequency() : int Real-Time Java Specification 24 Clocks • Dienen zum Auslösen von Timers • Clock – Abstrakte Klasse • Jede RTSJ Implementation beinhaltet einen RealtimeClock public AbsoluteTime getTime(); • Andere Clocks geplant: – UserTimeClock – SimulationTimeClock Real-Time Java Specification 25 Timers AsynchronicEvent Timer Timer(t : HighResolutionTime, c : Clock, h : AsynchronicEventHandler) start() : void stop() : void isRunning() : boolean reschedule(time : HighResolutionTime) OneShotTimer PeriodicTimer setInterval(interval : RelativeTime) : void Real-Time Java Specification 26 The Real-Time Specification for Java Die Erweiterungen des Java Standards : 1. Threads und Scheduling 2. Synchronisation 3. Asynchrones Eventhandling 4. Asynchrone Übergabe der Kontrolle 5. Zeit und Zeitmesser 6. Speicherverwaltung Real-Time Java Specification 27 Speicherverwaltung in Java Standard Java: • Objekte werden auf einem Heap verwaltet • Jede VM besitzt genau eine Heap-Instanz – es ist die einzige Speicherart • GC gibt ein Objekt frei falls keine Referenz mehr auf es zeigt • GC läuft mit der höchsten Priorität im System Real-Time Java Specification 28 Speicherverwaltung in RTSJ RTSJ unterscheidet 3 Speicherarten: Heap memory: • Die bisherige Speicherart von JVM. • Der GC verwaltet die Freigabe nicht mehr gebrauchten Speichers. Scoped memory: • Beschränkte Lebensdauer der Objekte • Objekte in diesem Speicherbereich werden zusammen freigegeben, wenn kein einziges mehr durch einen Echtzeitthread referenziert wird. Immortal memory: • Wird von den Threads gemeinsam gebraucht (eine Instanz für JVM) • GC hat keinen Zugriff • Objekte werden nicht gelöscht • Objekte dürfen nur andere Objekte in der Immortal memory oder auf dem Heap referenzieren. Real-Time Java Specification 29 MemoryArea MemoryArea enter(logic : Runnable) : void newArray(type : Class, number int) : Object newInstance(type : Class) : Object memoryConsumed() : long memoryRemaining() : long ImmortalMemory HeapMemory ScopedMemory joinAndEnter(logic : Runnable) : void VTMemory Real-Time Java Specification VTPhysicalMemory LTMemory LTPhysicalMemory 30 Physical Memory Areas Physical Memory Area dient zum Platzieren von Objekten in bestimmten Speicherarten: • High-speed RAM • Battery backed RAM • DMA • Memory-mapped I/O PhysicalMemoryManager • Verwaltet physischen Speicher • Unterstützt abnehmbare Speicher (z.B. PCMCIA) • Beinhaltet Methoden zur Einfügung und Entfernung des Speichers PhysicalMemoryTypeFilter • Bietet Mittel zur Beschreibung der Eigenschaften eines bestimmten Speichertyps Real-Time Java Specification 31 RawMemoryAccess RawMemoryAccess • Modelliert einen Bereich physischen Speichers als eine festgelegte Reihenfolge von Bytes • Dient nur zur Aufbewahrung bestimmten primitiven Datentypen: byte,short,int,long oder deren Arrayes • Kann keine JavaObjekte beinhalten • Die Daten kann man durch Adressabstände (Offsets) von einer bestimmten Basisadresse erreichen • Byteordnung ist einstellbar RawMemoryAccessFloatAccess Aufbewahrung von Gleitkommazahlen - float,double Real-Time Java Specification 32 Speicherverwaltung SizeEstimator Hilft bei Schätzung des benötigten Speichers Kann als Parameter für die MemoryArea Klassen dienen void reserve(Class c, int n) fügt n Instanzen von einer Klasse c zur Schätzung hinzu long getEstimate() gibt die geschatzte Anzahl von Bytes zurück MemoryParameters Legt die SpeicherParameter für die Schedulable-Objekte fest. public void setAllocationRate(long allocationRate) public boolean setMaxImmortalIfFeasible(long maximum) public boolean setMaxMemoryAreaIfFeasible(long maximum) Real-Time Java Specification 33 Evaluating the Expressive Power of the Real-Time Specification for Java A. J. Wellings – University of York P. Puschner – Technische Universität Wien Auswertung von Real-Time Specification for Java durch Case Studies: • An Extensible General Resource Controller • Atomic Action Support • Unbounded Computations Beispiel: Resource Controller Ein Betriebsmittel wird durch eine kritische Sektion geschützt. Die Warteschlange der Jobs vor der kritischen Sektion wird nach Prioritäten geordnet. Beispiel: Atomic Actions Gegeben sei eine Reihe von Jobs die nicht unterbrochen sein sollten. Zu programmieren ist die Möglichkeit der Wiederherstellung des Zustandes des Systems wenn die Reihe der Jobs doch unterbrochen worden ist. Real-Time Java Specification Beispiel: Unbounded Computations Effektive Nutzung der freien Zeit zwischen Jobs 34 Reference Implementation http://www.timesys.com • Die erste RTSJ Reference Implementation • TimeSys Linux RTOS • JTime Real-Time Java Specification 35 Quellenangabe 1. 2. Bollella G., Brosgol B., Furr S., Hardin D., Dibble P., Golsing J., Turnbull M., "The Real-Time Specification for Java", Addison-Wesley, 2000 Wellings A.J., Puschner P. „Evaluating the Expressive Power of Real-Time Specification for Java”, Real-Time Systems, 24, 2003 Materialien von: • Christos Kloukinas, VERIMAG, Grenoble • David Holmes, DLTeCH Pty Ltd Brisbane, Australia • András Király, Universität Zürich ENDE Real-Time Java Specification 36