Você está na página 1de 85

Capítulo 6: Sincronismo de processo

Conceitos de Sistema Operacional com Java – 7a edição, 15/11/2006 Silberschatz, Galvin e Gagne ©2007
Capítulo 6: Sincronismo de processo

 Base
 O problema da seção crítica
 Solução de Peterson
 Hardware de sincronismo
 Semáforos
 Problemas clássicos de sincronismo
 Monitores
 Exemplos de sincronismo
 Transações indivisíveis

Conceitos de Sistema Operacional com Java – 7a edição, 15/11/2006 6.2 Silberschatz, Galvin e Gagne ©2007
Base
 Acesso concorrente aos dados compartilhados
pode resultar em inconsistência de dados
 Manutenção da consistência dos dados requer
mecanismos para garantir a execução ordenada
dos processos em cooperação
 Suponha que queiramos oferecer uma solução para
um problema de consumidor-produtor que preencha
todos os buffers. Podemos fazer isso com um
contador inteiro que acompanha o número de
buffers cheios. Inicialmente, o contador é definido
como 0. Ele é incrementado pelo produtor depois de
produzir um novo buffer e é decrementado pelo
consumidor depois de consumir um buffer.

Conceitos de Sistema Operacional com Java – 7a edição, 15/11/2006 6.3 Silberschatz, Galvin e Gagne ©2007
Produtor

Conceitos de Sistema Operacional com Java – 7a edição, 15/11/2006 6.4 Silberschatz, Galvin e Gagne ©2007
Consumidor

Conceitos de Sistema Operacional com Java – 7a edição, 15/11/2006 6.5 Silberschatz, Galvin e Gagne ©2007
Condição de race
 count++ poderia ser implementado como

register1 = count
register1 = register1 + 1
count = register1
 count-- poderia ser implementado como

register2 = count
register2 = register2 - 1
count = register2
 Considere esta execução intercalando com “count = 5” inicialmente:
S0: produtor executa register1 = count {register1 = 5}
S1: produtor executa register1 = register1 + 1 {register1 = 6}
S2: consumidor executa register2 = count {register2 = 5}
S3: consumidor executa register2 = register2 - 1 {register2 = 4}
S4: produtor executa count = register1 {count = 6 }
S5: consumidor executa count = register2 {count = 4}

Conceitos de Sistema Operacional com Java – 7a edição, 15/11/2006 6.6 Silberschatz, Galvin e Gagne ©2007
Solução do problema de seção critica
1. Exclusão mútua – Se o processo Pi estiver executando em sua
seção crítica, então nenhum outro processo poderá estar
executando em suas seções críticas.
2. Progresso – Se nenhum processo estiver executando em sua
seção crítica e houver alguns processos que queiram entrar em
sua seção crítica, então a seleção dos processos que entrarão na
seção crítica em seguida não poderá ser adiada indefinidamente.
3. Espera limitada - É preciso haver um limite sobre o número de
vezes que outros processos têm permissão para entrar em suas
seções críticas depois que um processo tiver feito uma solicitação
para entrar em sua seção crítica e antes que essa solicitação seja
concedida
 Suponha que cada processo seja executado em uma
velocidade diferente de zero
 Nenhuma suposição referente à velocidade relativa dos N
processos

Conceitos de Sistema Operacional com Java – 7a edição, 15/11/2006 6.7 Silberschatz, Galvin e Gagne ©2007
Problema de seção crítica

1. Condição race – Quando há acesso simultâneo aos


dados compartilhados e o resultado final depende da
ordem de execução.
2. Seção crítica – Seção do código onde os dados
compartilhados são acessados.
3. Seção de entrada - Código que solicita permissão para
entrar em sua seção crítica.
4. Seção de saída – Código executado após a saída da
seção crítica.

Conceitos de Sistema Operacional com Java – 7a edição, 15/11/2006 6.8 Silberschatz, Galvin e Gagne ©2007
Estrutura de um processo típico

