Gerencia de processos
O processo representa uma unidade de propriedade de recursos e de trabalho a ser realizado. É um dos meios que o sistema operacional dispõe para organizar as muitas tarefas que ele precisa realizar. O sistema operacional aloca uma parte dos recursos do computador para cada processo e assegura que cada programa do processo será despachado para execução de maneira ordenada e pontual. Os sistemas operacionais em geral têm um corpo de código que gerencia a criação e a exclusão de processos e o relacionamento entre processos, este código é chamado de estrutura de processo.
No Windows NT é implementado pelo gerenciador de processos. A meta deste é fornecer um grupo de serviços nativos de processo que os subsistemas de ambiente possam usar para emular as estruturas de processo que lhes são únicas. Esta meta evoluiu com o objetivo do Windows NT de proporcionar vários ambientes de sistema operacional que podem ser executados no modo usuário.
Os processos nativos do NT têm inúmeras características que diferem dos processos de outros sistemas operacionais:
- Os processos do NT são implementados como objetos e são acessados usando serviços de objeto.
- Um processo do NT pode ter várias linhas (threads) sendo executadas em seu espaço de endereçamento.
- Tanto os objetos de processo quanto os objetos de linha (thread) têm capacidade interna de sincronização.
- O gerenciador de processos do Windows NT não mantém relacionamento pai/filho nem nenhum outro tipo de relacionamento entre os processos por ele criado.
No Windows NT, o processo precisa incluir um quarto elemento antes de poder executar qualquer trabalho, ao menos uma linha (thread) de execução. Linha (thread) é a entidade dentro de um processo que o kernel do NT escala para execução, sem ela, o processo do programa não pode ser executado.
Depois que é definido como o ambiente onde um programa ou thread é executado, um processo no Windows NT envolve um espaço de endereçamento virtual, recursos do sistema (como semáforos, portas de comunicação etc) e pelo menos um thread. Os processos são simplesmente objetos criados e eliminados pelo gerente de objetos. O objeto do tipo processo contém um header que armazena seus atributos e os serviços a ele associados.
Qualquer processo deve ter pelo menos um thread antes de ser executado, pois o Windows NT escalona apenas threads para execução. Tal qual os processos, os threads são implementados como objetos, criados e eliminados pelo gerenciador de objetos. Durante o seu ciclo de vida, um thread passa por diferentes estados de execução.
Estado |
Descrição |
Pronto |
Também conhecido como ready, esse estado indica que o thread aguarda apenas por uma chance para ser executado. |
Standby |
Nesse estado, um thread foi selecionado para execução e aguarda apenas que a troca de contexto ganhe a CPU. somente um thread pode estar nesse estado para cada processador no sistema. |
Execução |
Do inglês running, esse estado indica que o processo, de posse da CPU, está sendo executado. |
Espera |
Nesse estado (waiting) indica que o processo aguarda por algum evento para poder ser executado. Quando a espera termina, o thread é colocado em estado de pronto. |
Transição |
Indica que o processo aguarda por algum recurso do sistema para ser executado. Quando a espera termina, o thread é colocado em estado de pronto. |
Terminado |
Após o thread encerrar a sua execução, ele fica no estado de terminado, podendo ser eliminado ou não. |
O UNIX foi projetado para ser um sistema de tempo compartilhado e suportar múltiplos processos, com o escalonamento de CPU sendo um algoritmo de prioridade simples.
A representação de processos nos sistemas operacionais é muito importante. A principal vantagem do UNIX sobre outros sistemas é a facilidade com a qual múltiplos processos podem ser criados e manipulados. Os processos são representados no UNIX por blocos de controle. Não existem blocos de controle de sistema acessíveis no espaço de endereçamento virtual de um processo de usuário, pois os blocos de controle associados a um processo estão armazenados no kernel.
As informações contidas nos blocos de controle são usadas pelo kernel para o controle e o escalonamento de CPU. A estrutura de dados mais elementar associada aos processos é a estrutura de processo. Essa estrutura armazena tudo que o sistema necessita conhecer sobre um processo específico. Existe um vetor de estruturas de processo que tem seu tamanho definido no tempo de link edition do sistema.
O Modelo de Processo FORK / EXEC
O princípio básico da gerência de processos do UNIX consiste em separar duas operações distintas; a criação de processos e a execução de um novo programa. Um novo processo é criado por meio da chamada ao sistema fork, e executa-se um novo programa após uma chamada execve.
Para executar um novo programa não é necessário criar, antes um novo processo: qualquer processo pode chamar execve a qualquer momento. O programa sendo executado no momento é encerrado de imediato, e o novo programa começa a ser executado no contexto do processo existente.
LINUX
-Os processos do Linux são preemptivos, isso significa que quando um processo entra no estado TASK_RUNNING o kernel vai checar se existe alguma prioridade maior do que o processo corrente. Caso exista, o processo corrente é interrompido e o que tem prioridade maior começa a rodar.
Imagine a seguinte situação onde o Sr. Gênio dos Teclados utiliza apenas dois processos. O editor de textos Emacs para escrever o seu programa e ao mesmo tempo o gcc para compilar a versão mais recente do programa Pogobol Light. Por ser um programa interativo o editor de textos tem uma prioridade maior do que o compilador, mesmo assim ele ainda é suspenso diversas vezes para que o compilador possa rodar também. O Sr. Gênio dos Teclados digita algumas palavras e imediatamente após cada tecla digitada o kernel suspende a execução do compilador para poder processar o Emacs e assim o texto digitado aparecer na tela, isso acontece tão rápido que torna-se imperceptível, então o Emacs é suspenso novamente para que o gcc possa voltar a executar. Neste caso, quando dizemos que um processo foi suspenso, significa que ele continua com o estado TASK_RUNNING, porém não mais utilizando o CPU.
-A prioridade de um processo no Linux está em constante alteração, o escalonador se mantém informado sobre o que os processos estão fazendo e assim torna-se possível ajustar a prioridade. Dessa maneira os processos que ficaram proibidos de utilizar o CPU por um longo intervalo de tempo, tem sua prioridade incrementada automaticamente, contrariamente os processos que passaram um longo período dentro do CPU são penalizados tendo sua prioridade decrementada.
Quando tocamos no assunto escalonamento é importante notar que os processos são classificados como da Forma E/S e Forma CPU. O primeiro faz uso extenso dos recursos de entrada e saída, isso significa que grande parte do seu tempo é utilizado no aguardo do conclusão das operações de Entrada e Saída, já o segundo são processos que necessitam de um longo tempo dentro do CPU.
Uma classificação alternativa define três classes de processos:
Processos Interativos
- Os processos que estão em constante interação com o usuário, sendo assim eles perdem grande parte do tempo esperando uma atividade do usuário, como um clique do mouse ou o aperto de uma tecla. Quando qualquer dessas ações for recebida o sistema precisa responder de forma ágil suspendendo qualquer processo que estiver rodando e colocar o processo interativo no CPU para processar a requisição solicitada pelo usuário, caso contrário ele pode pensar que o sistema não está respondendo. Um bom tempo de resposta é em torno de 50 e 150 ms.
- Processos em Lote
- Não necessitam de nenhuma interação do usuário e por isso muitas vezes rodam em background. Como são processos de baixa prioridade, são freqüentemente penalizados pelo escalonador. Programas de processamento em lote comuns são editores de texto, compiladores e programas gráficos.
- Processos em Tempo Real
- Esses processos nunca devem ser bloqueados por processos de baixa prioridade, precisam de um tempo de resposta super rápido e com uma variação bastante baixa. Alguns aplicativos que fazem uso do tempo real são som, vídeo, controladores de robôs e equipamentos que envolvem a segurança humana.