Anatomia de Arquiteturas Linux em Tempo Real

Tempo Real: do Soft ao Hard

Não é que o Linux® não seja rápido ou eficaz, mas, em alguns casos, rapidez não basta. Em vez disso, é preciso ter a habilidade de cumprir os prazos finais de modo determinista, com tolerâncias específicas. Descubra as várias alternativas de tempo real do Linux e como elas obtêm o tempo real—das primeiras arquiteturas que simulam soluções de virtualização às opções disponíveis hoje, no kernel padrão 2.6.

M. Tim Jones, Consultant Engineer, Emulex Corp.

M. Tim JonesM. Tim Jones é um arquiteto de firmwares embarcados e autor de Inteligência Artificial: Sistemas de Abordagem, GNU/Linux, Programação de Aplicativos AI (atualmente em sua segunda edição), Programação de Aplicativos AI (em sua segunda edição) e BSD Sockets Programming from a Multilanguage Perspective. Sua formação em engenharia vai desde o desenvolvimento de kernels para nave espacial geossincrônica até a arquitetura de sistema embarcado e o desenvolvimento de protocolos de interligação de redes. Tim é um Engenheiro Consultor para a Emulex Corp. em Longmont, Colorado.


nível de autor Contribuidor do
        developerWorks

15/Abr/2008

Este artigo explora algumas das arquiteturas do Linux que oferecem suporte às características de tempo real e discute o que de fato significa ser uma arquitetura em tempo real. Diversas soluções concedem ao Linux capacidades de tempo real e, neste artigo, serão examinadas as abordagens do thin-kernel (ou microkernel), do nano-kernel e do resource-kernel. Por fim, as capacidades de tempo real no kernel padrão 2.6 são descritas e é mostrado como ativá-las e utilizá-las.

Definindo Tempo Real e seus Requisitos

A seguinte definição de tempo real prepara o cenário para a discussão das arquiteturas em tempo real do Linux. Esta definição é de Donald Gillies em Realtime Computing FAQ (consulte Recursos para obter um link):

Um sistema em tempo real é aquele no qual a exatidão dos cálculos não só depende da precisão lógica desses cálculos, como também do tempo em que se produz o resultado. Se as restrições de tempo do sistema não são atendidas, dizemos que houve falha no sistema.

Em outras palavras, o sistema deve ser determinista, a fim de garantir o comportamento de tempo diante de carregamentos variáveis (do caso de menor importância para o mais grave). Observe que a definição acima não diz nada sobre desempenho, porque o tempo real não trata de rapidez e sim de previsibilidade. Por exemplo, ao usar um processador rápido e moderno, o Linux pode oferecer uma típica resposta de interrupção de 20μs, mas, às vezes, essa resposta pode demorar muito mais. Eis o problema fundamental: Não é que o Linux não seja rápido ou eficaz; ele só não é determinista.

Alguns exemplos demonstrarão o que tudo isso significa. A figura 1 mostra a medida de um tempo de latência de interrupção. No caso de uma interrupção (o evento), a CPU é interrompida e entra em processamento de interrupção. Há um certo trabalho para determinar que evento ocorreu e, depois disso, é feito dispatch da tarefa solicitada, para lidar com o evento (uma comutação de contexto). O tempo entre a interrupção e o dispatch da tarefa requerida (supondo que o dispatch seja da tarefa de maior prioridade) é chamado de tempo de resposta. Para o tempo real, o tempo de resposta deve ser determinista e operar no caso mais grave de tempo conhecido.

Comutação de Contexto

No processo de dispatch de uma nova tarefa com base em uma interrupção está implícita uma comutação de contexto. Trata-se do processo de armazenar o estado atual de uma CPU no momento da interrupção e, em seguida, recuperar o estado de uma determinada tarefa. O que forma uma comutação de contexto é uma função do sistema operacional e da arquitetura subjacente do processador.

Figura 1. Latência de Interrupção e Tempo de Resposta
Latência de Interrupção e Tempo de Resposta