Conceitos de Sistema Operacional com Java – 7a edição, 15/11/2006 6.9 Silberschatz, Galvin e Gagne ©2007
Solução de Peterson
 Solução em dois processos
 Suponha que as instruções LOAD e STORE sejam
indivisíveis; ou seja, não podem ser interrompidas.
 Os dois processos compartilham duas variáveis:
 int turn;
 Boolean flag[2]
 A variável turn indica de quem é a vez de entrar na seção
crítica.
 O array flag é usado para indicar se um processo está
pronto para entrar na seção crítica. flag[i] = true implica
que o processo Pi está pronto!

Conceitos de Sistema Operacional com Java – 7a edição, 15/11/2006 6.10 Silberschatz, Galvin e Gagne ©2007
Algoritmo para o processo Pi

Conceitos de Sistema Operacional com Java – 7a edição, 15/11/2006 6.11 Silberschatz, Galvin e Gagne ©2007
Seção crítica usando locks

Conceitos de Sistema Operacional com Java – 7a edição, 15/11/2006 6.12 Silberschatz, Galvin e Gagne ©2007
Hardware de sincronismo

 Muitos sistemas oferecem suporte do hardware pra o


código da seção crítica
 Uniprocessadores – poderiam desativar interrupções
 Código atualmente em execução poderia ser
executado sem preempção
 Geralmente muito ineficaz em sistemas
multiprocessadores
 Sistemas operacionais usando isso não são
totalmente escaláveis
 Máquinas modernas oferecem instruções de hardware
especiais indivisíveis
 Indivisível = não interrompida

 Ou testa word da memória e define valor


 Ou troca conteúdo de duas words da memória

Conceitos de Sistema Operacional com Java – 7a edição, 15/11/2006 6.13 Silberschatz, Galvin e Gagne ©2007
Estrutura de dados para soluções de
hardware

Conceitos de Sistema Operacional com Java – 7a edição, 15/11/2006 6.14 Silberschatz, Galvin e Gagne ©2007
Solução usando GetAndSet

Conceitos de Sistema Operacional com Java – 7a edição, 15/11/2006 6.15 Silberschatz, Galvin e Gagne ©2007
Solução usando Swap

Conceitos de Sistema Operacional com Java – 7a edição, 15/11/2006 6.16 Silberschatz, Galvin e Gagne ©2007
Semáforo
 Ferramenta de sincronismo que não exige espera ocupada
 Semáforo S – variável inteira
 Duas operações padrão modificam S: acquire() e release()
 Originalmente chamadas P() e V()
 Menos complicado
 Só pode ser acessado por duas operações indivisíveis

Conceitos de Sistema Operacional com Java – 7a edição, 15/11/2006 6.17 Silberschatz, Galvin e Gagne ©2007
Semáforo como ferramenta geral de sincronismo

 Semáforo de contagem – valor inteiro pode variar


por um domínio irrestrito
 Semáforo binário – valor inteiro só pode variar
entre 0 e 1; pode ser mais simples de implementar
 Também conhecidos como locks mutex

Conceitos de Sistema Operacional com Java – 7a edição, 15/11/2006 6.18 Silberschatz, Galvin e Gagne ©2007
Exemplo Java usando semáforos

Conceitos de Sistema Operacional com Java – 7a edição, 15/11/2006 6.19 Silberschatz, Galvin e Gagne ©2007
Exemplo Java usando semáforos

Conceitos de Sistema Operacional com Java – 7a edição, 15/11/2006 6.20 Silberschatz, Galvin e Gagne ©2007
Implementação de semáforo
 Precisa garantir que dois processos não poderão
executar acquire () e release () no mesmo semáforo ao
mesmo tempo
 Assim, a implementação se torna o problema de seção
crítica onde o código de espera e sinal são colocados na
seção crítica.
 Agora poderia ter espera ocupada na implementação
da seção crítica
 Mas o código de implementação é curto

 Pouca espera ocupada se a seção crítica


raramente for ocupada
 Observe que as aplicações podem gastar muito tempo
nas seções críticas e, portanto, essa não é uma boa
solução.

