Metropole
Cursos
 
Aulas
 
  voltar  Voltar . imprimir  Imprimir . topo  Topo  
Sistemas Operacionais
Professores autores
Vicente Pires Lustosa Neto
Roberta De Souza Coelho
 

Aula 10 - Gerência de processos

 
Apresentação

Uma forma simples de explicar o que é um processo é dizer que o mesmo representa “um programa em execução”. Geralmente, quando usamos um computador usamos vários programas ao mesmo tempo, podemos mandar um e-mail enquanto escutamos uma música, ou mesmo entrar no Orkut estando com um editor de texto aberto finalizando alguma tarefa (como o Microsoft Word).  Sabemos, portanto, que podemos usar vários programas ao mesmo tempo em um único computador. É responsabilidade do sistema operacional “organizar” esses processos no computador, permitindo que os mesmos compartilhem recursos de forma organizada. Podemos dizer que o Sistema Operacional atua como um gerente de processos.


Nesta aula, vamos investigar como os processos (programas em execução) compartilham os recursos do nosso computador (processador, impressora, arquivos etc.); veremos também quais os principais problemas que surgem (quando processos compartilham recursos) e algumas alternativas para solucioná-los.      

Lembre-se que para que você possa entender bem esta aula é fundamental prestar atenção na explicação dos principais termos que surgirão no decorrer da aula. Para auxiliar seu entendimento, continuaremos comparando o que acontece dentro de seu computador com exemplos simples do nosso cotidiano. Assim, você poderá associar de maneira simples as responsabilidades de um Sistema Operacional com atividades do dia a dia.


Objetivos
 

Ao final desta aula, você será capaz de:

  • definir o que é pseudoparalelismo;
  • entender o ciclo de vida de um processo;
  • descrever as principais dificuldades associadas ao gerenciamento de processos;
  • definir o conceito de deadlock e condição de corrida.
   
 
Pseudoparelelismo – Mais de um processo compartilhando um processador
 

Como você já sabe, um computador pode executar diversas atividades ao mesmo tempo. Você pode está digitando um texto, enquanto escuta sua música preferida e grava um CD com as fotos de suas últimas férias.  Mas, como isso é possível se muitos computadores possuem apenas um processador? E mesmo aqueles que possuem dois ou mais núcleos de processamento podem executar para nós uma quantidade de programas bem superior a quantidade de processadores. Vamos ver como isso é possível no decorrer desta aula.

 
NOTA

Hoje em dia, são comuns os computadores com mais de um processador, você pode identificá-los através de termos técnicos que indicam a quantidade de núcleos de processamento. Verifique nos anúncios e propagandas de computadores termos como Dual Core, Quad Core os quais indicam respectivamente dois e quatro núcleos de processamento.

 

Digamos que temos um simples computador com apenas um processador. Como o Sistema Operacional faz com que possamos, por exemplo, escutar música e navegar na Internet ao mesmo tempo? Vale a pena lembrar que o próprio Sistema Operacional é também um programa e, portanto, ele também precisa do processador para executar.

A solução encontrada para essa questão é: compartilhar!!  Os processos precisam compartilhar o processador. Você já pode ter vivido o seguinte cenário: existe apenas um único jogo eletrônico e você e todos seus amigos querem jogar. Para resolver o impasse, você faz o seguinte: “Você usa o game por 30 minutos e depois passa para o próximo da fila de interessados em jogar!!”.


Pois bem, podemos ver os processos como um conjunto de amigos que querem usar um recurso que é limitado (o processador), assim, o que o Sistema Operacional vai fazer é disponibilizar o processador para cada processo por um determinado período de tempo. Dessa forma, temos a impressão de que os programas estão sendo executados ao mesmo tempo (em paralelo). Mas, o que acontece na verdade é que os processos formam uma fila e cada um usa o processador por um período de tempo pequeno (na ordem de milésimos de segundo) e passa para o processo seguinte na fila. E assim continua até que todos os processos usem o processador que passa a ser disponibilizado para o processo no início da fila e tudo se repete. Assim, teremos a impressão de que estamos com diversos aplicativos em aberto. Essa impressão é conhecida como pseudoparalelismo, pois, apesar dos programas não estarem realmente sendo executados ao mesmo tempo (em paralelo), eles ficam se alternando numa frequência que garante a operação simultânea de diversos aplicativos.

 
NOTA

