Top Banner
Locks
32

Locks. Mecanismo de sincronização entre threads. Muito utilizado em operações de transações. Transações devem ser programadas de modo que seus efeitos.

Apr 18, 2015

Download

Documents

Internet User
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Locks. Mecanismo de sincronização entre threads. Muito utilizado em operações de transações. Transações devem ser programadas de modo que seus efeitos.

Locks

Page 2: Locks. Mecanismo de sincronização entre threads. Muito utilizado em operações de transações. Transações devem ser programadas de modo que seus efeitos.

Locks

• Mecanismo de sincronização entre threads.

• Muito utilizado em operações de transações.

• Transações devem ser programadas de modo que seus efeitos sobre dados compartilhados sejam equivalentes em série.

Page 3: Locks. Mecanismo de sincronização entre threads. Muito utilizado em operações de transações. Transações devem ser programadas de modo que seus efeitos.

Instructor’s Guide for Coulouris, Dollimore and Kindberg Distributed Systems:

Concepts and Design Edn. 4 © Addison-Wesley Publishers 2005

Transaction life histories

Successful Aborted by client Aborted by server

openTransaction openTransaction openTransaction

operation operation operation

operation operation operation server abortstransaction

operation operation operation ERRORreported to client

closeTransaction abortTransaction

Page 4: Locks. Mecanismo de sincronização entre threads. Muito utilizado em operações de transações. Transações devem ser programadas de modo que seus efeitos.

Controle Concorrência

• Um problema bem conhecidos de transações concorrentes no contexto do exemplo do banco:

– “lost update”

• Como este problema pode ser evitado usando-se equivalência serial de execuções de transações ?

Page 5: Locks. Mecanismo de sincronização entre threads. Muito utilizado em operações de transações. Transações devem ser programadas de modo que seus efeitos.

Operações

• Assuminos que cada das operações deposit, withdraw, getBalance, setBalance, é uma synchronized operação, isto é, seus efeitos sobre a variável de instância que registra o balance (saldo) de uma conta é atômico.

Page 6: Locks. Mecanismo de sincronização entre threads. Muito utilizado em operações de transações. Transações devem ser programadas de modo que seus efeitos.

O problema “lost update”

• Sejam as contas A, B e C.• Sejam duas transações T e U sobre as contas

A, B e C.• Os valores iniciais de balance são: – A igual a $100, – B igual a $200, – C igual a $300.

Page 7: Locks. Mecanismo de sincronização entre threads. Muito utilizado em operações de transações. Transações devem ser programadas de modo que seus efeitos.

O problema “lost update”

• A transação T transfere um valor da conta A para a conta B.

• A transação U transfere um valor da conta C para a conta B.

• Em ambos os casos, o valor transferido é calculado para aumentar o saldo (balance) de B em 10%.

Page 8: Locks. Mecanismo de sincronização entre threads. Muito utilizado em operações de transações. Transações devem ser programadas de modo que seus efeitos.

Observação da Figura

• Daqui para frente, são mostradas as operações que afetam a variável balance (saldo) de uma conta, nas sucessivas linhas das seguintes figuras.

Page 9: Locks. Mecanismo de sincronização entre threads. Muito utilizado em operações de transações. Transações devem ser programadas de modo que seus efeitos.

Observação da Figura

• E o leitor da figura deve assumir que uma operação, numa linha em particular, é executada num tempo posterior do que a linha acima.

Page 10: Locks. Mecanismo de sincronização entre threads. Muito utilizado em operações de transações. Transações devem ser programadas de modo que seus efeitos.

Instructor’s Guide for Coulouris, Dollimore and Kindberg Distributed Systems:

Concepts and Design Edn. 4 © Addison-Wesley Publishers 2005

The “lost update” problem

Transaction T:

balance= b.getBalance();b.setBalance(balance*1.1);

a.withdraw(balance/10)

Transaction U:

balance= b.getBalance();b.setBalance(balance*1.1);

c.withdraw(balance/10)

balance=b.getBalance(); $200

balance= b.getBalance() $200

b.setBalance(balance*1.1) $220

b.setBalance(balance*1.1) $220

a.withdraw(balance/10) $80c.withdraw(balance/10) $280

Page 11: Locks. Mecanismo de sincronização entre threads. Muito utilizado em operações de transações. Transações devem ser programadas de modo que seus efeitos.

Resultado Correto!

• O efeito sobre a conta B de executar as transações T e U, deve ser para aumentar o balance (saldo) de B em 10%, duas vezes. Assim, o valor final deveria ser $242.

Page 12: Locks. Mecanismo de sincronização entre threads. Muito utilizado em operações de transações. Transações devem ser programadas de modo que seus efeitos.

Resultado !