Conceitos de Sistema Operacional com Java – 7a edição, 15/11/2006 6.21 Silberschatz, Galvin e Gagne ©2007
Implementação de semáforo sem espera ocupada

 Com cada semáforo existe uma fila de espera


associada. Cada entrada em uma fila de espera
possui dois itens de dados:
 valor (do tipo integer)
 ponteiro para próximo registro na lista
 Duas operações:
 block – coloca o processo que chama a
operação na fila de espera apropriada.
 wakeup – remove um dos processos na fila
de espera e o coloca na fila de prontos.

Conceitos de Sistema Operacional com Java – 7a edição, 15/11/2006 6.22 Silberschatz, Galvin e Gagne ©2007
Implementação de semáforo sem espera ocupada (cont.)

 Implementação de acquire():

 Implementação de release():

Conceitos de Sistema Operacional com Java – 7a edição, 15/11/2006 6.23 Silberschatz, Galvin e Gagne ©2007
Deadlock e starvation

 Deadlock – dois ou mais processos estão esperando


indefinidamente por um evento que só pode ser causado somente
por um dos processos esperando
 Sejam S e Q dois semáforos inicializados com 1
P0 P1
S.acquire(); Q.acquire();
Q.acquire(); S.acquire();
. .
. .
. .
S.release(); Q.release();
Q.release(); S.release();
 Starvation – lock indefinido. Um processo pode nunca ser removido
da fila de semáforo em que ele é suspenso.

Conceitos de Sistema Operacional com Java – 7a edição, 15/11/2006 6.24 Silberschatz, Galvin e Gagne ©2007
Problemas clássicos de sincronismo

 Problema de buffer limitado


 Problema de leitores-escritores
 Problema do jantar dos filósofos

Conceitos de Sistema Operacional com Java – 7a edição, 15/11/2006 6.25 Silberschatz, Galvin e Gagne ©2007
Problema de buffer limitado

 N buffers, cada um podendo manter um item


 Mutex de semáforo inicializado com o valor 1
 Semáforo cheio inicializado com o valor 0
 Semáforo vazio inicializado com o valor N.

Conceitos de Sistema Operacional com Java – 7a edição, 15/11/2006 6.26 Silberschatz, Galvin e Gagne ©2007
Problema de buffer limitado

Conceitos de Sistema Operacional com Java – 7a edição, 15/11/2006 6.27 Silberschatz, Galvin e Gagne ©2007
Problema de buffer limitado
Método insert()

Conceitos de Sistema Operacional com Java – 7a edição, 15/11/2006 6.28 Silberschatz, Galvin e Gagne ©2007
Problema de buffer limitado
Método remove()

Conceitos de Sistema Operacional com Java – 7a edição, 15/11/2006 6.29 Silberschatz, Galvin e Gagne ©2007
Problema de buffer limitado (cont.)

 A estrutura do processo produtor

Conceitos de Sistema Operacional com Java – 7a edição, 15/11/2006 6.30 Silberschatz, Galvin e Gagne ©2007
Problema de buffer limitado (cont.)

 A estrutura do processo consumidor

Conceitos de Sistema Operacional com Java – 7a edição, 15/11/2006 6.31 Silberschatz, Galvin e Gagne ©2007
Problema de buffer limitado (cont.)

 A Factory

Conceitos de Sistema Operacional com Java – 7a edição, 15/11/2006 6.32 Silberschatz, Galvin e Gagne ©2007
Problema de leitores-escritores
 Um conjunto de dados é compartilhado entre diversos
processos concorrentes
 Leitores – só lêem o conjunto de dados; eles não
realizam quaisquer atualizações
 Escritores – podem ler e escrever.

 Problema – permite que vários leitores leiam ao mesmo


tempo. Apenas um único escritor pode acessar os dados
compartilhados de uma só vez.

 Dados compartilhados
 Conjunto de dados
 Mutex de semáforo inicializado com 1.
 db de semáforo inicializado com 1.
 readerCount inteiro inicializado com 0.

