Make your own free website on Tripod.com
logo titulo
anterior indice proximo

Gerenciando processos


Um processo é, simplesmente falando, um programa sendo executado. Mais específicamente, do ponto de vista do sistema operacional, é uma coleção de instruções (programa) mais os dados necessários à sua execução. Armazenados juntamente com o processo estão o seu contexto, ou seja, o contador de instruções [17], e o conjunto de todos os registradores da CPU.
Processos são entidades independentes, cada um com suas permissões de acesso, e têm atribuidos propriedades como o id do usuário que o criou (UID) e do grupo (GID). Grande parte de sua execução se processa em user-mode, quando o processador não admite a execucão de instruções privilegiadas, mas em certos instantes (durante uma chamada de sistema), ele executa em kernel-mode para conseguir o acesso a partes do hardware que de outra forma seriam inacessíveis. Cada processo é identificado pelo seu process id (PID), que é simplesmente um número inteiro.

É responsabilidade do sistema operacional gerenciar os processos do sistema, de forma a maximizar a utilização da CPU (que usualmente é só uma), de forma que, se um processo tenta ler ou escrever em um disco, por exemplo, este processo ficará em estado waiting (suspenso) até que a operação de entrada/saida seja completada. Nesse ínterim, outro processo será habilitado a rodar, desperdiçándo assim o mínimo do tempo da CPU, memória e demais periféricos. O Linux suporta inclusive um procedimento de "escrita retardada", quando escrevemos em algum arquivo. No momento da escrita, o buffer que contém estes dados é simplesmente marcado como "sujo" (dirty), e o sistema operacional escolhe o instante mais apropriado para descarregar esse buffer no disco físico. Isso explica a necessidade que temos de executar um procedimento de parada (shutdown) antes de desligar a máquina, para evitar que fiquem dados a serem descarregados (escritos) no disco.

O diretório /proc contém, como vimos anteriormente, um subdiretório com o nome do PID de cada processo. Os pseudo-arquivos cmdline, environ e status, têm informações detalhadas sobre esse processo. Outra forma é obter um resumo sobre o processo via o comando ps. Outro comando que permite controlar diretamente processos é o top, útil quando queremos deixar um terminal como console permanente do sistema. O top mostra constantemente os processos em ordem decrescente de utilização de CPU, permitindo o operador enviar sinais (signals) para interromper um processo que esteja tomando muitos recursos da CPU, ou mesmo modificar a prioridade de execucão de um determinado processo. Ainda outros comandos, o nice, e o renice, nos dão controle individual sobre a prioridade de um processo. Um processo tem prioridades variando entre -20 (maior prioridade) até 19 (menor prioridade). o comando nice roda um programa com uma prioridade aumentada em 10, enquanto que o renice permite-nos ajustar essa prioridade, de um processo já sendo executado, adicionando ou subtraindo o valor dado. Somente o superusuário pode executar tarefas com ajustes de prioridade negativos.

atributos

Um processo tem vários atributos que controlam sua execução.
O PID identifica únicamente este processo (nenhum PID pode ser repetido até novo boot do sistema). O PPID indica qual "processo-pai" o criou. O nice number controla a prioridade desse processo. Processos de maior prioridade têm a preferência na utilização da CPU. O UID e GID indicam o usuário e grupo que criou esse processo. Somente o root (superusuário) pode destruir processos criados por outros usuários. O EUID e o EGID são formas de se rodar um processo, criado por um usuário não-privilegiado de forma que ele se comporte como privilegiado, com acesso a outros recursos que normalmente o usuário não o teria. O comando chmod +s <arquivo> pode ser usado para fazer um programa modificar esse valor na execução. Um programa setuid (com o flag s ligado) no instante de execução troca seu UID/GID pelos seus próprios (user/group do arquivo) e efetivamente rodam como se fosse este outro usuário, pois o kernel testa o EUID e EGID para testar privilégios de acesso. Daí, devmos ter o máximo cuidado quando ligarmos este flag em algum executável.

atributos do processo

À medida que vai sendo executado, um processo passa por vários estados. Logo que é iniciado ele é colocado no estado ready, isto é, pronto para executar. O escalador (scheduler), uma das partes do kernel, decide, de acordo com a prioridade e a ordem das suas filas, quando dar a CPU para esse processo, quando ele passa ao estado running. Se este processo fica muito tempo, acima de um determinado time slot, com a CPU, ele é novamente colocado na fila ready e fica aguardando uma nova escalação. Quando o processo tenta efetuar alguma operação de entrada e saida, ele pode ser bloqueado e passa ao estado waiting, até que a operação de I/O (entrada/saida) seja completada. Se o processo está sendo, por exemplo, monitorado ou controlado por outro programa (digamos, um depurador como o gdb), ele poderá ser enviado ao estado stopped, até que o programa que o controla retorne-o ao estado ready novamente. No final da execução, o processo pode ser morto (por exemplo com o comando kill). Processos que terminam sem que o seu pai (parent) seja informado, podem ficar num estado zombie (zumbi), que na realidade nada mais é que um processo morto, mas órfão.

estados do processo

Tipos de processos e controle de tarefas (job control)


Existem vários tipos de processos no Linux:

Processos interativos são iniciados a partir de uma sessão de terminal e por ele controlados. Quando executamo

s um comando do shell, entrando simplesmente o nome do programa e <return> (tecla enter no teclado do PC), estamos rodando um processo em foreground. Um programa em foreground recebe diretamente sua entrada (stdin) do terminal que o controla, e por outro lado, toda sua saida (stdout e stderr) vai para esse mesmo terminal. Digitando Ctrl-Z, suspendemos esse processo, e recebemos (do shell) a mensagem:
Stopped
(talvez com mais alguns caracteres dizendo o número do job e a linha de comando). A maioria dos shells têm comandos para controle de jobs, para mudar o estado de um processo parado para background, listar os processos em background, retornar um processo do back para o foreground, de modo que o possamos controlar novamente com o terminal. No bash o comando jobs mostra os jobs correntes, o bg restarta um processo suspenso em background e o comando fg o restarta em foreground.

Processos em batch são controlados usualmente pelo cron, juntamente com o programa at ou batch (na realidade um link para o at). Introduzindo no shell: at 18:30 e em seguida uma linha com o comando desejado, teremos essa execução programada para a hora dada (no caso 18:30). O comando atq lista todas as tarefas pendentes. A saida do comando at será enviado por mail para o usuário, quando a execução estiver completa.

Daemons ou processos servidores, mais frequentementes são iniciados na partida do sistema, rodando continuamente enquanto o sistema está no ar, e esperando em background até que algum outro processo solicite o seu serviço. É o caso, por exemplo, do sendmail, um programa para redirigir e transportar mensagem de mail através do sistema ou para outros sistemas interligados via rede.


rpragana
Tue Jan 5 10:57:53 EDT 1999