Um exemplo útil desse processo é o airbag padrão dos veículos atuais. Quando o sensor que informa a colisão de um veículo interrompe a CPU, o sistema operacional deve fazer dispatch rapidamente da tarefa que aciona o airbag em vez de permitir a interferência de outro processamento que não seja em tempo real. Um airbag acionado um segundo depois do tempo devido é pior do que não ter airbag.

Além de trazer o determinismo a um processo de interrupção, o planejamento de tarefas que oferece suporte a intervalos periódicos também é necessário nos processamentos em tempo real. Considere a Figura 2. Ela demonstra um planejamento de tarefas periódico. Muitos sistemas de controle exigem amostras e processamentos periódicos. Em um período definido (p), uma tarefa específica deve executar a estabilidade do sistema. Imagine um veículo com sistema de freios ABS. Este sistema de controle obtém amostras da velocidade de cada roda em um carro e controla a pressão de cada freio (para evitar travamento) em até 20 vezes por segundo. Para que o sistema de controle funcione, a amostragem e o controle do sensor devem ser efetuados em intervalos periódicos. Isso quer dizer que outros processos devem ter precedência, a fim de permitir que a tarefa ABS seja executada nos períodos desejados.

Figura 2. Planejamento de Tarefa Periódica
Planejamento de Tarefa Periódica

Sistemas em Tempo Real: Hard Vs Soft

Um sistema operacional que pode oferecer suporte aos prazos finais desejados das tarefas em tempo real (mesmo nos casos mais graves de carregamento de processos) é chamado de sistema em tempo real hard. Mas nem sempre o suporte em tempo real hard é necessário. Se um sistema operacional pode oferecer suporte à média dos prazos finais, ele é chamado de sistema em tempo real soft. Nos sistemas em tempo real hard, a perda do prazo final pode levar a resultados desastrosos (como o acionamento tardio do airbag ou a pressão dos freios ter um lapso grande demais). Os sistemas em tempo real soft podem perder os prazos finais sem que haja falha geral no sistema (como a perda de um quadro de vídeo).

Agora que já possui algumas noções sobre as necessidades do tempo real, vejamos algumas arquiteturas em tempo real do Linux para saber a quais níveis de tempo real elas oferecem suporte e como.


Abordagem Thin-kernel

A abordagem thin-kernel (ou microkernel) utiliza um segundo kernel como interface de abstração entre o hardware e o kernel Linux (consulte a Figura 3). O kernel Linux que não trabalha em tempo real é executado em segundo plano como uma tarefa de baixa prioridade do thin kernel e hospeda todas as tarefas que não sejam em tempo real. As tarefas em tempo real são executadas diretamente no thin kernel.

Figura 3. A Abordagem Thin Kernel ao Tempo Real Hard
A Abordagem Thin Kernel ao Tempo Real Hard

A utilização principal do thin kernel (além de hospedar as tarefas em tempo real) é o gerenciamento das interrupções. O thin kernel intercepta as interrupções para assegurar que o kernel que não seja em tempo real não possa preceder a operação do thin kernel. Isto permite que o thin kernel forneça suporte em tempo real hard.

Embora a abordagem do thin kernel tenha suas vantagens (a coexistência entre o suporte em tempo real hard e um kernel Linux padrão), ela apresenta desvantagens. As tarefas em tempo real e as que não são em tempo real são independentes, o que pode dificultar a depuração de erros. As tarefas que não são em tempo real também não oferecem suporte completo à plataforma Linux (é por isso que a execução do thin kernel se chama thin ).

Como exemplos desta abordagem, temos RTLinux (agora propriedade do Wind River Systems), Real Time Application Interface (RTAI) e Xenomai.


Abordagem Nano-kernel