Conceitos de Sistema Operacional com Java – 7a edição, 15/11/2006 6.33 Silberschatz, Galvin e Gagne ©2007
Problema de leitores-escritores
Interface para locks de leitura-escrita

Conceitos de Sistema Operacional com Java – 7a edição, 15/11/2006 6.34 Silberschatz, Galvin e Gagne ©2007
Problema de leitores-escritores
Métodos chamados por escritores.

Conceitos de Sistema Operacional com Java – 7a edição, 15/11/2006 6.35 Silberschatz, Galvin e Gagne ©2007
Problema de leitores-escritores

 A estrutura de um processo escritor

Conceitos de Sistema Operacional com Java – 7a edição, 15/11/2006 6.36 Silberschatz, Galvin e Gagne ©2007
Problema de leitores-escritores

 A estrutura de um processo leitor

Conceitos de Sistema Operacional com Java – 7a edição, 15/11/2006 6.37 Silberschatz, Galvin e Gagne ©2007
Problema do jantar dos filósofos

 Dados compartilhados
 Tigela de arroz (conjunto de dados)
 Semáforo chopStick [5] inicializado com 1

Conceitos de Sistema Operacional com Java – 7a edição, 15/11/2006 6.38 Silberschatz, Galvin e Gagne ©2007
Problema do jantar dos filósofos (cont.)

 A estrutura do Filósofo i:

Conceitos de Sistema Operacional com Java – 7a edição, 15/11/2006 6.39 Silberschatz, Galvin e Gagne ©2007
Problemas com semáforos

 Uso correto das operações de semáforo:

 mutex.acquire() …. mutex.release()

 mutex.wait() … mutex.wait()

 Omissão de mutex.wait () ou
mutex.release() (ou ambos)

Conceitos de Sistema Operacional com Java – 7a edição, 15/11/2006 6.40 Silberschatz, Galvin e Gagne ©2007
Monitores

 Uma abstração de alto nível que oferece um


mecanismo conveniente e eficaz para o
sincronismo de processo
 Somente um processo pode estar ativo dentro
do monitor em determinado momento

Conceitos de Sistema Operacional com Java – 7a edição, 15/11/2006 6.41 Silberschatz, Galvin e Gagne ©2007
Sintaxe de um monitor

Conceitos de Sistema Operacional com Java – 7a edição, 15/11/2006 6.42 Silberschatz, Galvin e Gagne ©2007
Visão esquemática de um monitor

Conceitos de Sistema Operacional com Java – 7a edição, 15/11/2006 6.43 Silberschatz, Galvin e Gagne ©2007
Variáveis de condição

 Condição x, y;
 Duas operações em uma variável de
condição:
 x.wait () – um processo que invoca a
operação é suspenso.
 x.signal () – retoma um dos processos
(se houver) que invocou x.wait ()

Conceitos de Sistema Operacional com Java – 7a edição, 15/11/2006 6.44 Silberschatz, Galvin e Gagne ©2007
Monitor com variáveis de condição

Conceitos de Sistema Operacional com Java – 7a edição, 15/11/2006 6.45 Silberschatz, Galvin e Gagne ©2007
Solução do jantar dos filósofos

Conceitos de Sistema Operacional com Java – 7a edição, 15/11/2006 6.46 Silberschatz, Galvin e Gagne ©2007
Solução do jantar dos filósofos (cont.)

 Cada filósofo I invoca as operações takeForks(i) e


returnForks(i) na seqüência a seguir:

dp.takeForks (i)

COMER

dp.returnForks (i)

Conceitos de Sistema Operacional com Java – 7a edição, 15/11/2006 6.47 Silberschatz, Galvin e Gagne ©2007
Sincronismo em Java

 Java oferece sincronismo em nível de linguagem.


 Cada objeto Java possui um lock associado.
 Esse lock é adquirido pela invocação de um método
sincronizado.
 Esse lock é liberado na saída do método
sincronizado.
 Os threads esperando para adquirir o lock do objeto