Você já deve ter visto um show de malabarismo com pratos que giram em cima de bastões. Como cada prato precisa por um momento do malabarista para dar novo impulso no bastão e continuar girando, o malabarista procura distribuir o seu tempo entre os pratos para que todos continuem girando durante toda a apresentação. Então, considerando os pratos como se fossem processos e o malabarista com o processador, podemos entender melhor o pseudoparalelismo existente.

 

Fica então a cargo do Sistema Operacional gerenciar os processos, determinando a ordem de uso do processador, garantindo que cada um tenha acesso e tempo suficiente para executar normalmente.

 
Gerenciando processos
Para que o Sistema Operacional gerencie os processos, primeiro ele deve ser capaz de: (1) criá-los, (2) reservar memória e (3) colocar os processos numa fila de espera para uso do processador. O próprio Sistema Operacional é um conjunto de vários processos que também compartilham a CPU para serem executados. A Figura 1 representa esse compartilhamento entre os processos.

Figura 1 - Processos compartilhando a CPU. Fonte: autoria própria.

 

Além disso, os sistemas operacionais permitem que processos (através de chamadas de sistema) criem outros processos. Pense nisso como a árvore genealógica de uma família. Portanto, os processos podem ser ‘pai’ e ‘filho’ de outros processos.


Por exemplo, quando você executa o programa Internet Explorer do sistema operacional Windows para navegar na Internet, na verdade, você está solicitando a criação do iexplorer.exe (processo do programa Internet Explorer) ao explorer.exe          (processo genérico do sistema responsável por fornecer comandos básicos e gerenciar o ambiente gráfico padrão do Windows). A Figura 2 mostra a tela de um computador que está executando o Process Explorer, um programa de gerenciamento de processos que na sua tela inicial mostra todos os processos que estão executando em seu computador e a relação entre eles (por exemplo, se um processo é pai de um outro), observe como o processo iexplorer.exe está situado entre os processos filhos do explorer.exe.

Figura 2 - Relação pai x filho entre processos
Fonte: autoria própria.

 
Para você apenas visualizar quais processos estão sendo executados, o Windows possui o gerenciador de tarefas do sistema. Uma forma de acessá-lo é pressionando os botões Ctrl, Alt e Del, simultaneamente e escolher a opção “Iniciar Gerenciador de Tarefas”, aba “Processos”. Assim, você terá acesso a essa importante ferramenta do sistema e poderá utilizá-las não só para visualizar os processos, mas também, caso ocorra algum problema com um processo específico, você poderá encerrá-lo.

Figura 3 - Gerenciador de tarefas do Windows. Fonte: Windows.

 

Dica de programa

Para visualizar a árvore de processos no Windows, existe o programa Process Explorer que traz muito mais informações que o gerenciador de tarefas do Windows. Além de apresentar a estrutura de processos, indicando o parentesco entre eles, informa dados referente a cada processo, como a quantidade de memória utilizada por cada um. Vale a pena conferir, ele é um software gratuito disponível no seguinte link para download:

<http://www.baixaki.com.br/download/process-explorer.htm>

Figura 4 – Tela do Process Explorer
Fonte: Windows.

 

Quando o Sistema Operacional é inicializado, ou seja, quando o computador é ligado, o primeiro processo a ser executado é o processo que representa o Sistema Operacional. Os demais processos são criados a partir dele através de chamadas de sistema. Por exemplo, nos sistemas operacionais Windows (NT, 2000 ou XP), o processo inicial se chama smss.exe e a chamada de sistema responsável por criar os demais processo se chama CreateProcess(). Já no Sistema Operacional Linux, o processo que representa o Sistema Operacional se chama init e a chamada de sistema responsável por criar os demais processos a partir dele se chama fork().  A Figura 5 mostra uma árvore de processos que está sendo executada em um computador com Sistema Operacional Linux (1).

(1) Para visualizar essa árvore de processos, o comando utilizado no Linux foi o comando pstree.

Figura 5 - Árvore de processos no Linux
Fonte: Linux.

 

Os vários processos criados competem entre si pela atenção do processador a cada instante, cabendo ao gerenciador de processos do Sistema Operacional estabelecer uma ordem entre eles.


