Embedded applications, such as controlling a device like a cell phone or
a heart pump, can require real-time (RT) programming. (RT
requirements, of course, can also be applied to non-embedded systems.)
Real-time essentially means providing both periodic services and
responses to asynchronous demands within strictly enforced deadlines.
A real time system is said to be deterministic, meaning it
can be relied upon to execute a given task in a predictable amount
of time, every time it is called.
Note that a real-time system is not necessarily
"real fast." What matters most is that the time taken to complete
a task is guaranteed to stay within a known maximum allowed time,
i.e. a worst-case delay.
It is common to classify systems as hard real-time
or soft real-time. The hard RT systems will never miss a
deadline while soft RT tolerates some degree of delay and missed
deadlines. A soft RT system degrades rather than fails.
Its common that one part of software system is
hard RT while most of it is soft. For example, a program controlling
the communications in a cell phone might need to heed hard RT requirements
while the graphics user interface on the phone's LCD screen could
tolerate some delays.
With reasonable care in the coding and tuning,
a program using J2SE or J2ME code can provide acceptable soft real-time
performance such as responding quickly enough to inputs on a graphical
user interface to satisfy usability requirements. However, for hard
real-time tasks Java requires special techniques and/or extensions
to the standard set of packages. For example, one technique has
been to connect Java to C/C++ programs via JNI (see Chapter
22) to carry out the most time critical tasks.
Garbage
Collection vs. Real-Time
The most critical obstacle to real-time processing with Java comes from
the Garbage
Collector (GC). The GC thread works in the background to manage
the allocation of memory. The GC provides memory to new objects
and reclaims memory from objects no longer referenced by any variables.
The GC relieves the programmer from the burden of memory management
and is often cited as one of the primary advantages of Java programming.
However, for real time applications the uncertainty as to when the GC will
run and for how long is unacceptable. A process responding to a
critical request cannot stop what it is doing and begin running
the GC. . The JVM specification does not require a particular type
of GC algorithm, and many such algorithms are not deterministic.
One drastic option is simply to turn the GC off. For example, the Javelin Stamp processor,
which we will discuss later, eliminates the GC entirely. The drawback
obviously is that the user must then take responsibility
for all memory management. In particular, the creation of objects
and arrays must be very carefully monitored and restricted by the
program to avoid running out of memory.
Another technique is to invoke System.gc()
during free periods when critical processing isn't required. Though
not required to do so, most JVMs run the GC immediately when this
method is invoked. If the programmer also insures that there is
sufficient memory available for new objects (otherwise the GC will
run to free up memory), then the GC will not interfere with the
real-time activities.
There are several commercial real-time JVMs available. For example,
NewMonics provides
its PERC JVM, which is compatible with JDK 1.3 and works with several
real-time operating systems. The Jamaica VM from Aicas
"provides hard real-time guarantees for all features of the languages
together with high performance runtime efficiency".
Incremental collection is a common technique used to create a real-time
compatible GC. Unlike many GC algorithms that must either fully
complete their pass through the memory or start over from the beginning
if they are interrupted, an incremental GC works in short steps
and thus allows for interruptions in between the steps. The JVMs
from NewMonics and Aicas, for example, use incremental GC.
The Real
Time Specification for Java (RTSJ)
The JVM specifications do not preclude enhancements needed to provide real-time
performance and work on the Real Time Specification for Java
(RTSJ) began in 1998 by a group in the Java Community Process (jcp.org)
and they finished in 2003. Details of the specification can be found
at www.rtj.org.
The RTSJ extension classes come via the javax.realtime
API. (Note that standard Java programs can run without modification in a real-time
JVM.) The company TimeSys (www.timesys.com) provides the
reference implementation of the RTSJ.
The RTSJ does not specify a particular GC algorithm such as incremental
collection. It does define new types of memory areas that allow avoidance of
the GC altogether. Immortal memory holds objects without destroying them except
when the program ends. Scoped memory is used only while a process works within a particular
section, or scope, of the program such as in a method. Objects there
are automatically destroyed when the process leaves the scope.
Neither immortal nor scoped memories are garbage collected, so using
them avoids the problems of GC interference. Note, however, that
the programmer must watch out for overflow of the immortal memory.
Another important aspect of the RTSJ was the addition of real-time
threads, which provide for more precise scheduling
than with standard threads. They have 28 levels of priority and
their priority is strictly enforced. They are not subject to so-called
priority inversion situations where a lower priority thread has
a block on a resource needed by the higher priority thread and thus
prevents the higher priority thread from running. Furthermore, the
RTSJ includes non-heap real-time threads that cannot be interrupted
by the GC.
The RTSJ also provides for asynchronous event handlers that
deal with external events (or happenings, as they are called,
to distinguish them from the events in the AWT). Asynchronous
transfer of control allows one thread to interrupt another thread
in a safe manner, unlike the deprecated suspend()
and stop()
methods for standard threads.
Timing is obviously important for real-time programming so the javax.realtime
API includes the abstract class HighResolutionTime
and its subclass AbsoluteTime,
which represents a point in time, and RelativeTime,
which represents a duration. The base class uses a long
value for milliseconds and an int
value for nanoseconds. Unlike standard Java, RTSJ requires that
an implementation provide sub-millisecond precision. (Of course,
the accuracy will vary according to the capability of the clock
on a particular system.)
While still maintaining security protections, the RTSJ allows direct
access to physical memory. This means that device drivers can
be created with Java. Previously, Java had to link to native
code to communicate directly with hardware.
Full implementations of the RTSJ specification can be too large for
some embedded systems and not all of its capabilities are required
for every real-time application. So some Java real-time systems
use subsets of the RTSJ or they use independent extensions to obtain
a smaller memory footprint.
Real-time programming in Java, and in general, can be considerably
more challenging than non-RT programming. A number of complex topics
and techniques are involved and careful timing measurements and
testing are required. See the book by Dibble and the other real-time
references for more information.
References & Web Resources
- Real Time Java Working Group - www.rtj.org.
- Sione Palu, Real-time
Specification for Java (RTSJ), Gamellan - developer.com.
- RT OS:
- Edward J. Correia, Real
Time Java Takes Flight: New and pending specifications aim to
simplify embedded development, broaden device compatibility,
SD Times, August 1, 2003.
- Peter C. Dibble, Real-Time Java Platform Programming,
Sun Microsystems, Inc., 2002.
- Brian Goetz, A
brief history of garbage collection, IBM DeveloperWorks,
2003.
- Tuning
Garbage Collection with the 1.4.2 Java[tm] Virtual Machine,
Sun Microsystems, Inc.
- Greg
Bollella on Controlling Physical Systems with Real-time Specification
for Java: Combining Real-time and Non-real-time Operations on
a Single Processor, System News, Vol. 75, Issue 4, May
24, 2004.
- javolution.org
- this open source project provides "a time-predictable standard
library".
- jscience.org
- extensive math and science class library that builds on the
javaolution RT library.
Latest update: Dec. 14, 2004
|