segunda-feira, 18 de agosto de 2008

O que é Kernel RT?

Algumas distribuições de Linux para Áudio possuem Kernel RT e outras não. O que isto significa?

Um sistema operacional Multi-tarefas
Durante muito tempo os sistemas operacionais não suportavam a execução de vários programas simultaneamente. Estes sistemas operacionais, como o MS-DOS, eram chamados de Mono-tarefa.
Boa parte dos sistemas operacionais atuais permitem a execução de vários programas ao mesmo tempo. É bastante comum que, por exemplo, você esteja navegando na Internet e ouvindo música ao mesmo tempo. Estes sistemas operacionais, como o Linux ou o Windows, são chamados Multi-tarefas.
Bem, sabendo que o seu computador possui apenas um processador, como ele é capaz de executar vários programas ao mesmo tempo? A resposta é simples: Ele não é. Sim, seu computador executa apenas um programa de cada vez, porém, alterna entre os vários programas que estão executando deixando uma fatia de tempo (time slice) para cada um deles. É como o cinema, várias fotos piscando rapidamente dão a impressão de movimento. Vários programas alternando rapidamente dão a impressão de multi-tarefa. A realidade é que apenas um deles irá executar por vez. O responsável por alternar entre as várias tarefas é o sistema operacional, ou mais especificamente, seu escalonador.

O escalonador
O escalonador é uma parte do sistema operacional que irá cuidar da divisão das fatias de tempo (time slice) do processamento entre os vários programas em execução. Há uma série de algoritmos diferentes para escalonamento como, por exemplo, SJF ou FIFO e nem todos trabalham com fatias de tempo. Além de usar fatias de tempo, alguns destes algoritmos de escalonamento tratam os programas em execução com prioridades diferentes. O Linux utiliza esta abordagem. Assim, se um programa for mais importante, ele poderá executar por mais tempo e se ele for menos importante ele executará por menos tempo.

Prioridades
Para garantir que processos (ou tarefas, ou programas) mais importantes executem sempre que for necessário, há a possibilidade de atribuir-lhes uma prioridade maior. Os processos do Sistema operacional, por exemplo, costumam possuir maior prioridade que os processos do usuário. No Linux, os processos mais importantes possuem prioridade 0 (isto mesmo, zero) e conforme este valor cresce a importância do processo diminui. Os programas que não estão executando ficam esperando em uma fila. Os algoritmos de escalonamento fazem uma conta para tentar dividir de uma maneira justa o processador para todos os processos. Quem está esperando a mais tempo, por exemplo, pode ser chamado primeiro que alguém com maior prioridade. Para alterar entre um processo e outro, o escalonador utiliza um recurso chamado preempção.

Preempção
A preenpção é a alternância entre os vários processos da fila. Partimos da idéia de que apenas um deles está no processador. O escalonador pode preemptar um processo que já executou por tempo bastante e garantir com isto a sensação de multi-tarefa. Porém, além dos processos da fila, o usuário também pode requisitar algum processamento. Isto é feito, por exemplo, digitando no teclado ou movendo o mouse pela tela. Isto é chamado de interrupção de Hardware. Logicamente que cada dispositivo tem um endereço (chamado IRQ) que identifica se esta interrupção está vindo do teclado, da placa de rede, do mouse ou da placa de som, por exemplo. O tempo entre você pressionar uma tecla e o computador responder por isto, ou seja, atender a esta interrupção, é o que chamamos de latência.

Latência
Latência, como dito anteriormente, é o tempo que o computador demora para responder quando, por exemplo, uma tecla é pressionada no teclado. Nem todos computadores querem trabalhar com latência baixa. Imagine um servidor da Internet. Normalmente estes computadores não possui nem teclado nem mouse. Usuários não operam estas máquinas e, logicamente, elas não trabalham com preempção forçada. Isto significa que ninguém "fura fila" de execução. Seria o mesmo que dizer: Computador, faça isto. E ele responder: Agora não posso, estou gravando um arquivo. Para um servidor, é mais importante gravar o arquivo. A Latência, neste caso, é bastante alta.
Computadores Desktop trabalham com preempção voluntária do Kernel. Isto significa que, quando há uma interrupção dos usuário, o programa voluntariamente cede seu espaço no processador para que esta seja executada. Talvez ele termine de fazer o que estava fazendo se julgar que isto seja importante. A Latência, neste caso, é menor.
Aplicações que exigem que o tempo de resposta do processador sejam menor necessitam de uma alteração no Kernel do mesmo. Sistemas operacionais como o MacOS e o Windows não permitem alterações em seu Kernel. O Linux permite. Então temos um Kernel preemptível de baixa latência que, como seu próprio nome diz, ele possui uma latência ainda menor devido ao mesmo permitir preempção.
Foi com a intenção de diminuir este tempo de latência que um Húngaro chamado Ingo Molnar, desenvolvedor da Red Hat americana, iniciou o projeto de um Kernel com preempção completa, também chamado de Kernel RT.