Enquanto a abordagem thin kernel conta com um kernel minimizado que inclui gerenciamento de tarefas, a abordagem nano-kernel dá um passo adiante ao minimizar ainda mais o kernel. Passa, assim, a ser menos um kernel e mais uma Hardware Abstraction Layer (HAL). O nano-kernel fornece ao hardware o compartilhamento de recursos para vários sistemas operacionais funcionando em uma camada mais alta (consulte a Figura 4). Como o nano-kernel abstrai o hardware, pode fornecer uma priorização para sistemas operacionais de camadas mais altas e, portanto, oferecer suporte em tempo real hard.

Figura 4. A Abordagem Nano-kernel à Abstração do Hardware
A Abordagem Nano-kernel à Abstração do Hardware.

Observe as semelhanças entre essa abordagem e a abordagem de virtualização para executar vários sistemas operacionais. Neste caso, o nano-kernel abstrai o hardware a partir dos kernels em tempo real e dos que não são em tempo real. Isto é similar à forma como os hypervisores abstraem o hardware vazio dos sistemas operacionais convidados. Consulte Recursos para obter informações adicionais.

Um exemplo da abordagem nano-kernel é o Adaptive Domain Environment for Operating Systems (ADEOS). O ADEOS oferece suporte a vários sistemas operacionais concorrentes que estejam executando simultaneamente. Quando ocorrerem eventos de hardware, o ADEOS consulta cada sistema operacional de uma cadeia para verificar qual irá lidar com o evento.


Abordagem Resource-kernel

Outra arquitetura de tempo real é a abordagem resource kernel. Ela inclui um modulo a um kernel para fornecer reservas a vários tipos de recursos. As reservas garantem acesso a recursos de sistema multiplexados por tempo (CPU, rede ou largura de banda de disco). Esses recursos apresentam diversos parâmetros de reserva, como o período de repetição, o tempo de processamento exigido (ou seja, o tempo necessário para o processamento) e o prazo final.

O resource kernel oferece um conjunto de Interfaces de Programação de Aplicativos (APIs) que permitem às tarefas solicitar essas reservas (consulte a Figura 5). O resource kernel pode, então, unir as solicitações para definir um planejamento, de modo a fornecer acesso garantido por meio de limitações definidas por tarefa (ou retornar um erro se elas não puderem ser garantidas). Ao utilizar um algoritmo de planejamento como o Earliest-Deadline-First (EDF), o kernel pode então ser utilizado para lidar com a carga de trabalho dinâmica do planejamento.

Figura 5. A Abordagem do Resource Kernel à Reserva de Recursos
A Abordagem do Resource Kernel à Reserva de Recursos

Um exemplo de uma implementação de resource kernel é o Linux/RK da CMU, que integra um resource kernel portátil no Linux como um módulo carregável. Essa implementação evoluiu para a oferta comercial TimeSys Linux/RT.


Tempo Real no Kernel Padrão 2.6

Apesar de todas as abordagens discutidas até aqui serem interessantes do ponto de vista arquitetural, todas operam perifericamente ao kernel. Em vez disso, e se o kernel Linux padrão incorporasse as mudanças necessárias para oferecer suporte em tempo real?

Hoje, no kernel 2.6, é possível obter o desempenho em tempo real soft por meio de uma configuração simples de kernel, deixando-o prevalecer completamente (consulte a Figura 6). No kernel Linux 2.6 padrão, quando um processo de espaço de usuário faz uma chamada para o kernel (por meio de uma chamada de sistema), ele não pode prevalecer. Isto significa que, se um processo de baixa prioridade faz uma chamada de sistema, um processo de alta prioridade precisa esperar até o término dessa chamada antes de obter acesso à CPU. A nova opção de configuração CONFIG_PREEMPT altera esse comportamento do kernel permitindo que os processos prevaleçam se um trabalho de alta prioridade estiver disponível (mesmo se o processo estiver no meio de uma chamada de sistema).

Figura 6. Prevalência do Kernel Linux 2.6 Padrão
Prevalência do Kernel Linux 2.6 Padrão