Em diferentes momentos, um processo pode está utilizando-se do processador, ou simplesmente aguardando, além disso, existem situações onde o processo, mesmo tendo o processador disponível, fica impossibilitado de prosseguir a execução, pois geralmente está aguardando por alguma entrada. Então, para que não exista desperdício no uso do processador, processos que estejam aguardando algum dado externo ficam bloqueados, deixando aos demais processos disputarem o uso do processador. Dessa forma, podemos dizer que os processos podem está em três estados, que seriam:

           1 – executando: utilizando o processador;
           2 – pronto: aguardando pelo uso do processador;
           3 – bloqueado: impossibilitado de usar o processador até que algum evento externo aconteça.

            As transições entre os estados de um processo possíveis estão representadas na figura a seguir.

Figura 6 - Estados de um processo.

 

Na Figura 6, a transição 1 indica o momento em que um processo descobre que não pode continuar a execução e então realiza uma chamada de sistema para entrar no estado bloqueado. Na transição 4, o processo é desbloqueado por um evento externo, basicamente um processo que está monitorando as entradas de diversos outros processos fica responsável em desbloquear. As transições 2 e 3 indicam os momentos em que o processo tem direito de uso do processador de acordo com o agendador de processos, que é um módulo do Sistema Operacional responsável por gerenciar o tempo de uso do processador. Observe que, enquanto os processos tem controle sobre as transições 1 e 4, o Sistema Operacional determina quando as transições 2 e 3 ocorrem, assim, os processos não tomam nem conhecimento quando elas ocorrem.

            Agora que você sabe os estados possíveis de um processo, veremos como é possível realizar as transições entre esses estados e a importância de manter os dados relacionados aos processos salvos.
 
Ciclo de vida de um processo

Assim como o ser humano tem um ciclo de vida – o homem nasce, cresce, reproduz e morre – os processos também têm seu ciclo de vida. Para gerenciar os processos e seus estados, o Sistema Operacional mantém guardado dados sobre todos os processos presentes na memória. Dessa forma, o agendador de processos pode saber informações úteis na hora de decidir qual processo terá acesso ao processador. Lembre-se do exemplo dos amigos que estão jogando vídeo-game, é necessário guardar os nomes e horários de cada jogador em uma tabela.

De forma parecida, o Sistema Operacional gerencia uma tabela de processos, na qual mantém dados como o estado atual do processo, um apontador que indica qual próxima instrução deve ser executada e tudo mais sobre o processo.

Mas, por que guardar tanta informação sobre o processo? Não seriam suficientes os dados presentes na área de memória reservada e uma tabela que indique o endereçamento de memória?

Para entender melhor a importância da tabela de processos e do agendador de processos, vamos comparar o agendador com o trabalho de um Continuísta (2) num set de filmagens onde várias cenas serão rodadas.

Num filme, devido a questões de agendas e compromissos dos atores e profissionais envolvidos, as cenas podem ser filmadas em diferentes ordens e em dias diferentes. Para que a cena possa prosseguir normalmente, é papel do continuísta saber dos detalhes entre as filmagens de uma cena, evitando as falhas de continuidade quando o filme estiver pronto. Já imaginou como seria estranho se surgissem objetos do nada no meio de uma cena! A Figura 7 mostra um erro de continuidade em uma cena do filme “Amor a Segunda Vista” (do inglês: Two Weeks Notice).

(2) Continuísta é o profissional responsável por manter, durante as diversas cenas e montagens de produções televisivas e cinematográficas, a harmonia do enredo, falas, sonoplastia e imagens.

Figura 7 – Cena de um filme com erros de continuidade
Fonte: <http://www.moviemistakes.com/picture38273>. Acesso em: 25 maio 2010.

 

Da mesma forma que ocorre com o trabalho do continuísta, é responsabilidade do Sistema Operacional, através do agendador de processos e da tabela de processos, manter consistência dos dados e estados dos processos quando esses estão alternando o uso do processador.

            Mas, não é apenas função do Sistema Operacional o agendamento dos processos, pois apesar deles competirem entre si pelo uso do processador e cada um tiver seu próprio espaço de memória protegido pelo Sistema Operacional da interferência de outros processos, existe a necessidade de cooperação entre os processos para executar tarefas mais complexas, exigindo uma certa comunicação entre eles, seja para troca de informação ou simplesmente quando a ordem das ações dos processos precisam ser executadas em determinada sequência. Essa cooperação entre os processos é também coordenada pelo Sistema Operacional.
 
