Análise Comparativa dos Ambientes
EmbeddedJava e Real-Time Java
UFRGS/PPGC
Disciplina: Programação com Objetos Distribuídos
B
Aluno: Leandro Buss Becker
Prof.: Cláudio Fernando Geyer
1 Introdução
Atualmente o mercados dos chamados dispositivos embarcados, ou embedded,
abrange uma ampla variedade de consumidores e produtos, incluindo dispositivos
tais como telefones móveis, pagers, PDAs, controladores de
processo, entre outros. Tipicamente, os dispositivos embedded possuem
funcionalidade dedicada, sendo designados estritamente para um conjunto
de tarefas específicas. Projetados para longos períodos de
vida útil e para terem alta confiabilidade, os dispositivos embedded
geralmente são constituídos por microprocessadores de baixa
velocidade com quantidade limitada de memória.
Tipicamente, para alcançar os requisitos de performance e tamanho
da aplicação, os fabricantes de dispositivos embedded
utilizam um sistema operacional de tempo real (RTOS), além de ferramentas
proprietárias, otimizadas para as limitações de memória
apresentadas por estes dispositivos. Com o aumento da maturidade no desenvolvimento
destes sistema, os fabricantes migraram de linguagens de baixo nível,
como o Assembler, para linguagens com maior nível de abstração,
como o C++. Contudo, os programas produzidos nestas linguagens ainda são
altamente dependentes do sistema operacional e da plataforma alvo, o que
dificulta a sua reutilização.
A necessidade de otimizar o processo de desenvolvimento dos sistemas
embedded, através da construção de programas bem estruturados
e com um alto fator de reusabilidade, tem estimulado a utilização
da linguagem Java [1; 7]. Dentre os fatores que contribuem para a sua popularidade,
alguns merecem um maior destaque:
-
Portabilidade: o ambiente de execução Java permite
a construção de programas independentes de plataforma;
-
Reusabilidade: as características de orientação
a objetos e independência de plataforma do Java permitem a migração
direta de módulos de programas;
-
Simplicidade: Java é uma linguagem de fácil aprendizado,
além de eliminar os problemas com ponteiros (fator comum de erro);
-
Segurança: os requisitos de encapsulamento presentes na linguagem
permitem uma execução segura.
Com base nas motivações apresentadas, este trabalho tem por
objetivo avaliar o estado da arte dos dois principais ambientes Java voltados
para a execução em sistemas embedded: o EmbeddedJava
[1-4], da Sun Microsystems, e o Real-Time Java [7-9], da Newmonics
Inc. A organização do mesmo encontra-se da seguinte forma:
na seção 2 são apresentadas e discutidas as principais
características do EmbeddedJava; de modo similar, na seção
3 trata-se do Real-Time Java; já na seção 4
é realizada uma comparação entre os dois ambientes
e finalmente na seção 5 algumas conclusões são
observadas.
2 EmbeddedJava
2.1 Visão Geral
O EmbeddedJava Aplication Environment (EJAE) [1] é
um ambiente para desenvolvimento de aplicações Java voltadas
para dispositivos embedded com restrições severas
de memória. Para alcançar os requisitos destes dispositivos,
o EJAE faz uso de uma nova implementação do conjunto
completo das APIs Java, adaptadas para a execução
em pequenos dispositivos com configurações de memória
limitada. A tecnologia utilizada pelo EJAE é derivada do
PersonalJava
Aplication Environment (PJAE) [2], incluindo as novas APIs
de suporte. A figura 1 ilustra a família de ambientes de desenvolvimento
Java oferecidos pela Sun Microsystems.
Figura 1: Família dos ambientes Java/Sun
Diferentemente das plataformas Java e PersonalJava (que necessitam
do conjunto completo de APIs para executar), o EJAE permite
configurar as APIs de acordo com os requisitos da aplicação,
possibilitando a sua utilização em dispositivos com pequenas
quantidade de memória.
2.2 Arquitetura do EJAE
O EJAE é um ambiente que pode ser definido sob diferentes
pontos de vista. Sob a perspectiva do Java ele oferece um ambiente de execução
para programas. Já do ponto de vista da aplicação,
o EJAE inclui uma biblioteca de classes e uma máquina virtual
Java. Por fim, sob o ponto de vista de um dispositivo consumidor, o EJAE
é um ambiente de execução que roda em um RTOS.
Segundo a especificação do EmbeddedJava [3], podem
ser utilizadas nas aplicações qualquer campo ou método
proveniente das APIs do JDK 1.1.7 (exceto java.applet). Isto permite
ao desenvolvedor utilizar toda a robustez das APIs Java, mas também
oferece a possibilidade de reduzi-las de acordo com as necessidades da
aplicação. Para tanto, a Sun oferece ferramentas de otimização
para criação do ambiente e para conversão do código
em uma representação mais condensada. Uma vez que as aplicações
são escritas na linguagem Java, módulos de programas ou até
uma aplicação completa podem ser posteriormente migradas
para novas plataformas e facilmente reusadas, independente do RTOS ou processador
subjacente. Na figura 2 é exibida a divisão em camadas de
uma aplicação EmbeddedJava.
Figura 2: Camadas de uma aplicação EmbeddedJava
2.3 Desenvolvimento de Aplicações no EJAE
O processo de desenvolvimento de uma aplicação no EJAE
é baseado na construção de uma imagem executável
da máquina virtual e do aplicativo Java para um RTOS alvo.
O ambiente EJAE analisa e compila o código fonte Java e constrói
uma aplicação executável para emular o EJAE nos ambientes
Solaris ou Microsoft Windows NT. A figura 3 ilustra este processo.
Figura 3: Processo de desenvolvimento de uma aplicação
EJAE
Analisando a figura 3, verifica-se que o primeiro passo para o desenvolvimento
de uma aplicação no EJAE é a construção
de um programa que faça referência a alguma das classes da
API do EmbeddedJava. Posteriormente, esta aplicação
servirá de entrada para a ferramenta JavaFilter. Esta última
analisa as dependências estáticas entre os elementos do programa
e a JVM. Como saída é produzida uma lista das classes, campos
e métodos utilizados, que servirá de entrada para o JavaCodeCompact.
O JavaCodeCompact realiza otimizações exaustivas
para reduzir a quantidade de memórias RAM e ROM necessárias
no ambiente da aplicação. Esta ferramenta funciona como um
pré-carregador, antecipando-se a criação das estruturas
internas, eliminando as redundâncias para economizar espaço
e resolvendo as referências simbólicas. As estruturas de dados
produzidas estão no formato de código fonte C, possibilitando
a sua representação de maneira independente de plataforma.
Finalmente, as estruturas de dados produzidas pelas ferramentas são
compiladas, juntamente com qualquer outro código nativo, usando
o compilador C para o sistema operacional do dispositivo alvo. Os códigos
objeto resultantes são linkados para produzir uma imagem executável
compacta do EmbeddedJava., que pode ser inserida na ROM do dispositivo.
O processo citado, considerando a eficiência das ferramentas do
EmbeddedJava,
permite aos fabricantes configurar e construir ambientes de execução
Java altamente otimizados para dispositivos embedded de pequena
quantidade de memória.
2.4 Passos Futuros do EJAE
A tecnologia EmbeddedJava tende a evoluir com a integração
com integração com novas ferramentas como o Jini, apesar
de já existir uma ferramenta denominada Java Embedded Server
[2] que oferece facilidades para a conexão destes dispositivos via
rede. Além disso, já foi lançado uma concorrência
com o objetivo de propor uma padronização para a extensão
das APIs Java, incluindo requisitos para especificação
de requisitos tempo-real. Tais extensões permitirão que aplicações
futuras sejam escritas inteiramente na linguagem Java.
3 Real-Time Java
3.1 Visão Geral
Da maneira original com que Java foi implementada, a mesma não está
apropriada para o desenvolvimento de software tempo-real em sistemas
embedded.
Porém, combinando certas convenções da programação
em Java com técnicas especiais de implementação, é
possível suportar aplicações com vários graus
de confiança, variando deste total garantia - para execução
de restrições hard-real-time - até para a lei
do melhor esforço, não garantida, em restrições
soft-real-time.
Diferente dos ambientes Java tradicionais, o Real-Time Java permite
aos desenvolvedores a escrita de códigos que requisitem o cumprimento
seguro das restrições temporais impostas na aplicação.
Para tanto são oferecidas um conjunto de APIs especiais [9]
provenientes de um ambiente denominado PERC (Portable Executive
for Reliable Control). O cumprimento das restrições
impostas se dá através da implementação de
uma Máquina Virtual Java especial, denominada PERC virtual machine
[8].
3.2 PERC Virtual Machine 1.0
A PERC virtual machine 1.0 (ou simplesmente PERC-VM) é uma
implementação especial da máquina virtual Java 1.0.2.
Isto significa que a mesma pode substituir a máquina virtual projetada
pela Sun em ambientes que necessitam de performance
tempo-real. A PERC-VM possui suporte para as bibliotecas java.lang,
java.net, java.util e java.io, recomendadas para o desenvolvimentos de
aplicações em sistemas embedded.
As principais propriedades da PERC-VM podem ser vistas a seguir:
-
Coletor de lixo tempo-real: o coletor de lixo (garbage collection)
implementado pela PERC-VM possui um controle preciso sobre a fragmentação
de memória produzida. Diferente da máquina virtual tradicional,
esta implementação não deixa falhas entre os trechos
de memória alocados, resultantes da reorganização
conservativa. Os objetos ativos são copiados de modo incremental
para trechos de memória contínuos a fim de eliminar os fragmentos
livres. Outra consideração importante é que o coletor
de lixo pode ser preemptado por uma tarefa de maior prioridade, resumindo
a partir do ponto em que o mesmo foi desescalonado. Isto se opõem
à implementação tradicional, do tipo run-to-completition,
onde o coletor de lixo tem baixa prioridade e, quando escalonado, deve
terminar toda a otimização.
-
Execução determinística: o escalonador da PERC-VM
utiliza uma política de escalonamento round-robin com prioridades
fixas (prioridades não se alteram com o passar do tempo). Além
disso, as filas de espera associadas com os monitores são ordenadas
por prioridade, com o monitor adotando herança de prioridades para
reduzir a problemática da inversão de prioridades.
-
Configuração e customização: uma vez
que cada aplicação possui um conjunto de necessidades próprias,
a PERC-VM pode ser customizada através de ferramentas que minimizam
a quantidade de memória ocupada.
3.3 PERC Real-Time API 1.0
O Real-Time Java (ou simplesmente Java-RT) consiste de uma combinação
de bibliotecas de classes especiais, denominadas PERC API 1.0 [9], juntamente
com protocolos de comunicação padronizados fornecidos pelas
bibliotecas e também de algumas estruturas adicionadas à
sintaxe padrão de Java. A ampliação do Java 1.0.1
é por conta de duas estruturas de controle, que são mostradas
a seguir:
-
Timed: identifica um segmento de código cuja execução
tem tempo limitado ou deadline associado (vide fig. 4a).
-
Atomic: identifica um segmento de código atômico (vide
fig. 4b), i.e. ou a execução é realizada por completo
ou não é efetuada. Adicionalmente, atomicidade implica em
sincronização em termos de objetos dentro do qual o segmento
de código atômico aparece.
Timed(Time.us(30)) {
atomic {
boundedCode();
arbitraryCode();
}
}
a)
b)
Figura 4: Sintaxe adicional inserida na linguagem Java.
Um programa Java-RT consiste de um número arbitrário de
atividades tempo-real, acompanhadas por um número arbitrário
de threads executáveis, que não possuem restrições
temporais associadas. Neste ambiente existem quatro tipos diferentes de
atividades tempo-real, que podem ser individualmente caracterizadas como
cíclicas, esporádicas, espontâneas ou ongoing.
As definições de cada uma destas atividades são mostradas
a seguir:
-
As tarefas periódicas ou cíclicas são invocadas
em períodos regulares fixos durante o decorrer da execução
da atividade de tempo real.
-
As tarefas esporádicas, por outro lado, não têm
um período de execução fixo. Estas tarefas ocorrem
em resposta a eventos externos. Quando as respostas a estes eventos são
processadas dentro de um tempo específico, a tarefa é descrita
como sendo uma tarefa de tempo real esporádica.
-
Tarefas espontâneas são similares às esporádicas
pois também atuam em resposta a eventos externos. Porém não
há limite máximo na freqüência de execução
destas tarefas. O executivo de tempo real permite a execução
deste tipo de tarefa somente se existirem recursos suficientes para tal.
-
As tarefas contínuas ou ongoing, diferentemente dos
outros tipos de tarefas, caracterizam-se por serem suspensas e retomadas,
em vez de reiniciadas a cada período de execução da
atividade.
Uma outra consideração sobre a PERC-VM diz respeito à
plataforma de execução. Embora não seja obrigatória
a utilização de um RTOS, este é necessário
para que sejam aproveitadas todas as propriedades do ambiente no que dizem
respeito ao determinismo das tarefas e aos requisitos temporais. Diante
disso, é esperado que o RTOS ofereça suporte para as seguintes
propriedades: tarefas tempo-real, timers de alta precisão
e semáforos.
3.4 Desenvolvimento de Aplicações PERC
Há duas técnicas para gerar aplicações utilizando
os recursos do ambiente PERC, as quais encontram-se ilustradas na figura
5. A primeira destas técnicas consiste do uso de um pré-processador
Java chamado p2jpp. Este processador traduz as primitivas especiais
de temporização e de atomicidade para Java tradicional. Depois
que o fonte PERC foi traduzido para Java, o mesmo pode compilar em Java
byte-code,
através do compilador tradicional da linguagem. Esta integração
do processador p2jpp com de ambiente de desenvolvimento Java (IDE)
é um trabalho que a NewMonics vem desenvolvendo.
A segunda técnica para a tradução do código
PERC consiste do uso de um compilador especial Java chamado PercolatorTM,
que combina a funcionalidade do p2jpp e do JavaC. A vantagem do
Percolator está na análise adicional do código PERC,
sendo que do código resultante desta análise é gerado
o byte-code em arquivos .class. O propósito desta
análise está na assistência da verificação
do pior tempo de execução (worst case execution time),
sendo eficiente na identificação do segmento de código
que executa este tempo e também na identificação dos
caminhos da execução do pior caso, correspondente a cada
um dos segmentos de código.
Além disso, o código gerado pelo compilador Percolator,
sugere que seja habilitado o tradutor JIT da máquina virtual,
para a geração de um código mais eficiente. Estas
sugestões são representadas como atributos de métodos
Java dentro dos arquivos .class, cuja presença destes atributos
não impede que o código seja executado através da
máquina virtual Java tradicional. Isso só acontece porque
a especificação oficial da máquina virtual Java exige
que ela ignore qualquer atributo não reconhecido.
Figura 5: Processo de Desenvolvimento de uma aplicação
PERC
4 Comparação PERC vs EJAE
Após o estudo dos ambientes apresentados é possível
realizar uma comparação entre as suas principais características,
as quais encontram-se resumidas na tabela 1.
Feature |
PERC 1.0 |
EJAE 1.0.2 |
Dynamic Loading |
Opcional |
Necessário |
Coletor de lixo tempo-real |
Sim |
Não |
Defragmentação do CL |
Sim |
Parcial |
Suporte RMI |
Não |
Sim |
Bibliotecas Java |
lang, util, io, e net
do jdk 1.0.2 |
Todas jkd 1.1.7, exceto java.applet |
Tarefas tempo-real |
Sim |
Não |
Escalonamento |
Round-robin de
prioridade fixa |
Não é especificada, variando
com a implementação |
Tabela 1: Resumo das principais características dos ambientes
estudados
Como principal diferença entre os ambientes cita-se a maneira
como o PERC implementa o coletor de lixos, o que possibilita um bom desenpenho
durante a execução da aplicação. Além
disso, a política de escalonamento adotada permite garantir a satisfação
dos requisitos temporais impostos no programa. Em relação
às bibliotecas utilizadas, considera-se o EJAE mais avançado
pois ao contrário do PERC, faz uso de uma biblioteca Java bastante
atualizada, além de ser otimizada para dispositivos com restrições
de memória. Por fim, cabe salientar que o PERC implementa algumas
primitivas extras para a linguagem Java, o que permite a descrição
de tarefas tempo-real.
5 Conclusões
Ao final deste trabalho verifica-se que o ambiente PERC encotra-se num
estágio de desenvolvimento mais avançado, uma vez que foram
realizadas novas implementações na máquina virtual
Java da Sun a fim de suportar os requisitos temporais e de recursos existentes.
Como desvantagem do PERC em relação ao EJAVA cita-se o fato
do primeiro fazer uso de uma implementação muito antiga do
JVM, o que impede a utilização de novos recursos como o RMI.
Desta forma, idealiza-se que o ambiente ideal seja uma unificação
dos ambientes pesquisados.
6 Bibliografia
[1] Technical Overview of EmbeddedJava Technology. Http ://java.sun.com/products/
embeddedjava/overview.html
[2] Overview of PersonalJava Technology. Http://java.sun.com/marketing/
collateral/pjava_ds.html
[3] EmbeddedJava Application Environment Specification. http://java.sun.com/products/
embeddedjava/spec/ejae-spec.html
[4] EmbeddedJava 1.0.2 Software Documentation.
[5] FOOTE, W. Teory versus Practice in Real-Time Computing with
the Java Platform. Panel I of the Second IEEE Symposium on Object-Oriented
Real-Time Distributed Systems. Saint-Malo - Fr, 1999. pp. 105-108.
[6] MELLO, R.; MORON, C.. Análise dos Mecanismos de Tempo-Real
em Java.
II Workshop Brasileiro de Sistemas de Tempo Real. Salvador - BA.
[7] PERC FAQ. http://www.newmonics.com/about/Faq/faq.html
[8] Issues in the Design and Implementation of real-time Java. http://www.newmonics.com/
pdf/RTJI.ps
[9] PERC Real-Time API. http://www.newmonics.com/pdf/perc_api.pdf