Esta opção de configuração tem no entanto, um trade-off. Apesar de a opção permitir o desempenho em tempo real soft e mesmo sob carga fazer com que o sistema operacional execute mais uniformemente, isso é feito com um custo. Esse custo é um rendimento levemente mais baixo e uma pequena redução no desempenho do kernel por causa da sobrecarga incluída pela opção CONFIG_PREEMPT. Essa opção é útil para desktop e sistemas embarcados, mas talvez não seja a correta em todos os cenários (por exemplo, servidores).

O Novo Planejador O(1)

O novo planejador O(1) no kernel 2.6 é um ótimo benefício ao desempenho, mesmo quando houver um grande número de tarefas. Esse novo planejador pode operar em tempo limitado, independentemente da quantidade de tarefas a executar. É possível ler mais sobre esse planejador e como ele funciona na seção Recursos.

Outra opção de configuração útil no kernel 2.6 é para cronômetros de alta resolução. Ela permite que os cronômetros operem a partir da resolução de 1μs (se o hardware adjacente fornecer suporte) e também implementa o gerenciamento de cronômetro, com uma árvore red-black para eficácia. Ao usar a árvore red-black, podem ser ativados inúmeros cronômetros sem afetar o desempenho do subsistema do cronômetro (O(log n)).

Com um pouco de esforço, é possível obter suporte em tempo real hard com a correção PREEMPT_RT. A correção PREEMPT_RT fornece várias modificações para produzir suporte em tempo real hard. Determinadas modificações incluem reimplementar algumas das primitivas de bloqueio do kernel, tornando-as totalmente preventivos, implementar a herança de prioridade para mutexes no kernel e converter manipuladores de interrupção em encadeamentos de kernel, deixando-os totalmente preventivos.


Resumo

O Linux não é somente a plataforma perfeita para experimentação e caracterização de algoritmos em tempo real; também é possível encontrar tempo real no Linux atual, no kernel padrão 2.6 disponível no mercado. É possível obter desempenho em tempo real soft pelo kernel padrão ou, com um pouco mais de trabalho (correção do kernel), é possível criar aplicativos em tempo real hard.

Este artigo deu uma breve visão geral de algumas das técnicas utilizadas para trazer ao kernel Linux a computação em tempo real. Diversas tentativas anteriores usavam uma abordagem thin-kernel para separar as tarefas em tempo real do kernel padrão. Posteriormente, as abordagens nano-kernel surgiram, parecendo-se muito com os hypervisores utilizados hoje em dia nas soluções de virtualização. Por fim, o kernel Linux oferece seu próprio meio de tempo real, soft e hard.

Embora este artigo seja uma visão superficial dos métodos em tempo real para Linux, a seção Recursos oferece informações adicionais sobre como obter informações adicionais e outras técnicas úteis em tempo real.

Recursos