são colocados no conjunto de entrada para o lock
do objeto.

Conceitos de Sistema Operacional com Java – 7a edição, 15/11/2006 6.48 Silberschatz, Galvin e Gagne ©2007
Sincronismo em Java

Cada objeto possui um conjunto de entrada associado.

Conceitos de Sistema Operacional com Java – 7a edição, 15/11/2006 6.49 Silberschatz, Galvin e Gagne ©2007
Sincronismo em Java
Métodos sincronizados insert() e remove()

Conceitos de Sistema Operacional com Java – 7a edição, 15/11/2006 6.50 Silberschatz, Galvin e Gagne ©2007
Sincronismo em Java: wait/notify()
 Quando um thread invoca wait():

1. O thread libera do lock do objeto;


2. O estado do thread é definido como Blocked;
3. O thread é colocado no conjunto de espera para
o objeto.

 Quando um thread invoca notify():

1. Um thread qualquer T do conjunto de espera é


selecionado;
2. T é movido da espera para o conjunto de entrada;
3. O estado de T é definido como Runnable.

Conceitos de Sistema Operacional com Java – 7a edição, 15/11/2006 6.51 Silberschatz, Galvin e Gagne ©2007
Sincronismo em Java
Entrada e conjuntos de espera

Conceitos de Sistema Operacional com Java – 7a edição, 15/11/2006 6.52 Silberschatz, Galvin e Gagne ©2007
Sincronismo em Java – buffer limitado

Conceitos de Sistema Operacional com Java – 7a edição, 15/11/2006 6.53 Silberschatz, Galvin e Gagne ©2007
Sincronismo em Java - buffer limitado

Conceitos de Sistema Operacional com Java – 7a edição, 15/11/2006 6.54 Silberschatz, Galvin e Gagne ©2007
Sincronismo em Java

 A chamada a notify() seleciona um thread


qualquer do conjunto de espera. É possível
que o thread selecionado não esteja de fato
esperando pela condição para a qual foi
notificado.
 A chamada notifyAll() seleciona todos os
threads no conjunto de espera e os move para
o conjunto de entrada.
 Em geral, notifyAll() é uma estratégia mais
conservadora do que notify().

Conceitos de Sistema Operacional com Java – 7a edição, 15/11/2006 6.55 Silberschatz, Galvin e Gagne ©2007
Sincronismo em Java – leitores-
escritores

Conceitos de Sistema Operacional com Java – 7a edição, 15/11/2006 6.56 Silberschatz, Galvin e Gagne ©2007
Sincronismo em Java – leitores-
escritores
Métodos chamados pelos leitores

Conceitos de Sistema Operacional com Java – 7a edição, 15/11/2006 6.57 Silberschatz, Galvin e Gagne ©2007
Sincronismo em Java – leitores-
escritores

Métodos chamados pelos escritores

Conceitos de Sistema Operacional com Java – 7a edição, 15/11/2006 6.58 Silberschatz, Galvin e Gagne ©2007
Sincronismo em Java
Ao invés de sincronizar um método inteiro, blocos
de código podem ser declarados como sincronizados

Conceitos de Sistema Operacional com Java – 7a edição, 15/11/2006 6.59 Silberschatz, Galvin e Gagne ©2007
Sincronismo em Java
Sincronismo de bloco usando wait()/notify()

Conceitos de Sistema Operacional com Java – 7a edição, 15/11/2006 6.60 Silberschatz, Galvin e Gagne ©2007
Recursos de concorrência em Java 5
Semáforos

Conceitos de Sistema Operacional com Java – 7a edição, 15/11/2006 6.61 Silberschatz, Galvin e Gagne ©2007
Recursos de concorrência em Java 5

Uma variável de condição é criada primeiro pela criação de


ReentrantLock e chamada do seu método newCondition():

Quando isso é feito, é possível invocar os métodos


await() e signal().

Conceitos de Sistema Operacional com Java – 7a edição, 15/11/2006 6.62 Silberschatz, Galvin e Gagne ©2007
Exemplos de sincronismo

 Solaris
 Windows XP
 Linux
 Pthreads

