Pular para o conteúdo principal

Sistemas Operacionais: Processos

Um conceito fundamental em todos os sistemas ope­racionais é o processo. Um processo é basicamente um programa em execução. Associado a cada processo está o espaço de endereçamento, uma lista de posições de memória que vai de 0 a algum máximo, onde o pro­cesso pode ler e escrever. O espaço de endereçamento contém o programa executável, os dados do programa e sua pilha. Também associado com cada processo há um conjunto de recursos, em geral abrangendo registrado­res (incluindo o contador de programa e o ponteiro de pilha), uma lista de arquivos abertos, alarmes penden­tes, listas de processos relacionados e todas as demais informações necessárias para executar um programa. Um processo é na essência um contêiner que armaze­ na todas as informações necessárias para executar um programa.
A maneira mais fá­cil de compreender intuitivamente um processo é pensar a respeito do sistema de multiprogramação. O usuário pode ter inicializado um programa de edição de vídeo e o instruído a converter um vídeo de uma hora para um determinado formato (algo que pode levar horas) e então partido para navegar na web. Enquanto isso, um processo em segundo plano que desperta de tempos em tempos para conferir o e-mail que chega pode ter come­çado a ser executado. Desse modo, temos (pelo menos) três processos ativos: o editor de vídeo, o navegador da web e o receptor de e-mail. Periodicamente, o sistema operacional decide parar de executar um processo e co­meça a executar outro, talvez porque o primeiro utilizou mais do que sua parcela de tempo da CPU no último segundo ou dois.
Quando um processo é suspenso temporariamen­te assim, ele deve ser reiniciado mais tarde no exato mesmo estado em que estava quando foi parado. Isso significa que todas as informações a respeito do proces­so precisam ser explicitamente salvas em algum lugar durante a suspensão. Por exemplo, o processo pode ter vários arquivos abertos para leitura ao mesmo tempo. Há um ponteiro associado com cada um desses arquivos dando a posição atual (isto é, o número do byte ou re­gistro a ser lido em seguida). Quando um processo está temporariamente suspenso, todos esses ponteiros têm de ser salvos de maneira que uma chamada read execu­tada após o processo ter sido reiniciado vá ler os dados corretos. Em muitos sistemas operacionais, todas as in­formações a respeito de cada processo, fora o conteúdo do seu próprio espaço de endereçamento, estão armaze­nadas em uma tabela do sistema operacional chamada de tabela de processos, que é um arranjo de estruturas, uma para cada processo existente no momento.
Desse modo, um processo (suspenso) consiste em seu espaço de endereçamento, em geral chamado de imagem do núcleo (em homenagem às memórias de núcleo magnético usadas antigamente), e de sua entrada na tabela de processo, que armazena os conteúdos de seus registradores e muitos outros itens necessários para reiniciar o processo mais tarde.
As principais chamadas de sistema de gerenciamen­to de processos são as que lidam com a criação e o tér­mino de processos. Considere um exemplo típico. Um processo chamado de interpretador de comandos ou shell lê os comandos de um terminal. O usuário acabou de digitar um comando requisitando que um programa seja compilado. O shell tem de criar agora um novo processo que vai executar o compilador. Quando esse processo tiver terminado a compilação, ele executa uma chamada de sistema para se autofinalizar.
Se um processo pode criar um ou mais processos (chamados de processos filhos), e estes por sua vez po­dem criar processos filhos, chegamos logo à estrutura da árvore de processo. Processos rela­cionados que estão cooperando para finalizar alguma tarefa muitas vezes precisam comunicar-se entre si e sincronizar as atividades. Essa comunicação é chamada de comunicação entre processos.
Outras chamadas de sistemas de processos permitem requisitar mais memória (ou liberar memória não utili­zada), esperar que um processo filho termine e sobrepor seu programa por um diferente.
Há ocasionalmente uma necessidade de se transmitir informação para um processo em execução que não está parado esperando por ela. Por exemplo, um processo que está se comunicando com outro em um computador diferente envia mensagens para o processo remoto por intermédio de uma rede de computadores. Para evitar a possibilidade de uma mensagem ou de sua resposta ser perdida, o emissor pode pedir para o seu próprio sistema operacional notificá-lo após um número especificado de segundos, de maneira que ele possa retransmitir a mensagem se nenhuma confirmação tiver sido recebida ainda. Após ligar esse temporizado, o programa pode continuar executando outra tarefa.
Decorrido o número especificado de segundos, o sistema operacional envia um sinal de alarme para o processo. O sinal faz que o processo suspenda por al­gum tempo o que quer que ele esteja fazendo, salve seus registradores na pilha e comece a executar uma rotina especial para tratamento desse sinal, por exemplo, para retransmitir uma mensagem presumivelmente perdida. Quando a rotina de tratamento desse sinal encerra sua ação, o processo em execução é reiniciado no estado em que se encontrava um instante antes do sinal. Sinais são os análogos em software das interrupções em hardwares e podem ser gerados por uma série de causas além de temporizadores expirando. Muitas armadilhas detecta­das por hardwares, como executar uma instrução ilegal ou utilizar um endereço inválido, também são converti­das em sinais para o processo culpado.
A cada pessoa autorizada a usar um sistema é desig­nada uma UID (User IDentification - identificação do usuário) pelo administrador do sistema. Todo pro­cesso iniciado tem a UID da pessoa que o iniciou. Um processo filho tem a mesma UID que o seu processo pai. Usuários podem ser membros de grupos, cada qual com uma GID (Group IDentification - identificação do grupo).
Uma UID, chamada de superusuário (em UNIX), ou Administrador (no Windows), tem um poder espe­cial e pode passar por cima de muitas das regras de pro­teção. Em grandes instalações, apenas o administrador do sistema sabe a senha necessária para tomar-se um superusuário, mas muitos dos usuários comuns (espe­cialmente estudantes) devotam um esforço considerável buscando falhas no sistema que permitam que eles se tomem superusuários sem a senha.


ANDREW S.TANENBAUM / HERBERT BOS - Sistemas Operacionais Modernos - 4a edição

Comentários