Aprender

  • No artigo "Virtual Linux" (developerWorks, dezembro de 2006) de Tim, saiba como as abordagens de tempo real thin-kernel e nano-kernel pegam emprestados elementos das arquiteturas de virtualização tão populares e úteis hoje.
  • No artigo "Inside the Linux scheduler" (developerWorks, junho de 2006) de Tim, leia mais sobre o planejador O(1) no kernel 2.6.
  • Leia todos os artigos Anatomia de... de Tim no developerWorks.
  • Leia todos os artigos Linux de Tim no developerWorks.
  • O Realtime Computing FAQ é um ótimo lugar para começar a aprender sobre a computação em tempo real. Ele abrange os fundamentos do Portable Operating System Interface (POSIX), sistemas operacionais em tempo real e indicadores de análise em tempo real.
  • "Real-time Control Systems" (PDF) é um tutorial interessante de A. Gambier, que introduz o design dos sistemas de controle em tempo real e discute vários algoritmos de programação.
  • Os procedimentos do 6th Real-time Linux Workshop (de novembro de 2007) inclui documentos e recursos que o ajudarão a explorar a vanguarda do Linux em tempo real.
  • O antigo RTLinux, a RTAI e Xenomai aplicaram a abordagem thin-kernel. Embora o aplicativo tivesse pouca diferença para cada um deles, a abordagem comprovou-se valiosa.
  • ADEOS é uma Hardware Abstraction Layer (HAL), ou nano-kernel, que oferece capacidades em tempo real no kernel Linux. Ele também foi utilizado para o armazenamento em cluster de Multiprocessadores Simétricos (SMP) e para a depuração do kernel.
  • "Portable RK: A Portable Resource Kernel for Guaranteed and Enforced Timing Behavior" descreve um componente que oferece acesso garantido aos recursos multiplexados por tempo (como CPU, rede ou disco) por meio de uma API de reserva.
  • A árvore red-black é uma árvore de procura binária que equilibra a si mesma. Embora o próprio algoritmo seja complexo, ela é bastante eficaz na prática e opera em tempo O(log n).
  • A correção PREEMPT_RT fornece capacidades em tempo real hard em um kernel Linux padrão 2.6. Essas páginas providenciam detalhes em instalação e uso da configuração de RT_PREEMPT, bem como FAQs úteis.
  • Neste cenário de inversão de prioridade, uma tarefa de menor prioridade mantém um recurso exigido por uma tarefa de alta prioridade. (Este problema ocorreu em Mars no Pathfinder probe using Wind River's VxWorks.) A solução deste problema está na herança de prioridade, que aumenta a prioridade de uma tarefa de menor prioridade para permitir que ela seja executada e libera o recurso.
  • A Novell anunciou recentemente sua versão 1.0 de SUSE Linux Enterprise Real-Time (SLERT). Esta distribuição contém atualizações de kernel e suporte em tempo real a POSIX para aplicativos em tempo real. Dois aprimoramentos incluem blindagem de CPU e designações de prioridade emergenciais.
  • Xenomai/SOLO anunciou a migração distante da abordagem co-kernel para uma integração mais íntima com a camada do kernel Linux. Esta abordagem oferece suporte à tradicional programação POSIX (espaço do usuário).
  • Na zona Linux do developerWorks, encontre mais recursos para desenvolvedores Linux e varra nossos artigos e tutoriais mais conhecidos.
  • Consulte todas as dicas de Linux e tutoriais de Linux no developerWorks.
  • Fique atualizado com eventos técnicos e Webcasts do developerWorks.

Obter produtos e tecnologias

Discutir

Comentários

developerWorks: Conecte-se

Los campos obligatorios están marcados con un asterisco (*).


Precisa de um ID IBM?
Esqueceu seu ID IBM?


Esqueceu sua senha?
Alterar sua senha

Ao clicar em Enviar, você concorda com os termos e condições do developerWorks.

 


A primeira vez que você entrar no developerWorks, um perfil é criado para você. Informações no seu perfil (seu nome, país / região, e nome da empresa) é apresentado ao público e vai acompanhar qualquer conteúdo que você postar, a menos que você opte por esconder o nome da empresa. Você pode atualizar sua conta IBM a qualquer momento.

Todas as informações enviadas são seguras.

Elija su nombre para mostrar



Ao se conectar ao developerWorks pela primeira vez, é criado um perfil para você e é necessário selecionar um nome de exibição. O nome de exibição acompanhará o conteúdo que você postar no developerWorks.

Escolha um nome de exibição de 3 - 31 caracteres. Seu nome de exibição deve ser exclusivo na comunidade do developerWorks e não deve ser o seu endereço de email por motivo de privacidade.

Los campos obligatorios están marcados con un asterisco (*).

(Escolha um nome de exibição de 3 - 31 caracteres.)

Ao clicar em Enviar, você concorda com os termos e condições do developerWorks.

 


Todas as informações enviadas são seguras.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=80
Zone=Linux
ArticleID=382585
ArticleTitle=Anatomia de Arquiteturas Linux em Tempo Real
publish-date=04152008