Conceitos de Sistema Operacional com Java – 7a edição, 15/11/2006 6.63 Silberschatz, Galvin e Gagne ©2007
Sincronismo no Solaris

 Implementa uma série de locks para dar suporte à


multitarefa, multithreading (incluindo threads em
tempo real) e multiprocessamento
 Usa mutexes adaptativos por eficiência ao
proteger dados de segmentos de código curtos
 Usa variáveis de condição e locks de leitores-
escritores quando seções de código maiores
precisam de acesso aos dados
 Usa turnstiles para ordenar a lista de threads
esperando para adquirir um mutex adaptativo ou
lock de leitor-escritor

Conceitos de Sistema Operacional com Java – 7a edição, 15/11/2006 6.64 Silberschatz, Galvin e Gagne ©2007
Sincronismo no Windows XP

 Usa máscaras de interrupção para proteger o


acesso aos recursos globais em sistemas de
uniprocessador
 Usa máscaras de interrupção para proteger o
acesso aos recursos globais em sistemas de
uniprocessador
 Usa spinlocks em sistemas de multiprocessador
 Também oferece objetos despachantes que
podem atuar como mutexes e semáforos
 Objetos despachantes também podem fornecer
eventos
 Um evento atua de modo semelhante a uma
variável de condição
Conceitos de Sistema Operacional com Java – 7a edição, 15/11/2006 6.65 Silberschatz, Galvin e Gagne ©2007
Sincronismo no Linux

 Linux:
 Desativa interrupções para implementar
seções críticas curtas
 Linux oferece:
 semáforos
 spin locks

Conceitos de Sistema Operacional com Java – 7a edição, 15/11/2006 6.66 Silberschatz, Galvin e Gagne ©2007
Sincronismo Pthreads

 API Pthreads é independente do OS


 Ela oferece:
 locks de mutex
 variáveis de condição
 Extensões não portáveis incluem:
 locks de leitura-escrita
 spin locks

Conceitos de Sistema Operacional com Java – 7a edição, 15/11/2006 6.67 Silberschatz, Galvin e Gagne ©2007
Transações indivisíveis
 Modelo do sistema
 Recuperação baseada em log
 Pontos de verificação
 Transações indivisíveis simultâneas

Conceitos de Sistema Operacional com Java – 7a edição, 15/11/2006 6.68 Silberschatz, Galvin e Gagne ©2007
Modelo do sistema
 Garante que as operações acontecem como uma única
unidade lógica de trabalho, em sua inteireza, ou não
acontecem
 Relacionado ao campo de sistemas de banco de dados
 Desafio é assegurar a indivisibilidade apesar das falhas do
sistema de computação
 Transação – coleção de instruções ou operações que realiza
única função lógica
 Aqui, nos preocupamos com mudanças no
armazenamento estável – disco
 A transação é uma série de operações read e write
 Terminado com operação commit (transação bem
sucedida) ou abort (transação falhou)
 Transação abortada deve ser rolled back para desfazer
quaisquer mudanças que ele realiza

Conceitos de Sistema Operacional com Java – 7a edição, 15/11/2006 6.69 Silberschatz, Galvin e Gagne ©2007
Tipos de meio de armazenamento
 Armazenamento volátil – informação armazenada aqui não
sobrevive a falhas do sistema
 Exemplo: memória principal, cache
 Armazenamento não volátil – A informação normalmente
sobrevive a falhas
 Exemplo: disco e fita
 Armazenamento estável – Informação nunca se perde
 Não é realmente possível, e por isso é aproximado pela
replicação ou RAID para dispositivos com modos de falha
independentes

Objetivo é garantir indivisibilidade da transação onde as falhas


causam perda de informações no armazenamento volátil

Conceitos de Sistema Operacional com Java – 7a edição, 15/11/2006 6.70 Silberschatz, Galvin e Gagne ©2007
Recuperação baseada em log
 Registro de informações em armazenamento estável sobre