Então este é o Kernel RT?
Sim, o Kernel RT foi modificado para permitir preempção completa e acelerar assim o tempo de resposta do processador as interrupções. Você não corre o risco de ouvir do computador "Espera um pouco" quando pedir ao mesmo para executar uma tarefa. Só para exemplificar, um dos parâmetros que o escalonador utiliza para a preempção é o System Timer Resolution. Existe um intervalo de tempo (time slice) para cada tarefa que o processador recebe para fazer. Cada sistema utiliza uns milésimos de segundos para gerenciar estes intervalos de tempo. Assim um sistema gasta 1/n segundos por intervalo; algo como 1/33 para o W95, 1/100 para a série o Windows NT, 1/250 para o Linux padrão e 1/1000 para o Linux com Kernel RT.

E aonde entra a parte Multimídia?
O tempo de resposta do processador afeta especialmente as aplicações gráficas e multimídias, não apenas em velocidade, mas também em qualidade. Com a utilização de um Kernel RT são menores as chances de um programa multipista não conseguir executar suas 18 faixas "simultaneamente". Com o tempo de 0,001 segundos de preempção entre uma faixa e outra fará o resultado final, com certeza, soar como um único som. O mesmo se aplicaria para gravações. É normal em um ambiente de produção musical gravar uma faixa enquanto se ouve outras 5 ou 6.
Devido a utilização mais pesada do processador, o Kernel RT só funciona com processadores mais recentes, não funcionando, por exemplo, com Pentium II.

É devido esta diferença de abordagem que algumas distribuições de Multimídia que possuem a finalidade de trabalhar com produção sonora optam por um Kernel RT e outras, que planejam executar em qualquer tipo de computador, não possuem tal característica.

Fontes:

8 comentários:

Unknown disse...

Bom dia Flávio, achei muito didática a forma que você abordou o tema de Multi-tarefas (escalonador, Preempção, Latência), já estudei este assunto na faculdade, mas nunca havia entidido 100%. Parabens.

diogobaeder disse...

Parabéns, Flávio! Ótimo artigo!
Sou formado em música, mas mexo com Linux atualmente; Uso o Ubuntu Studio, e sempre quis saber mais a fundo a diferença de funcionamento entre o kernel "generic" e o RT... valeu!!! :-)

Luiz Guilherme Hauth disse...

Parabens Flávio, com certeza o Kernel RT faz diferença, qdo se trata de aplicativos de Audio e Video.
Só fazendo um parenteses no seu artigo, realmente no windows não se dá para "modidficar" o time slice em Kernel. Porém no Windows XP, para cima, o Time Slice é definido pela HAL (Hardware abstract layer) de acordo com o Processador (Hardware). Ou seja vc teria um time slice "tunado" para cada processador.
Porém sabesse que processos que rodam em background no windows, costumam ter 36 quantums, o q equivale a 540milisegundos. Portanto, processos que rodam em primeiro plano, devem rodar acima de 36 quantuns, pela lógica, superando os 540milisegundos.

Bom fica aqui pra complementar...
abraço t+

Dj Leandro Leal disse...

Cara passei 3 dias procurando algum site em português ou inglês que me explicasse claramente o que você você explicou. Realmente agora ficou muito claro. Agora da até pra responder a pergunta do meu trabalho de SO1:

"O núcleo do Unix é considerado inapropriado para aplicações de tempo real porque um processo executando e modo protegido não pode ser retirado por outro processo. Comente mais sobre este problema."

Flw kra

QIUEG disse...

cara... muito bom.. muito bom mesmo...
eu adorei esse arrtigo... explicou nao so o q eu queria saber como outras coisas... como preempt...
vlw ae cara nem costumo comentar em blog... mais esse seu mereceu

Caio M. disse...

Cara, eu já tinha lido sobre o assunto em inglês mas a forma como você explicou ficou "mastigadão". Preencheu algumas lacunas no entendimento do assunto. E ainda colocou as fontes de pesquisa. Realmente está de parabéns.

Anônimo disse...

Cara, tu explica muito bem.

tiafoga disse...

Muito legal o artigo, para quem está querendo instalar para testar da uma olhada em : http://www.lcad.inf.ufes.br/wiki/index.php/Criando_Kernel_RT_Ubuntu_12.04