• Os efeitos de permitir as transações T e U rodarem concorrentemente como na figura “lost update”, ambas as transações obtém o balance de B como $200 e então deposit $20.

• O resultado é incorreto, aumentando o balance de B em $20 ao invés de $42.

Page 13: Locks. Mecanismo de sincronização entre threads. Muito utilizado em operações de transações. Transações devem ser programadas de modo que seus efeitos.

Por que ?? Erro !!!

• O “update” de U é perdido porque T sobrescreve balance de B sem ver o “update” de U.

• Ambas as transações tem de ler o valor inicial de balance de B, antes de qualquer delas escrever o novo valor de balance de B.

Page 14: Locks. Mecanismo de sincronização entre threads. Muito utilizado em operações de transações. Transações devem ser programadas de modo que seus efeitos.

The “lost update” problem

• O problema de “lost update” ocorre quando duas transações T e U lêem o valor velho de uma variável (balance) e então usa ele para calcular o novo valor dessa variável (balance).

Page 15: Locks. Mecanismo de sincronização entre threads. Muito utilizado em operações de transações. Transações devem ser programadas de modo que seus efeitos.

The “lost update” problem

• Isto não pode acontecer, se uma transação é realizada antes da outra, porque a última transação lerá o valor escrito pela última transação.

Page 16: Locks. Mecanismo de sincronização entre threads. Muito utilizado em operações de transações. Transações devem ser programadas de modo que seus efeitos.

Resolvendo “lost update”

• Pode-se resolver o problema “lost update” por meio de uma equivalência serial de intercalações de transações T e U.

Page 17: Locks. Mecanismo de sincronização entre threads. Muito utilizado em operações de transações. Transações devem ser programadas de modo que seus efeitos.

Instructor’s Guide for Coulouris, Dollimore and Kindberg Distributed Systems:

Concepts and Design Edn. 4 © Addison-Wesley Publishers 2005

A serially equivalent interleaving of T and U

T Transaction

balance = b.getBalance()b.setBalance(balance*1.1)

a.withdraw(balance/10)

U Transaction

balance = b.getBalance()b.setBalance(balance*1.1)c.withdraw(balance/10)

balance = b.getBalance() $200

b.setBalance(balance*1.1) $220balance = b.getBalance() $220

b.setBalance(balance*1.1) $242a.withdraw(balance/10) $80

c.withdraw(balance/10) $278

Page 18: Locks. Mecanismo de sincronização entre threads. Muito utilizado em operações de transações. Transações devem ser programadas de modo que seus efeitos.

A serially equivalent interleaving of T and U

• A figura anterior mostra uma intercalação na qual as operações que afetam uma conta compartilhada, B, são realmente seriais.

• Ou seja, a transação T faz todas as suas operações sobre B, antes da transação U fazer.

Page 19: Locks. Mecanismo de sincronização entre threads. Muito utilizado em operações de transações. Transações devem ser programadas de modo que seus efeitos.

A serially equivalent interleaving of T and U

• Uma outra intercalação de T e U que tem esta propriedade é uma na qual a transação U completa suas operações sobre a conta B, antes da transação T iniciar.

Page 20: Locks. Mecanismo de sincronização entre threads. Muito utilizado em operações de transações. Transações devem ser programadas de modo que seus efeitos.

Locks

• Um servidor pode obter equivalência em série das transações, dispondo em série o acesso aos objetos.

Page 21: Locks. Mecanismo de sincronização entre threads. Muito utilizado em operações de transações. Transações devem ser programadas de modo que seus efeitos.

Equivalência em Série

• A figura seguinte mostra um exemplo de como a equivalência serial pode ser obtida com certo grau de concorrência.

• As transações T e U acessam a conta B, mas T conclui seu acesso antes que U comece a acessá-la.

Page 22: Locks. Mecanismo de sincronização entre threads. Muito utilizado em operações de transações. Transações devem ser programadas de modo que seus efeitos.

Instructor’s Guide for Coulouris, Dollimore and Kindberg Distributed Systems:

Concepts and Design Edn. 4 © Addison-Wesley Publishers 2005

A serially equivalent interleaving of T and U

T Transaction

balance = b.getBalance()b.setBalance(balance*1.1)

a.withdraw(balance/10)

U Transaction

balance = b.getBalance()b.setBalance(balance*1.1)c.withdraw(balance/10)

balance = b.getBalance() $200

b.setBalance(balance*1.1) $220balance = b.getBalance() $220

b.setBalance(balance*1.1) $242a.withdraw(balance/10) $80

c.withdraw(balance/10) $278

Page 23: Locks. Mecanismo de sincronização entre threads. Muito utilizado em operações de transações. Transações devem ser programadas de modo que seus efeitos.

Equivalência Serial

• Como implementar no computador ???

