Download Document

Survey
yes no Was this document useful for you?
   Thank you for your participation!

* Your assessment is very important for improving the workof artificial intelligence, which forms the content of this project

Document related concepts

Stream processing wikipedia , lookup

Thread (computing) wikipedia , lookup

Supercomputer architecture wikipedia , lookup

Scheduling (computing) wikipedia , lookup

Java (programming language) wikipedia , lookup

C Sharp (programming language) wikipedia , lookup

Java performance wikipedia , lookup

Transcript
Real-Time Java
Angelo Corsaro
[email protected]
Department of Computer Science
Washington University
One Brookings Drive Box 1045
St. Louis MO, 63130 USA
Outline
 Introduction
 Real-Time Java Basics
 Generative Programming
 Performances
 Concluding Remarks
State of the Art
 Most of the real-time embedded systems are currently developed
in C, and increasingly also in C++
 While writing in C/C++ is more productive than
assembly code, they are not the most productive or
error-free programming languages
 C++ is a feature rich, complex language with a steep learning
curve, which makes it hard to find and retain experienced real-time
embedded developers who are trained to use it well
 It is becoming increasingly difficult to find C/C++ programmers
or to retain them
 Companies are starting to struggle with the maintenance costs pf
C/C++ applications
State of the Art
 Java is gaining wide acceptance in different application domains
thanks to its:
 Safety
 Simplicity
 Productivity
 It is becoming relatively easy to find well trained Java
Programmers
 There is the diffused and increasing perception that Java is “Fun”
and C/C++ is not
 Due to its productivity and maintainability, Java is becoming more
and more appealing to the embedded and (soft) real-time market.
Java Limitations

Conventional Java is unsuitable for developing real-time
systems
 The scheduling of Java threads is purposely
under-specified (so to allow easy
implementation of JVM on as many platform as
possible)
 The GC can preempt for unbounded amount of time
Java Threads
 Java provides coarse-grained control over memory allocation, and
it does not provide access to raw memory
 Java does not provide high resolution time, nor access to signals,
e.g. POSIX Signals
Java Limitations

Conventional Java is unsuitable for developing real-time
systems
 The scheduling of Java threads is purposely
under-specified (so to allow easy
implementation of JVM on as many platform as
possible)
 The GC can preempt for unbounded amount of time
Java Threads
 Java provides coarse-grained control over memory allocation, and
it does not provide access to raw memory
 Java does not provide high resolution time, nor access to signals,
e.g. POSIX Signals
What’s the real problem in making Java
Real-Time?
Java and Garbage Collection
 One of the main hurdle for making Java usable in Real-Time
systems comes from its garbage collected nature
 While developer like the facilities provided by the GC, they
cannot afford the unpredictability that they introduce
 At one extreme some Garbage Collectors (GC) work in a stop
the world and collect fashion
Garbage Collection
Processors
P2
P1
time
 Recently, some Garbage Collection algorithms have been
proposed that reasonably bound the delay experienced by the
mutator, however these require either extra hardware, or double
extra heap space or both
Java and Garbage Collection
 The Expert Group that designed the Real-Time Specification for
Java, was faced with the problem of providing automatic
memory management which would be usable by real-time
applications
 Based on the state of the art of GC algorithms, the Expert
Group decided to provide a safe way of circumventing the GC,
while maintaining automatic memory management
 To make the problem more challenging, one of the
requirements was that no extension to the language syntax
was allowed
 As described next, the Expert Group based its solution on
Memory Regions
Road Map
 Introduction
 Real-Time Java Basics
Real-Time Java

The Real-Time Specification for Java (RTSJ) extends Java in the following
areas:
 New memory management models that can be used in lieu of garbage collection
 Access to physical memory
 Stronger semantics on thread and their scheduling
 Asynchronous Event handling mechanism
 Scheduling Service
 Timers and Higher time resolution
Real-Time Java

The Real-Time Specification for Java (RTSJ) extends Java in the following
areas:
 New memory management models that can be used in lieu of garbage collection
 Access to physical memory
 Stronger semantics on thread and their scheduling
 Asynchronous Event handling mechanism
 Scheduling Service
 Timers and Higher time resolution
Real-Time Java

The Real-Time Specification for Java (RTSJ) extends Java in the following
areas:
 New memory management models that can be used in lieu of garbage collection
 Access to physical memory
 Stronger semantics on thread and their scheduling
 Asynchronous Event handling mechanism
 Scheduling Service
 Timers and Higher time resolution

