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