todas as modificações feitas por uma transação
 Mais comum é o logging write-ahead
 Log em armazenamento estável, cada registro de log
descreve operação de escrita de única transação,
incluindo
 Nome da transação

 Nome do item de dados

 Valor antigo

 Valor novo

 <Ti inicia> escrito no log quando a transação Ti inicia


 <Ti confirma> escrito quando Ti confirma
 Entrada de log precisa alcançar o armazenamento estável
antes que a operação ocorra

Conceitos de Sistema Operacional com Java – 7a edição, 15/11/2006 6.71 Silberschatz, Galvin e Gagne ©2007
Algoritmo de recuperação baseado em
log
 Usando o log, o sistema pode tratar de quaisquer erros de
memória volátil
 Undo(Ti) restaura o valor de todos os dados atualizados
por Ti
 Redo(Ti) define valores de todos os dados na transação Ti
para novos valores
 Undo(Ti) e redo(Ti) devem ser idempotentes
 Múltiplas execuções devem ter o mesmo resultado que
uma execução
 Se o sistema falhar, restaura estado de todos os dados
atualizados em log
 Se log contém <Ti starts> sem <Ti commits>, undo(Ti)
 Se log contém <Ti starts> e <Ti commits>, redo(Ti)

Conceitos de Sistema Operacional com Java – 7a edição, 15/11/2006 6.72 Silberschatz, Galvin e Gagne ©2007
Pontos de verificação
 Log poderia se tornar longo, e recuperação poderia levar
muito tempo
 Pontos de verificação encurtam log e tempo de recuperação.
 Esquema de ponto de verificação:
1. Enviar todos os registradores de log atualmente no
armazenamento volátil para o armazenamento estável
2. Enviar todos os dados modificados do armazenamento
volátil para o estável
3. Enviar um registro de log <checkpoint> para o log no
armazenamento estável
 Agora a recuperação só inclui Ti, tal que Ti iniciou a execução
antes do ponto de verificação mais recente, e todas as
transações após Ti. Todas as outras transações já estão em
armazenamento estável

Conceitos de Sistema Operacional com Java – 7a edição, 15/11/2006 6.73 Silberschatz, Galvin e Gagne ©2007
Transações concorrentes

 Devem ser equivalentes à execução serial -


serialização
 Poderiam executar todas as transações na seção
crítica
 Ineficiente, muito restritivo
 Algoritmos de controle de concorrência oferecem
serialização

Conceitos de Sistema Operacional com Java – 7a edição, 15/11/2006 6.74 Silberschatz, Galvin e Gagne ©2007
serialização
 Considere dois itens de dados A e B
 Considere as transações T0 e T1
 Execute T0, T1 de forma indivisível
 Seqüência de execução chamada schedule
 Ordem de transação executada de forma
indivisível chamada schedule serial
 Para N transações, existem N! schedules
seriais válidos

Conceitos de Sistema Operacional com Java – 7a edição, 15/11/2006 6.75 Silberschatz, Galvin e Gagne ©2007
Schedule 1: T0 depois T1

Conceitos de Sistema Operacional com Java – 7a edição, 15/11/2006 6.76 Silberschatz, Galvin e Gagne ©2007
Schedule não serial
 Schedule não serial permite execução sobreposta
 Execução resultante não necessariamente incorreta
 Considere schedule S, operações Oi, Oj
 Conflito se acessar mesmo item de dados, com pelo
menos uma escrita
 Se Oi, Oj consecutivos e operações de diferentes
transações & Oi e Oj não em conflito
 Então S’ com ordem trocada Oj Oi equivalente a S
 Se S puder se tornar S’ via swapping de operações não
em conflito
 S é seriável em conflito

Conceitos de Sistema Operacional com Java – 7a edição, 15/11/2006 6.77 Silberschatz, Galvin e Gagne ©2007
Schedule 2: Schedule seriável simultâneo

Conceitos de Sistema Operacional com Java – 7a edição, 15/11/2006 6.78 Silberschatz, Galvin e Gagne ©2007
Protocolo de lock

 Garante serialização pela associação de lock a cada item de