Comunicação interprocessos

O ser humano não vive isoladamente, precisamos a todo momento nos comunicar uns com os outros, seja verbalmente seja por escrito ou através de gestos (por exemplo, através de um simples sinal de mão que você faz para seu colega numa partida de futebol dizendo que você está livre para receber a bola). No mundo da computação, mas especificamente quando falamos de processos, a comunicação é também muito importante. Por exemplo, quando mais de um processo compartilha o acesso da impressora, os processos precisam saber quando a impressora está disponível para ser utilizada.

Gerenciar a comunicação entre processos é uma tarefa um tanto complicada... para entender melhor essa complexidade, imaginemos a seguinte situação: Vamos dizer que você e seu amigo desejam comprar o mesmo livro em um mesmo site de vendas e ambos realizam o pedido quase ao mesmo tempo – após o pedido, o livro deverá ser colocado no seu carrinho de compra.

De acordo com a Figura 8, vemos que no estoque da loja virtual existe apenas uma unidade do livro que você deseja comprar (1), o processo da primeira compra verifica que o estoque do produto é igual a 1 e portanto ele registra essa informação entre seus dados internos (2), antes que esse processo adicione o livro no carrinho virtual de compras, o segundo processo verifica que ainda existe uma unidade do livro e registra essa informação internamente (3). Logo em seguida, ambos os processos gravam estoque zero para o sistema (4 e 5) e no final ambos os carrinhos virtuais estão com o mesmo livro de posse (6), provocando um erro.  

Figura 8 - Falha de comunicação na compra de um livro
Fonte: autoria própria.

 

Uma solução simples para que o segundo processo não executasse de forma errada seria se o primeiro processo tivesse gravado estoque zero antes que fosse verificado a situação do estoque pelo segundo processo, mas a ordem de execução das ações de cada processo é imprevisível.

Essa situação é conhecida como condição de corrida, pois a velocidade de execução dos processos que competem pelo mesmo recurso (no exemplo, o livro) determina o resultado final.

Para solucionar o problema, é preciso encontrar uma maneira de proibir que mais de um processo leia e grave dados compartilhados ao mesmo tempo, podemos dizer que queremos uma exclusão mútua, ou seja, uma forma de garantir que se um processo está utilizando-se de um recurso compartilhado, os outros processos estão impedidos de acessar o mesmo recurso.

A parte do programa que leva a uma condição de corrida é conhecida como região crítica, a ação de alterar o estoque no exemplo anterior pode ser considerado como uma região crítica e, caso ele esteja inserido em um programa, deve ser tratado de forma única toda vez que um processo começar a executá-lo. Considerando o exemplo anterior, o processo precisa antes obter acesso ao estoque e executar todas as ações, para então disponibilizar o estoque para os demais processos.

É, portanto, papel do Sistema Operacional garantir que os processos cooperem de forma correta e eficientemente. Para tanto, o Sistema Operacional trabalha para que algumas condições de execução sejam atendidas, entre elas podemos citar:

  1. não pode existir mais de um processo dentro de uma mesma região crítica;
  2. nenhum processo deve esperar eternamente para entrar em sua região crítica.

 

Garantido essas e outras condições, o Sistema Operacional permitirá que os processos se utilizem de recursos compartilhados sem a ocorrência de condições de corrida e sem situações de impasse na obtenção de exclusividade no acesso aos recursos.
 
Atividade 1
 
  1. Na internet, existem diversos exemplos que podem gerar condições de corrida. Cite um deles, explicando quais ações devem pertencer à região crítica para a exclusão mutua.
   
 
Deadlock: impasse entre processos

Quando dois ou mais processos ficam impedidos de continuar suas execuções, ou seja, estão bloqueados por estarem aguardando a liberação de recursos que estão alocados entre eles, essa situação é conhecida como Deadlock.

É difícil de identificar a ocorrência de deadlocks, basicamente essa situação de impasse pode ser representada pelo seguinte grafo(3):

(3) Diagrama composto de pontos, alguns dos quais são ligados entre si por linhas, e que é geralmente usado para representar graficamente conjuntos de elementos inter-relacionados.