The RTSJ does not extend syntactically the Java language, but simply
strengthen the semantics of certain Java features, and adds libraries
classes
RTSJ Memory Model

RTSJ extends the Java memory model by providing memory areas other
than the Heap

The model used by the RTSJ is inspired to Memory Regions

These memory areas are characterized by
 Lifetime of the object allocated within the memory area, and
 The allocation time

Objects allocated in the ImmortalMemory are guaranteed to exist as long as
the JVM

Objects allocated in Scoped Memories are not garbage collected; instead a
reference counted mechanism is used to detect when all the objects
allocated in the scope can be reclaimed
Scoped Memory Access Rules
 The rules that govern the access to the scoped memory are the
following:
 Only Real-Time Threads can allocate memory in a region different
than the heap
 A new allocation context or scope is entered by calling the
MemoryArea.enter() method or by starting a new real-time thread
whose constructor was given a reference to a scoped memory
instance
 Once a scoped memory is entered all the subsequent use of the new
operator will allocate memory from the current scope
 When the scope is exited by returning from the MemoryArea.enter()
all subsequent use of the new operator will allocate memory from the
enclosing scope
 A Real-Time Thread thread is associated with a scope stack
containing all the memory areas that the thread has entered but not
yet exited
Scoped Memory Behaviour Rules
 The rules that govern the scoped memory behaviour are the
following:
 Each instance of the class ScopedMemory has to maintain a
reference count of the number of threads active in that instance
 When the reference count of the ScopedMemory drops to zero, all
the objects in the area are considered unreachable and candidates
for reclamation
 Each ScopedMemory has at most one parent defined as follows. For
a ScopedMemory pushed on a scope stack its parent is the first
ScopedMemory below in on the stack if it exists the primordial
scope otherwise. A scope that is not pushed on any stack ha no
parent
Single Parent Rule
 The RTSJ defines the single parent rule so to make sure that a
thread can only enter scopes that will live at least as much as
the outer scopes
 The single parent rule is enforced at the point in which a realtime thread tries to enter a scoped memory.
 Traditional algorithms have O(n) time complexities, Corsaro
and Cytron have recently shown how to perform this test in
O(1)
Memory Reference Rules

The RTSJ imposes a set of rules
that govern the validity of
references across memory areas:
 A reference to an object allocated in
a ScopedMemory cannot be allocated
in the Java heap or in the Immortal
memory
 A reference to an object allocated in
a ScopedMemory m can be stored in
an object allocated in a
ScopedMemory p only if p is a
descendant scope of m

Memory reference checks are
performed potentially at each store
so the algorithm used to performs
the checks should be predictable
and efficient
Scoped Memory: An Example
import javax.realtime.*
public class SMSample {
public static void main(String[] args) {
Runnable logic = new Runnable() {
public void run() {
MemoryArea ma2 = new LTMemory(128 * 1024, 128 * 1024);
Runnable nestedLogic = new Runnable(){
public void run() {A a = new A();}
};
m2.enter(nestedLogic);
}
};
MemoryArea ma1 = new LTMemory(512 * 1024, 512 s* 1024);
RealtimeThread rtThread =
new RealtimeThread(null, null, null, ma1, null, logic);
rtThread.start()
}
}
Memory Reference Checking

Every compliant JVM has to perform
memory reference checks in order to
maintain Java safety, avoiding memory
leaks and dangling pointers

Some memory reference checking can
be eliminated at compile time by pointer
escape analysis

Undecidability issues imply that some,
perhaps many, checks still need to be
performed at run-time

Poor implementation of these checks
could adversely impact performances
and predictability

Solution available on literature were not
suitable for many reasons, mostly
because they would lead to problem in
code timing analysis
Memory Reference Checking

Recently, Corsaro and Cytron have proposed an algorithm based on
type theory for performing this test in O(1), as opposed to the O(n)
solution available in literature
Real-Time Threads

The RTSJ extends the Java threading
model with two new types of thread
 RealtimeThread
 NoHeapRealtimeThread

NoHeapRealtimeThread cannot refer to
any object allocated on the heap. This
make it possible for this kind of thread
to preempt the GC

Real-Time Threads provide facilities for
periodic computations

For a Real-Time Thread it is possible to specify
 Release Parameters
 Scheduling Parameteres
 Memory Parameters