dados
 Segue protocolo de lock para controle de acesso
 locks
 Compartilhado – Ti tem lock de modo compartilhado (S)
no item Q, Ti pode ler Q mas não escrever Q
 Exclusivo – Ti tem lock em modo exclusivo (X) em Q, Ti
pode ler e escrever Q
 Exige que cada transação no item Q adquira lock apropriado
 Se lock já for mantido, nova solicitação pode ter que esperar
 Semelhante ao algoritmo de leitores-escritores

Conceitos de Sistema Operacional com Java – 7a edição, 15/11/2006 6.79 Silberschatz, Galvin e Gagne ©2007
Protocolo de lock em duas fases
 Geralmente, garante serialização em conflito
 Cada transação emite solicitações de lock e
unlock em duas fases
 Crescimento – obtendo locks
 Encolhimento – liberando locks
 Não impede deadlock

Conceitos de Sistema Operacional com Java – 7a edição, 15/11/2006 6.80 Silberschatz, Galvin e Gagne ©2007
Protocolos baseados em estampa de
tempo
 Selecione a ordem entre transações com antecedência –
ordenação por estampa de tempo
 Transação Ti associada à estampa de tempo TS(Ti) antes que
Ti inicie
 TS(Ti) < TS(Tj) se Ti entrou no sistema antes de Tj
 TS pode ser gerado pelo clock do sistema ou como
contador lógico incrementado em cada entrada de
transação
 Estampas de tempo determinam a ordem de serialização
 Se TS(Ti) < TS(Tj), sistema deve garantir schedule
produzido equivalente a schedule serial, onde Ti aparece
antes de Tj

Conceitos de Sistema Operacional com Java – 7a edição, 15/11/2006 6.81 Silberschatz, Galvin e Gagne ©2007
Implementação do protocolo baseado em
estampa de tempo
 Item de dados Q recebe duas estampas de tempo
 estampa-W(Q) – maior estampa de tempo de qualquer
transação que executou write(Q) com sucesso
 estampa-R(Q) – maior estampa de tempo de read(Q) bem
sucedido
 Atualizado sempre que read(Q) ou write(Q) é executado
 Protocolo de ordenação por estampa de tempo garante que
qualquer read e write em conflito sejam executados na ordem
da estampa de tempo
 Suponha que Ti execute read(Q)
 Se TS(Ti) < estampa-W(Q), Ti precisa ler valor de Q que já
foi modificado
 operação read rejeitada e Ti cancelada
 Se TS(Ti) ≥ estampa-W(Q)
 read executado, estampa-R(Q) definido como
max(estampa-R(Q), TS(Ti))

Conceitos de Sistema Operacional com Java – 7a edição, 15/11/2006 6.82 Silberschatz, Galvin e Gagne ©2007
Protocolo de ordenação de estampa de
tempo
 Suponha que Ti execute write(Q)
 If TS(Ti) < estampa-R(Q), valor Q produzido por Ti foi
necessário anteriormente e Ti assumiu que nunca seria
produzido
 Operação write rejeitada, Ti cancelada

 Se TS(Ti) < estampa-W(Q), Ti tentando escrever valor


obsoleto de Q
 Operação write rejeitada e Ti cancelada

 Caso contrário, write executado


 Qualquer transação cancelada Ti recebe nova estampa de
tempo e é reiniciada
 Algoritmo garante serialização por conflito e ausência de
deadlock

Conceitos de Sistema Operacional com Java – 7a edição, 15/11/2006 6.83 Silberschatz, Galvin e Gagne ©2007
Schedule possível sob protocolo de estampa
de tempo

Conceitos de Sistema Operacional com Java – 7a edição, 15/11/2006 6.84 Silberschatz, Galvin e Gagne ©2007
Final do Capítulo 6

Conceitos de Sistema Operacional com Java – 7a edição, 15/11/2006 Silberschatz, Galvin e Gagne ©2007

Você também pode gostar