Você está na página 1de 1

Shell Paralelo | PROGRAMAÇÃO

Lançador dinâmico
O esquema mostrado no exemplo 4
é opcional se o tempo de processa-
mento médio para cada item não
variar muito. Porém, não se deve
confiar muito nesse modelo. Por
exemplo, ao converter várias faixas
de um CD, os diferentes compri-
mentos de cada uma farão com que
alguns processos terminem antes dos
outros. Outra situação em que essa
abordagem pode ser problemática
é a conversão de imagens a partir
de uma câmera digital. Algumas câ-
meras criam arquivos de miniatura
ou JPEG além dos arquivos raw. Se
cada um dos demais arquivos usar Figura 1 A saída do sar mostra a carga em todos os processadores. A
o formato raw e precisar ser con- paralelização só faz sentido se alguns núcleos estiverem sobrecarre-
vertido, metade dos processos de gados enquanto outros estiverem ociosos.
conversão terminarão muito antes
porque o esquema de processamento no script acontecerem em sequência, as tarefas e as distribui da forma mais
atribui todos os arquivos raw a um não faz sentido esperar até que todos inteligente possível para os auxilia-
único processo e todos os arquivos sejam criados e então distribuí-los res. Em contraste com as soluções
JPEG a outro. pelos processos. paralelas demonstradas anterior-
O método de processamento no A solução para esse problema é mente, em que todos os processos
exemplo 4 também será prejudicado usar processos auxiliares e um lan- auxiliares precisavam receber todos
se nem todos os argumentos forem çador dinâmico. Nesse cenário, o os argumentos no início, o lançador
declarados com antecedência. Se os script dispara certo número de pro- repassa-os aos auxiliares depois que
argumentos gerados posteriormente cessos auxiliares. O lançador aceita eles iniciaram.
Pipes nomeados (named pipes)
e FIFOs são utilizados como ca-
nais de comunicação. No início, o
lançador abre um pipe para cada
auxiliar e envia novas tarefas para
esse pipe (figura 2). Outro pipe é
compartilhado pelo lançador e pe-
los auxiliares e age como um canal
de retorno. Quando um auxiliar
se torna ocioso, escreve seu ID no
pipe. O lançador lê o ID do auxiliar
no pipe após cada tarefa e envia a
próxima tarefa para ele.
O exemplo 5 mostra uma imple-
mentação desse conceito. Nas linhas
1 a 4, o programa define algumas
constantes caso isso ainda não tenha
sido feito. Normalmente, o usuá-
rio define apenas a variável _cmd. A
função dispatchWork nas linhas 54 a
72 é a parte pública da interface. A
Figura 2 O lançador e os processos auxiliares usam pipes para se comunica- função começa criando um diretório
rem. temporário para todos os pipes na

Linux Magazine #51 | Fevereiro de 2009 75

Você também pode gostar