Processos e Threads
Conceito de Processo
Abstrao de um programa em execuo. Processo = programa + entrada + sada + estado Um programa o conjunto de instrues necessrias execuo das operaes desejadas, enquanto um processo o programa associado ao seu conjunto de dados e variveis em determinado instante da execuo. Exemplo:
Um compilador um programa que pode ser executado por vrios usurios de uma s vez; neste momento, temse um nico programa (o compilador), mas vrios processos (um para cada compilao).
Conceito de Processo
Nos sistemas multiprogramados o processador pode ser chaveado entre vrios processos:
Pseudoparalelismo Cdigo do programa; Atividade corrente conforme Contador de Programa e valores correntes de todos o registradores do HW; Pilha de Processo, que contm dados temporrios
Um processo envolve:
Conceito de Processo
Conceitualmente cada processo tem seu processador virtual; O que acontece o rpido chaveamento do processador; O comportamento de um processo no determinstico;
Conceito de Processo
E/ S
E/ S
UCP
UCP
tempo
Estados de um Processo
1. Processo espera entrada de dados. 2. Outro processo escolhido para rodar. 3. CPU entregue ao novo processo. 4. Entrada de dados concluda.
Implementao de Processos
Estrutura de um Processo
PID owner (UID) prioridade de execuo data/ hora de criao tempo de processador quotas privilgios
Espao de Endereamento
nome
Contexto de Software
Contexto de Hardware
registrador SP
Programa
registrador de status
Implementao de Processos
estado do processo; contador do programa e apontador de pilha; valor dos registradores da CPU; informaes sobre escalonamento; informaes de contabilizao de uso do processador; informaes de E/S (lista de dispositivos alocados, lista de arquivos abertos, etc);
BCP pode ser implementado como uma tabela de processos, com uma entrada por processo.
Implementao de Processos
Listas de BCPs
Lista de processos em estado de pronto PCB# 5
. . . . . . . .
PCB# 1
. . . . . . . .
PCB# 9
PCB# 2
PCB# 4
Troca de Contexto
Sistema Operacional Processo A Processo B
executando
executando
executando
Threads
O modelo de processo considera que um processo um programa que realiza um nico fluxo de execuo; Isso s permite que o processo execute uma tarefa de cada vez; SOs modernos estendem este conceito para permitir que um processo tenha vrios fluxos de execuo, ou threads;
Threads
O processo pode executar mais de uma tarefa a cada vez; Permite que mltiplas execues ocorram no mesmo ambiente do processo com uma grau de independncia umas das outras; Tambm chamadas de Processos Leves;
Aplicaes multithread
Vantagens ?
Threads
Tentativa de reduzir o tempo gasto na criao, eliminao e troca de contexto e economizar recursos como um todo; Threads compartilham o processador da mesma forma que processos; Cada thread possui seu prprio contexto de hardware, porm compartilha contexto de software e espao de endereamento com demais threads do processo;
Threads
O programador e a linguagem devem prover proteo contra interferncias Algumas linguagens possuem modelo de concorrncia prprio (ex: ADA e Java) Outras linguagens utilizam extenses para lidar com threads (ex: C tipicamente usa Posix)
Processos Paralelos
No nosso dia a dia, encontramos vrias tipos de atividades que podem (e at devem) ser desenvolvidas em paralelo. Exemplo: construo de um prdio
muitos recursos (trabalhadores) esto disponveis o resultado (prdio pronto) obtido em menor tempo.
muitos recursos (CPU, memria, discos etc.) esto disponveis deseja-se sempre obter baixo tempo de resposta
Independentes:
Atividade de um no depende/interfere na do outro Implementao simples Atividade de um depende/interfere na atividade do outro necessrio algum mecanismo de comunicao, que em geral envolve acesso a variveis compartilhadas O acesso simultneo a uma mesma varivel pode conduzir a resultados imprevisveis (condio de corrida) Soluo: Excluso mtua a regies crticas
Concorrentes ou Cooperantes:
Vrios processos tentando acessar mesmo dado e resultado depende de qual deles executa no momento certo Parte do programa onde a memria compartilhada acessada. Seqncia de operaes executadas por um processo sobre um conjunto de variveis compartilhadas.
Um processo pode ter uma ou mais regies crticas e uma RC pode ter uma ou mais variveis compartilhadas Excluso mtua a RC um problema difcil!!!
Se dois processos esto executando concorrentemente, potencialmente qualquer entrelaamento das instrues pode ocorrer. Exemplo: processos SomaUm e SomaDois com os seguintes cdigos:
SomaUm x = x + 1; SomaDois x = x + 2;
Cada um desses processos tm um nico comando, mas trs instrues : (1) LD x (l x da memria), (2) adiciona constante, e (3) e ST x (escreve o novo valor de x na memria). Resultado no determinstico!
Excluso mtua tem como objetivo sincronizar processos de forma a garantir que determinadas partes do cdigo sejam executadas por no mximo um processo de cada vez; O desenvolvedor deve identificar as regies crticas do programa e utilizar alguma primitiva de comunicao; Sincronizao condicional permite que o programador faa com que um processo espere uma dada condio ser verdadeira antes de continuar sua execuo. O desafio para o desenvolvedor est em identificar onde colocar sincronizaes condicionais;
Dois processos no podem estar simultaneamente na sua regio crtica Nenhuma suposio pode ser feita a respeito da velocidade relativa de processamento ou do nmero de CPUs Nenhum processo parado fora da regio crtica pode bloquear outros processos Nenhum processo deve esperar indefinidamente para entrar em sua regio crtica.
Soluo mais simples O processo monopoliza a CPU e executa a RC do comeo ao fim de maneira ininterrupta Desvantagens: Se a RC longa, inibir interrupes pode ser inaceitvel Se o processo que inibiu as interrupes no retornar da RC, elas ficaro inibidas indefinidamente.
Fim do sistema
Processos rodando em outras CPUs podem entrar na RC Tcnica til para ser usada pelo ncleo do SO, mas no apropriado como mecanismo geral de excluso mtua para processos do usurio.
Variveis de Travamento
Varivel compartilhada que indica se a regio est liberada ou no; Valor inicialmente 0; Antes de entrar o processo verifica o valor; Se for 0 ele seta para 1 e entra; Se for 1, o processo espera; Existe algum problema nesta soluo?
Estrita Alternncia
Varivel indica de quem a vez de entrar na RC; Uso da espera ocupada, que deve ser evitada, em razo de consumir tempo de processador; O que acontece se um dos processos for muito mais rpido do que outro? Entrada estritamente alternada dos processos em suas regies crticas;
Soluo de Peterson
int turn; int interested (N); void enter_region (int process) { int other; other = 1 process; interested [process] = true; turn = process; while (turn == process && interested[other] == true) } void leave_region(int process) { interested [process] = false }
Solues tm o inconveniente de usar a Espera Ocupada nas suas implementaes; As solues apresentadas colocam o processo em um loop at que seja permitido acessar a RC; Alm de gastar processador pode levar a alguns problemas:
Busca por primitivas que bloqueiem a continuao da execuo do processo ao invs de gastar processador; Primitivas SLEEP e WAKEUP:
O Problema do Produtor-Consumidor: Dois processos compartilham um buffer de tamanho fixo; O produtor coloca informaes no buffer e o consumidor, retira; Caso o buffer esteja cheio, o produtor deve ser colocado para dormir; Se o buffer estiver vazio, o consumidor deve dormir, sendo acordado quando o produtor colocar algo no buffer; Pode levar a condies de corrida; Varivel (count) usada para controlar nmero de itens no buffer; Nmero mximo de itens no buffer = N;
while true do while true do Produz_item; if (Count == 0) sleep(); if (Count == N) sleep(); Remove-item; Grava_item; Count = count 1; Count = Count +1; if(Count ==N-1)wakeup(Produtor); if(Count ==1)wakeup(Consumidor) Consome_item; end; end;
O Problema do Produtor-Consumidor:
Condies de corrida podem ocorrer por causa do acesso irrestrito a Count; O que acontecer se o Consumidor interrompido logo aps ter lido Count = 0 ? O produtor comea a rodar logo depois disso colocando um item no buffer; Como Count era igual a 0 ele tenta acordar o Consumidor que no est dormindo e sim interrompido; Quando o Consumidor voltar a rodar a sim ser bloqueado. O produtor vai produzir at encher o buffer e tambm ser bloqueado...
Semforos:
Soluo proposta por Dijkstra; Um novo tipo de varivel foi criado: o Semforo Operaes DOWN e UP atmicas; DOWN(s)
Se s > 0, faz s = s 1 e quem chamou DOWN(s) entra na RC Se s = 0, RC est ocupada e quem chamou DOWN(s) bloqueado, ficando numa fila associada ao semforo s faz s = s + 1; se houver processos bloqueados na fila associada a s, um deles escolhido de forma justa e colocado no estado pronto para rodar para tentar DOWN(s) novamente.
UP(s):
Semforos:
Processo deseja entrar na regio crtica
DO
0)
N W
W N
(S >
= (S
D O
0)
UP (S) - processo sai da regio crtica Libera processo da fila de espera Processo acessa a regio crtica Fila de espera de processos
Semforos:
(* excluso mtua *) var mutex: semaphore := 1;
Os semforos e as operaes sobre eles so usualmente implementados como chamadas do SO; Implementados pela primeira vez em uma LP de alto nvel pelo ALGOL; Exemplo: Produtor-Consumidor usando Semforos
Full: conta posies do buffer j preenchidas; Empty: nmero de posies disponveis; Mutex: para garantir acesso exclusivo RC;
Full e Empty resolvem o problema da sincronizao entre os processos; Mutex resolve o acesso RC;
end;
end;
Coleo de procedimentos que operam sobre variveis compartilhadas por vrios processos, onde cada procedimento corresponde a uma RC.
Processos no podem ter acesso direto s estruturas de dados internas ao monitor. uma construo de linguagem de programao e no uma chamada ao sistema.
Garantia de excluso mtua: apenas um processo pode estar ativo dentro do monitor a cada instante.
Garantia de excluso mtua: apenas um processo pode estar ativo dentro do monitor a cada instante.
Uma forma comum atravs de semforos; O programador basta saber que deve colocar as regies crticas em procedimentos do monitor;
Sincronizao (bloqueio e desbloqueio) entre processos feito por meio de primitivas WAIT e SIGNAL; Java suporta monitores;
Adicionando a palavra synchronized declarao de um mtodo, Java garante que, uma vez iniciado qualquer thread executando aquele mtodo, a nenhum outro thread ser permitido executar qualquer outro mtodo synchronized naquela classe;
Todas as chamadas ao procedimentos so executadas sob excluso mtua Estruturas de sincronizao esto embutidas no monitor
monitor ProdutorConsumidor
procedure produz (mensagem); /* RC do Produtor */ if Count = n then WAIT(full); enter_item; count = count + 1; if count ==1 then SIGNAL(empty); end; /* produz */ procedure consome (mensagem); if count = 0 then WAIT(empty); remove_item; count = count - 1; if count = N-1 then SIGNAL(full); end; */ consome */ /*RC do Consumidor */
end; /* ProdutorConsumidor */
Java tem monitores orientados a objeto Em Java, existe um lock associado a cada objeto que no pode ser acessado diretamente pela aplicao Quando um mtodo identificado como synchronized, o acesso e feito apenas quando o lock associado com o objeto obtido Java associa condies a cada objeto Classe java.lang.Thread e interface java.lang.Runnable:
permitem que threads sejam definidas e seus estados de execuo e a colaborao sejam gerenciados;