Thread execution is managed by the associated scheduler
Event Handling

The RTSJ defines mechanisms to
bind the execution of program logic
to the occurrence of internal and/or
external events

The RTSJ provides a way to
associate an asynchronous event
handler to some application-specific
or external events.

The AsyncEventHandler class, does not have a thread permanently
bound to it—nor is it guaranteed that there will be a separate thread for
each AsyncEventHandler

The BoundAsyncEventHandler class has a real-time thread associated
with it permanently
Scheduling

The RTSJ provides a policy
independent scheduling framework

Only Schedulable entities are
considered for scheduling and
feasibility purpose

The responsibility of the scheduling
framework are:
 Schedule Schedulable Entities
 Performing Feasibility Analysis

 Schedule appropriate handlers in
 Scheduling Parameteres
 Release Parameters
 Memory Parameters
case of error


Different schedulers can potentially
be used within a running
applications
The default scheduler is a PriorityPreemptive scheduler that
distinguish 28 different priorities
Schedulable entities are
characterized by:

Erroneous situations are handled
by event handler associated with
Release Parameters:
 Overrun Handler
 Deadline Miss Handler
Time and Timers

Real-time embedded systems
often use timers to perform
certain actions at a given time
in the future, as well as at
periodic future intervals

The RTSJ provides two types of
Timers
 OneShotTimer, which generates
an event at the expiration of its
associated time interval, and
 PeriodicTimer, which generates
events periodically

Along with timers the RTSJ provides a set
of classes to represent and manipulate
high resolution time, and specifically
 Absolute Time
 Relative Time
 Rational Time
Outline
 Introduction
 Real-Time Java Basics
 Generative Programming
Does One Size Fits All?

While the RTSJ represents an ambitious
step toward improving the state of the
art in embedded and real-time system
development, there are a number of
open issues

The RTSJ was designed with generality
in mind, while this is a laudable goal,
generality is often at odds with the
resource constraints of embedded
systems
Does One Size Fits All?

While the RTSJ represents an ambitious
step toward improving the state of the
art in embedded and real-time system
development, there are a number of
open issues

The RTSJ was designed with generality
in mind, while this is a laudable goal,
generality is often at odds with the
resource constraints of embedded
systems

Providing developers with an overly general API can actually increase the
learning curve and introduce accidental complexity in the API itself

For example, the scheduling API in RTSJ was designed to match any
scheduling algorithm, including RMS, EDF, LLF, RED, MUF, etc.

While this generality covers a broad range of alternatives it may be overly
complicated for an application that simply needs a priority preemptive
scheduler
Can we do any better then this?
Can we provide the needed flexibility and
extensibility, without putting undue
burden on developers?
The Answer is…
Generative Programming
 Generative Programming aims at building
generative models for families of systems and
generate concrete systems from these models
 Generative Programming brings the benefit of Economies of Scope to
software engineering, where less time and effort are needed to
produce a greater variety of products
Generative Programming
 Generative Programming aims at building
generative models for families of systems and
generate concrete systems from these models
 Generative Programming brings the benefit of Economies of Scope to
software engineering, where less time and effort are needed to
produce a greater variety of products
Classical Approach
Design Space
One System
Generative Programming
 Generative Programming aims at building
generative models for families of systems and
generate concrete systems from these models
 Generative Programming brings the benefit of Economies of Scope to
software engineering, where less time and effort are needed to
produce a greater variety of products
Classical Approach
Generative Programming Approach
Design Space
One System
A Family of
Systems
Design Space
Generative Programming
If we consider the RTSJ scheduling API
example, for instance, application developers
that need a simple priority preemptive scheduler
could use generative programming to specify this
as a requirement. The outcome of the generation
process would then be a Realtime Java platform
that exposed only the API needed for a prioritybased scheduler and whose implementation was
also optimized for priority-based schedulers.

Generative Programming (GP)
makes it possible to develop
Software Systems that are
amenable to customization of
behavior and protocols (e.g.,
APIs), via automatic code
generation and composition

Using a GP approach, the
development of middleware,
such as RTSJ or Real-time
CORBA, need not lead to a single
implementation. Instead, it can
provide a set of components and
configuration knowledge that can
be used to generated a specific
implementation based on userdefined specifications
jRate:The Chameleonic RTSJ
 jRate’s is an extension of the GCJ runtime
system that provides a subset of the RTSJ
features such as:





Realtime Threads
Scoped Memory
Asynchrony
Timers
jRate’s goals:


Use a Generative Programming approach to provide a “Chameleonic” Real-Time
Java, which can adapt to its target environment in term of API and functionalities
AOP techniques will be used to produce an untangled, and “pick what you need”
RTSJ implementation



AspectJ, C++ Templates, Python, will be used to do AOP in the Java and C++ portion of
jRate respectively
Provide higher level programming model to developers
Provide advanced scheduling services
Generative Real-Time Java
A Real-Time Java
Specification
Real-Time Java
Specific Concepts
and Features
Configuration
Knowledge
Generated
Real-Time Java Platform
Outline
 Introduction
 Real-Time Java Basics
 Generative Programming
 Performances
RTJPerf & Tested Platforms




RTJPerf is a benchmarking suite for RTSJ compliant platforms that focuses on
Time-efficiency performance indexes.
RTJPerf provides a series of tests based on synthetic workload
RTJPerf currently covers the following RTSJ areas:
 Memory
 Threading
 Asynchrony
 Timers
RTSJ Reference Implementation, developed by TimeSys
 Provides all the mandatory RTSJ features


jRate, an Open Source RTSJ-based extension of the
GCJ runtime system
Currently provide only a subset of the mandatory RTSJ
features
All test were run on a Pentium III 766MHz running TimeSys Linux/GPL
Allocation Time Test
Objective:
 Determine the allocation time for different kind of ScopedMemory
provided by the RTSJ
Technique:
 Allocate vector of characters for different sizes ranging from 32 to 16K
bytes
Tested Platform:
 RTSJ RI
 jRate
Test Parameters:
 1,000 Sample for each chunk size were collected
Test Statistics 1/3
Test Statistics 2/3
Test Statistics 3/3

As the size of the chunk allocated increases the speedup of jRate’s CTMemory over the
RI LTMemory can be as much as 95.

The CTMemory speedup over the LTMemory grows linearly with the size of the chunk
being allocated
Dispatch Delay Latency
Objective:
 Measure the time elapsed from when an event is fired up to when its
associated handler is invoked
Technique:
 Associate an handler with and AsynchEvent, fire repeatedly in lock
step mode the event. Measure the time elapsed between the firing
of the event and the handler activation
Tested Platforms:
 RTSJ RI, jRate
Test Parameters:
 2,000 samples of the dispatch delay time were collected
Sample Trace

jRate’s AsynchEventHandler
and
BoundAsynchEventHandler
have similar performances

The sample trace shows a
very predictable dispatch
delay for jRate

RI’s
BoundAsynchEventHandler
provide a quite good dispatch
delay latency, but is less
predictable


RI’s AsynchEventHandler expose a strange behaviour (caused
perhaps by a resource leaks associated with thread management)
The Dispatch Latency grows linearly with the number of event fired
Test Statistics

jRate’s handlers have worst
cases performances very close
to the average and 99% case

jRate’s handler behavior quite
predictable, as the low std. dev.
indicates

RI’s BoundAsynchEventHandler
has a 99% behaviour that is
very close to the average case
while the worst case behaviour
is a little bit off.

RI’s AsynchEventHandler
exposes an odd behaviour (as
shown previously), so its data is
not very representative
Concluding Remarks

Real-Time Java is a quite intriguing technology, but there is still quite a bit
of R&D to be done in order to make it sound

Many aero-spatial companies and federal research institution have placed
big bets on Real-Time Java, some of these are:
 BOEING
 NASA
 Air Force Research Laboratory
 DARPA

Generative Programming techniques are an interesting topic, and more
research is needed in this area in order to understand:
 GP Pattern and Pattern Languages
 GP Methodologies
 GP Techniques and Tools

jRate provide a vast playground for experimenting with Real-Time Java
features as well as with GP

GP provides a good balance between flexibility and performance/efficiency
References

jRate Web:
 http://tao.doc.wustl.edu/~corsaro/jRate

Papers on jRate:
 http://tao.doc.wustl.edu/~corsaro/papers.html

Real-Time Java Expert Group
 http://www.rtj.org

Reference Implementation
 http://www.timesys.com

Mailing List
 [email protected]

Related Work





GCJ (http://gcc.gnu.org)
FLEX Compiler, MIT
OVM Virtual Machine, Purdue University
JamaicaVM, European Space Agency
PERC, NewMonics