terça-feira, 22 de novembro de 2011

Unix

Sistemas multitarefa e preemptividade

Frequentemente, alunos de computação ou de sistemas manifestam certas dúvidas com relação à multitarefa e preemptividade. Por isso, resolvi postar aqui no blog sobre este assunto.

Sistemas UnixTM são sistemas multitarefa, ou seja, executam mais de uma tarefa simultaneamente. Executar mais de uma tarefa em um mesmo processador pode parecer milagre mas é o que parece ao usuário quando as tarefas são executadas em pequenos lotes controlados pelo kernel do sistema operacional (SO). Normalmente, podemos ter dois tipos de multiprocessamento: o colaborativo e o preemptivo.

O processo colaborativo é um processo que emula o multiprocessamento. Ele acontece quando um aplicativo gerencia os processos fazendo a paginação de memória para interromper um deles e rodar o outro. Neste caso, se algum processo bloqueia o aplicativo todos os outros processos tem que ser terminados pois ficam interdependentes, ou seja: tela azul!

O modelo de multiprocessamento preemptivo é um pouco mais elaborado. O kernel do SO estabelece um "quantum" de tempo para cada processo dentro do processador. Enquanto isso, o kernel mantém um registro de todos os processos na memória com uma hierarquia de dependência de cada segmento (thread).

O comando 'ps' do Unix mostra isto:


...
2438 ?     SN  0:08 /usr/bin/nepomukservicestub nepomukontologyloader
2458 ?     Sl  3:16 /usr/lib/firefox-8.0/firefox
2488 ?     S   0:00 /usr/lib/mozilla/kmozillahelper
2497 ?     Sl  0:39 /usr/lib/firefox-8.0/plugin-container /usr/lib/adobe-
2526 ?     Rl  0:01 /usr/bin/konsole
2528 pts/1 Ss  0:00 /bin/bash
2617 pts/1 Sl+ 0:24 gedit blog.txt
2620 ?     S   0:00 /usr/lib/gvfs/gvfs-gdu-volume-monitor
2622 ?     Sl  0:00 /usr/lib/udisks/udisks-daemon
2623 ?     S   0:00 udisks-daemon: polling /dev/sdb /dev/sr0
2625 ?     Sl  0:00 /usr/lib/gvfs/gvfs-afc-volume-monitor
2628 ?     S   0:00 /usr/lib/gvfs/gvfs-gphoto2-volume-monitor
2703 pts/2 Ss  0:00 /bin/bash
2762 pts/2 R+  0:00 ps -ax



Nos SO tipo Unix, pode-se perceber dois tipos de tarefas. O processo "pai" e os processos "filhos" ou segmentos associados ao processo principal (normalmente chamadas de threads do processo). Existe um bloco de endereçamento de memória para cada processo e este é compartilhado pelas threads. No entanto, cada thread tem sua própria pilha (stack) e seu estado de processador.

Em tempo de execução, o kernel usa a prioridade de cada processo para estabelecer o tempo de CPU para cada um. Esta prioridade, chamada de "nice", é típica de cada processo ou estabelecida pelo usuário ou super-usuário. Terminado o tempo de CPU o kernel suspende a execução do processo, salva o seu contexto, fazendo uma paginação da memória que salva as informações necessárias para ele retornar à execução no próximo tempo de CPU. Então, o kernel coloca em execução o próximo da fila de prioridades para ser processado. Quando a fila acaba, o kernel volta a dar o controle da CPU a primeiro da fila, terminando o ciclo.

Mais sobre sistemas Unix: http://www.bell-labs.com/history/unix/


Nenhum comentário:

Postar um comentário