Figura 9 - Processos A e B em deadlock devido os recursos R1 e R2
Fonte: autoria própria.

 

Observe que quanto mais recursos compartilhados são necessários para execução de um processo, há mais riscos desse processo passar por uma situação de impasse com outros processos. Um exemplo simples é processos de manipulação de banco de dados, onde as diferentes tabelas podem ser consideradas como recursos compartilhados, veja um exemplo no qual pode ocorre um deadlock:

            Para efetuar uma venda, um processo é criado no computador do banco de dados que precisa alocar as tabelas de estoque dos produtos e de clientes. Como vários vendedores podem registrar vendas ao mesmo tempo, dois processos podem receber o acesso de uma das tabelas em questão e ficarem aguardando a liberação da outra, assim, tanto os processos ficam bloqueados como os recursos ficam indisponíveis até que essa situação de impasse seja resolvida, mais quais as estratégias de tratamento de deadlocks?
 
Deadlocks: métodos de tratamento

Existem três estratégias básicas para o tratamento de deadlocks, veja-as a seguir.

            1 – Definir métodos de comunicação interprocessos que evitem o surgimento de deadlocks.
            2 – Detectar situações de deadlock e definir uma forma de restaurar o sistema, resolvendo o impasse.
            3 – Ignorar o problema e torcer que ele não ocorra. Conhecido como algoritmo do avestruz.

            Por incrível que pareça, a estratégia mais usada nos sistemas operacionais é a de ignorar os problemas de deadlock, pois os possíveis tratamentos desse tipo de situação podem acarretar em perdas de desempenho do sistema, comprometendo a execução dos processos. Assim, é mais comum que os próprios softwares procurem evitar situações de deadlock na lógica em seus códigos e, no caso de ocorrer alguma situação de impasse, é preferível encerrar a execução de um processo ou até reiniciar o computador em casos mais extremos.
 
NOTA

O SISO 2.0 (Simulador de Sistema Operacional) é um software educacional que permite simular situações de Detecção de Deadlock. Você pode executá-lo diretamente do seu navegador pelo link:
<http://martins.webcindario.com/jsiso/bin/index.html

 
Atividade 2
 
  1. Diversos exemplos na literatura de sistemas operacionais procuram demonstrar situações de deadlock. São exemplos simples, como o clássico exemplo dos cinco filósofos jantando. Procure na internet dados sobre esse exemplo e apresente como pode ocorrer um deadlock.

   
 

Término de processos

Para concluir o gerenciamento de processos, existe nos sistemas operacionais chamadas de sistema que possibilitam que o processo informe o fim de sua execução antes mesmo do fim do seu código. Uma chamada comum, presente em muitos sistemas operacionais que faz exatamente isto é a exit().

            Além desta função os sistemas operacionais também disponibilizam funções que permitem encerrar processos individualmente, a chamada que faz isto é a kill().
 
Resumo

Nesta aula, você viu que o gerenciamento de processos é um dos módulos fundamentais dos sistemas operacionais e é essencial o entendimento de seus principais conceitos. Foram apresentadas as ideias de processo, pseudoparalelismo e alternância entre processos, comunicação interprocessos e problemas relacionados, tais como condições de corrida e deadlocks.

 
Autoavaliação

1 - O que significa dizer que na gerência de processos acontece o que chamamos de  pseudoparalelismo?

2 - Qual o ciclo de vida de um processo?

3 - Por que dizemos que o gerenciamento de processos é uma atividade complexa?

4 - Defina com suas palavras o que é condição de corrida? Como esse conceito está relacionado com o conceito de área protegida?

5 - O que é o deadlock entre processos?

 
Referências

PROCESSO Windows. Disponível em <http://pt.kioskea.net/contents/processus/>. Acesso em: 21 jan. 2010.

SISO 2.0: simulador de sistema operacional: módulo de deadlock. Disponível em <http://www.martins.eti.br/2009/03/siso-20-simulador-de-sistema.html>. Acesso em: 21 jan. 2010.

TANENBAUM, Andrew S.; WOODHULL, Albert S. Sistemas operacionais: projeto e implementação. Trad. Edson Furmankiewicz. 2. ed. Porto Alegre: Bookman, 2000.

 
  voltar  Voltar . imprimir  Imprimir . topo  Topo