1 7 – Processos 7.1 – Introdução O conceito de processo é a base para a implementação de um sistema multiprogramável. O processador é projetado apenas para executar instruções, não se importando com qual programa esteja em execução ou qual o seu conteúdo. O sistema operacional por sua vez, é o responsável por gerenciar qual programa esta em execução e é, também, o responsável por controlar o uso concorrente do processador. A gerência de processos é uma das principais funções do sistema operacional. Através dos processos, um programa pode alocar recursos, compartilhar dados, trocar informações, etc. Nos sistemas multiprogramáveis, os processos são executados concorrentemente, compartilhando o uso do processador, da memória principal e os dispositivos de Entrada/Saída. Nos sistemas com múltiplos processadores ou com vários núcleos, além da execução de processos concorrentemente ocorre também a execução simultânea de processos nos diversos processadores do sistema. Figura 7.1 – Gerenciador de Processos do Windows 2 7.2 – Estrutura do Processo Um processo pode ser entendido como um programa que esta em execução. Em sistemas multiusuário, cada usuário é associado a um processo. O processador executa o programa do usuário em um determinado intervalo de tempo e, no instante seguinte, poderá executar outro programa, de outro usuário. Um processo também pode ser definido como o ambiente onde o programa é executado. Este ambiente, além das informações pertinentes a execução do programa, possui também informações relativas aos recursos que o programa pode utilizar como espaço de endereçamento, uso do processador, área em disco, etc. Se um programa necessitar utilizar uma área em disco superior ao seu limite estipulado, o sistema operacional interrompe a execução do programa por falta de recursos. Um processo é formado por três partes, conhecidas como contexto de hardware, contexto de software e espaço de endereçamento, que juntas mantêm as informações necessárias à execução de um programa. Figura 7.2 – Contexto do processo 3 7.2.1 – Contexto de Hardware O contexto de hardware armazena o conteúdo dos registradores gerais da CPU, além dos registradores de uso específico, como o program counter(PC), o stack point(SP) e o registrador de status. Quando um processo esta em execução, o seu contexto de hardware está armazenado nos registradores da CPU. No momento em que ocorre a troca de processo, o sistema salva as informações do contexto de hardware do processo. Para que a troca de programas ocorra sem problemas, é necessário que todas as informações do programa interrompido sejam armazenadas para que, quando o programa retorne a execução possa continuar exatamente de onde parou. A troca de um processo por outro, comandada pelo sistema operacional, é denominada mudança de contexto. A mudança de contexto consiste em salvar o conteúdo dos registradores do processo que esta deixando a CPU para carregá-los com os valores referentes ao do novo processo que será executado. Essa operação consiste em trocar um contexto de hardware de um processo por outro. Figura 7.3 – Contexto de Hardware 4 7.2.2 – Contexto de Software No contexto de software são especificados características e limites de recursos que podem ser alocados pelo processo, como o número máximo de arquivos abertos simultaneamente, prioridade de execução e tamanho do buffer. Muitas destas características são determinadas no momento da criação do processo, enquanto outras podem ser alteradas durante a execução. O contexto de software é composto por três grupos de informações sobre o processo: identificação, quotas e privilégios. - Identificação Cada processo criado pelo sistema recebe uma identificação única, chamada PID (Process Identification) que é representada por um número. Através deste número, o sistema operacional e outros processos podem fazer referência a qualquer processo em execução. Alguns sistemas identificam o processo por nome também. Os processos também possuem a identificação do usuário ou processo que o criou (owner ou proprietário/dono do processo). Cada usuário possui uma identificação chamada UID – User Identificafion, que é única e é atribuída no momento da criação do usuário. Figura 7.4 – Exemplo de PID ( comando TOP – S.O. FreeBSD ) 5 - Quota As quotas são os limites de cada recurso do sistema que um processo pode alocar. Caso o processo ultrapasse a quota estipulada ou essa quota seja insuficiente, a execução do processo pode se tornar lenta, ou mesmo ser interrompida ou ainda, nem chega a ser executado. Alguns exemplos de quota: - número máximo de arquivos abertos simultaneamente; - tamanho máximo de memória principal e secundária que o processo pode alocar; - tamanho máximo do buffer para operações de E/S; - número máximo de processos, subprocessos que podem ser criados. - Privilégios Os privilégios ou direitos definem as ações que um processo pode fazer em relação a ele mesmo, a outros processos e ao sistema operacional. Privilégios que afetam o próprio processo permitem que suas características possam ser alteradas, como prioridade de execução. Já os privilégios que afetam os demais processos permitem, além da alteração de suas próprias características, permitem alterar os outros processos. Privilégios que afetem o sistema são mais amplos e poderosos, pois estão relacionados à operação e gerencia do ambiente, como a desativação do sistema, criação de outros processos privilegiados. Os sistemas operacionais modernos têm uma conta de acesso que possui estes privilégios. Esta conta existe com o propósito de administrar o sistema. Nos sistemas Unix/Linux existe a conta de usuário root, nos sistemas da Microsoft Windows, a conta administrador (administrator, nos Windows em inglês) é usada para este propósito. 7.2.3 – Espaço de Endereçamento O espaço de endereçamento é a área de memória pertencente ao processo onde as instruções e os dados do programa são armazenados para 6 execução. Cada processo possui seu próprio espaço de endereçamento, que deve ser devidamente protegido dos demais processos. Figura 7.5 – Contexto do processo detalhado 7.2.4 – Bloco de Controle do Processo O processo é implementado pelo sistema operacional através de uma estrutura de dados chamada bloco de controle de processo (Process Control Block - PCB). A partir desta estrutura, o sistema operacional mantém todas as informações sobre o contexto de hardware, contexto de software e espaço de endereçamento. 7 Figura 7.6– PCB ( Process Control Block – Bloco de Controle de Processo ) Os PCBs de todos os processos residem na memória principal em uma área exclusiva do sistema operacional. O tamanho desta área é limitado por um parâmetro do sistema operacional que especifica o número máximo de processos que o sistema suporta simultaneamente. Toda gerência de processos é feita através de system calls, que realizam operações como criação, alteração de características, visualização, eliminação de processos, etc. 7.3 – Estados do Processo Em um sistema multiprogramável, os processos passam por diferentes estados ao longo do seu processamento, seja em função de eventos gerados pelo sistema operacional, seja pelo próprio processo. Um processo ativo pode ter três estados diferentes: - Execução (running) Um processo está no estado de execução quando está sendo processado efetivamente pela CPU, ou seja, utilizando o processador. Em sistemas com um único processador, somente um processo pode estar em estado de execução em um dado instante. Em sistemas com mais de uma CPU 8 ou com CPU com mais de um núcleo, o número de processos que pode estar em estado de execução ao mesmo tempo é igual ao número de processadores existentes. Neste tipo de sistema, também é possível que um mesmo processo esteja sendo executado em mais de um processador ao mesmo tempo. - Pronto (ready) Um processo está no estado de pronto quando aguarda para ser executado. O sistema operacional é o responsável por determinar a ordem e os critérios pelos quais os processos em estado de pronto devem fazer uso do processador. Podem existir diversos processos em estado de pronto aguardando para serem executados. Estes processos são organizados em uma lista encadeada e são ordenados pela sua importância, permitindo que os processos com prioridade mais alta sejam executados primeiro. - Espera (wait) Um processo no estado de espera aguarda por algum evento externo ou por algum recurso para continuar sua execução, como por exemplo, aguardando alguma operação de entrada/saída. Os processos no estado de espera também são organizados em uma lista encadeada e, assim que o evento esperado aconteça, o processo que aguardava o evento é então transferido para o estado de pronto. 9 7.4 – Mudanças de Estado do Processo Figura 7.7 – Mudança de estado do processo Um processo muda de estado durante a sua execução em função de eventos voluntários, que são gerados pelo próprio processo, ou por eventos involuntários, que são gerados pelo sistema operacional. Existem quatro mudanças de estado que podem ocorrer a um processo, são elas: - Pronto Execução Quando um processo é criado, o sistema operacional coloca o processo em uma lista de processos no estado de pronto, então o sistema operacional se encarrega de colocar o processo em estado de execução. - Execução Espera Um processo no estado de execução passa para o estado de espera por eventos gerados por ele próprio, como a gravação de um arquivo em disco, ou por eventos externos, quando o sistema operacional suspende a execução do processo para colocar outro no seu lugar. 10 - Espera Pronto Um processo no estado de espera para passa para o estado de pronto quando a operação solicitada é atendida ou o recurso esperado é concedido. Um processo no estado de espera sempre terá que passar pelo estado de pronto antes de ir para o estado de execução. - Execução Pronto Um processo no estado de execução volta para o estado de pronto por eventos gerados pelo sistema operacional, como o término do seu time-slice. Neste caso, o processo não precisa ir para o estado de espera, e sim, volta direto para o estado de pronto, onde ele entra na lista para ser executado novamente. Um processo no estado de espera ou de pronto pode não estar na memória principal. Isto ocorre quando não há espaço suficiente para todos os processos na memória principal e parte do contexto do processo é gravada na memória secundária. Está técnica é chamada de swrapping, que consiste em retirar os processos da memória principal e coloca-los de volta seguindo os critérios de cada sistema operacional. Figura 7.8 – Mudança de estado, residente para não-residente na memória 11 7.5 – Criação e Eliminação de Processos Processos são criados e eliminados por motivos diversos. A criação de um processo ocorre a partir do momento em que o sistema operacional adiciona um novo PCB à sua estrutura e aloca um espaço de endereçamento na memória para uso. A partir da criação do PCB, o sistema operacional já reconhece a existência de um processo. No caso da eliminação de um processo, todos os recursos associados ao processo são desalocados e o PCB eliminado pelo sistema operacional. A maioria dos sistemas operacionais estabelece dois estados adicionais para os momentos de criação e eliminação de um processo. - Criação (new) Um processo é dito no estado de criação quando o sistema operacional já criou um novo PCB, porém ainda não pode colocá-lo na lista de processos no estado de pronto. A criação de processos pode ocorrer por diferentes razões: - logon: um processo é criado através de um estabelecimento de uma sessão de um usuário; - criação por outro processo: um processo já existente pode criar outros processos; - criação pelo sistema operacional: o sistema operacional pode criar novos processos com o intuito de oferecer algum tipo de serviço; - abertura de um aplicativo por parte do usuário. - Término (exit) Um processo no estado de termino não pode ter mais nenhum programa em execução no seu contexto, porém o sistema operacional ainda mantém suas informações de controle presentes na memória. Um processo neste estado não é mais considerado ativo, mas como o PCB ainda existe, o sistema 12 operacional pode recuperar informações referentes ao processo e após extrair estas informações o processo pode deixar de existir. O término do processo pode ocorrer por razões como: - término normal da execução; - eliminação por outro processo; - eliminação forçada; Figura 7.9 – Criação e Eliminação de processo 7.6 – Subprocessos Processos independentes, subprocessos e threads são maneiras diferentes de implementar a concorrência dentro de uma mesma aplicação. Neste caso, busca-se subdividir o código em partes para trabalharem de forma cooperativa. Subprocessos são processos criados dentro de uma estrutura hierárquica. Neste modo, o processo criador é chamado de processo pai e o subprocesso criado é chamado de processo filho. Os subprocessos podem criar novos subprocessos e assim por diante. Outra característica é a dependência existente entre o processo pai e o processo filho, quando o processo pai deixa de existir, todos os processos filhos também são eliminados automaticamente. Além desta característica, o processo pai pode compartilhar suas quotas com os processos filhos, assim, quando um subprocesso é criado, o processo pai cede parte de suas quotas para o processo filho. 13 Figura 7.11 – Processos Pai e Filhos 7.7 – Processos Foreground e Background Todo processo possui pelo menos dois canais, sendo um de entrada (input) e outro de saída (output). Estes canais podem ser teclados, mouse, monitor, impressora, etc. Um processo foreground é aquele que permite a comunicação direta entre o usuário e o processo durante o processamento. Os canais de entrada e saída estão associados a dispositivos interativos. Um processo background é aquele onde não existe a comunicação com o usuário durante o seu processamento. Neste caso, os canais de entrada/saída não estão associados a dispositivos interativos como teclado e monitor. Existe uma técnica onde é possível associar o canal de saída de um processo com o canal de entrada de outro, esta técnica é chamada pipe, e ela faz a ligação entre os processos. 14 Figura 7.11 – Pipe Na figura a seguir vemos um exemplo de um pipe via linha de comando no sistema operacional FreeBSD. Figura 7.12 – Exemplo de Pipe por linha de comando 7.8 – Processos do Sistema Operacional Processos do sistema operacional são alguns processos especiais que tem como função básica oferecer alguns serviços, seja ao próprio sistema operacional ou a aplicações dos usuários. Alguns exemplos destes processos são: 15 - auditoria e segurança; - serviços de rede; - contabilização do uso de recursos; - gerencia de impressão; - gerencia de jobs; - comunicação de eventos; - interpretador de comandos (shell). Podemos ver na figura a seguir alguns exemplos de processos do sistema operacional tanto do Windows como Linux. No Windows, os mais comuns são o Explorer.exe, system, services.exe. No Linux, o processo init é o mais conhecido. Figura 7.13 – Processos do sistema operacional 7.9 – Processos CPU-Bound e I/O-Bound Os processos são classificados de acordo com o modo como utilizam o processador e os dispositivos de Entrada/Saída. Um processo é chamado de CPU-Bound quando passa a maior parte do tempo em estado de execução, ou seja, passa a maior parte do tempo utilizando o processador. Este tipo de processo realiza poucas operações de entrada/saída e é bastante encontrado em aplicações cientificas onde são realizados muitos cálculos. 16 Um processo é chamado de I/O-Bound quando passa a maior parte do tempo no estado de espera e realiza um grande número de operações de leitura/gravação. Este tipo de processo é encontrado em aplicações comerciais, como sistemas de gestão, que se baseiam em leitura, processamento e gravação. Figura 7.14 – Processo CPU-bound x Processo I/O-bound 7.10 – Sinais Sinais são mecanismos que permitem notificar processos de eventos gerados pelo sistema operacional ou por outros processos. O uso de sinais é fundamental para a gerência de processos, alem de possibilitar a comunicação e a sincronização entre processos. A maior parte dos eventos associados a sinais é gerada pelo sistema operacional ou pelo hardware, como a ocorrência de interrupções e exceções. Em outras situações, os eventos são gerados a partir de outros processos com o propósito de sincronizar suas execuções. A geração de um sinal ocorre quando o sistema operacional, a partir da ocorrência de algum evento, notifica o processo através de bits de sinalização, localizados no PCB. Um processo não responde instantaneamente a um sinal, ou seja, os sinais ficam pendentes até que o processo esteja em modo de execução. O tratamento dos sinais é semelhante ao mecanismo de tratamento de interrupções e exceções, deste modo, quando um sinal é gerado, o contexto do processo é salvo e a execução é desviada para um código de tratamento de sinal (signal handler), geralmente feito pelo kernel do sistema operacional.