• Usa-se, para controle de concorrência, o mecanismo de Locks.

Page 24: Locks. Mecanismo de sincronização entre threads. Muito utilizado em operações de transações. Transações devem ser programadas de modo que seus efeitos.

Locks (Travas)

• Um exemplo simples de mecanismo para a disposição das tranasações em série, é o uso de locks (travas) exclusivos.

• Nesse esquema, o servidor tenta impedir o acesso (travar) a qualquer objeto que esteja para ser usado por qualquer operação da transação de um cliente.

Page 25: Locks. Mecanismo de sincronização entre threads. Muito utilizado em operações de transações. Transações devem ser programadas de modo que seus efeitos.

Locks

• Se um cliente solicitar o acesso a um objeto que já está travado devido a transação de outro cliente, o pedido será suspenso e o cliente querendo acessar, deverá esperar até que o objeto seja destravado.

• A próxima figura mostra o uso de locks (travas)

exclusivos.

Page 26: Locks. Mecanismo de sincronização entre threads. Muito utilizado em operações de transações. Transações devem ser programadas de modo que seus efeitos.

Transactions T and U with exclusive locks

Instructor’s Guide for Coulouris, Dollimore and Kindberg Distributed Systems: Concepts and Design Edn. 4

© Addison-Wesley Publishers 2005

Transaction T: balance = b.getBalance()b.setBalance(bal*1.1)

a.withdraw(bal/10)

Transaction U: balance = b.getBalance()b.setBalance(bal*1.1)c.withdraw(bal/10)

Operations Locks Operations Locks

openTransactionbal = b.getBalance() lock B

b.setBalance(bal*1.1) openTransaction

a.withdraw(bal/10) lock A bal = b.getBalance() waits for T ’s lock on B

closeTransaction unlock A , B lock B

b.setBalance(bal*1.1)

c.withdraw(bal/10) lock C

closeTransaction unlock B,

C

Page 27: Locks. Mecanismo de sincronização entre threads. Muito utilizado em operações de transações. Transações devem ser programadas de modo que seus efeitos.

Locks em Java

import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock;import java.util.concurrent.locks.Condition;

...

// Criação de um objeto acessLock da classe Lock para// controlar a sincronização de algum objeto// compartilhado.Private Lock acessLock = new ReentrantLock;

Page 28: Locks. Mecanismo de sincronização entre threads. Muito utilizado em operações de transações. Transações devem ser programadas de modo que seus efeitos.

Locks em Java// Condições para controlar a leitura e a escrita.private Condition podeEscrever = acessLock.newCondition();private Condition podeLer = acessLock.newCondition();

...// Escreve valor no objeto compartilhado ...// Para travar o objeto compartilhado, quando o método// set() for chamado ...

public void set( ... ) {

accessLock.lock(); // chama o método lock e bloqueia (trava) o objeto compartilhado. Esse método esperará até que a trava esteja disponível.

...

// Se o objeto estiver sem condição de escrita ...podeEscrever.await(); // Espera uma condição ocorrer

...

Page 29: Locks. Mecanismo de sincronização entre threads. Muito utilizado em operações de transações. Transações devem ser programadas de modo que seus efeitos.

Locks em Java// Sinaliza a thread que está esperando para fazer uma

leitura.

podeLer.signal(); // avisa que uma condição ocorreu ...

...

finally{accessLock.unlock; // destrava o objeto compartilhado.}

} // fim do método set.

Page 30: Locks. Mecanismo de sincronização entre threads. Muito utilizado em operações de transações. Transações devem ser programadas de modo que seus efeitos.

Locks em Java

// Ler valor no objeto compartilhado ...// Para travar o objeto compartilhado, quando o método// get() for chamado.

public void get() {

accessLock.lock() // chama o método lock e bloqueia (trava) o objeto compartilhado. Esse método esperará até que a trava esteja disponível.

...

// Se o objeto estiver sem condição de ser lido...podeLer.await(); // Espera uma condição ocorrer

...

Page 31: Locks. Mecanismo de sincronização entre threads. Muito utilizado em operações de transações. Transações devem ser programadas de modo que seus efeitos.

Locks em Java// Sinaliza a thread que está esperando para fazer uma// leitura.

podeEscrever.signal(); // avisa que uma condição ocorreu

...

finally{accessLock.unlock; // destrava o objeto compartilhado.}

} // fim do método get.

Page 32: Locks. Mecanismo de sincronização entre threads. Muito utilizado em operações de transações. Transações devem ser programadas de modo que seus efeitos.

Locks em Java

• Execute os exemplos Deitel 23.11 e 23.12, aproveitando os códigos em 23.6 (interface Buffer), 23.7 (Producer) e 23.8 (Consumer), para o Relacionamento Producer-Consumer com sincronização usando Locks.