Controle de Concorrência

Slides:



Advertisements
Apresentações semelhantes
SISTEMAS OPERACIONAIS (SO) Aula 5 Luciana A. F. Martimiano 2002
Advertisements

CONTROLE DE CONCORRÊNCIA
Introdução Gdes. bancos de dados: Concorrência: Transação:
Controle de Concorrência Serializabilidade
Aula 3 Requisitos dos SGBD
Sistemas Distribuídos:Definições e Caracteristicas
Sistemas de Informação Redes de Computadores
Recuperação Como garantir a integridade da informação, em caso de avarias de HW ou SW forma de suportar a reposição de um estado consistente da informação.
Bloqueios partilhados
Gestão de transacções noções básicas modelo simples modelo elaborado
Motor de Armazenamento
Transações Atômicas Distribuídas
Monitores.
Sumário 1 SQL Embutida 2 Processamento de Consultas
Conceitos de Programação Paralela - 2
Problemas com Threads MO801/MC972. Muitas threads Se algumas threads ajudam o programa, muitas threads devem ajudar mais –Certo? O overhead de escalonamento.
Problemas com Entrada e Saída
Processamento de Transação
Controle de Concorrência em Sistemas Distribuídos
Walfredo Cirne Threads Walfredo Cirne
Sistemas Distribuídos
Fundamentals of Database Processing
Sincronização de Processos (3)
Sincronização de Processos (5) - Monitores -
RECUPERAÇÃO APÓS FALHA
Classes e objetos Arrays e Sobrecarga
Classes e objetos P. O. O. Prof. Grace.
Threads sem Sincronização
Sincronização de Threads
Gerenciamento de Transações - Introdução
Monitores.
Locks.
Concorrência em Java Threads em Java.
Controle de Concorrência
Unidade 3 Controle de Concorrência
Problema de Inconsistência em Transações
Um Esquema de Replicação para Suportar Conectividade Fraca em Sistemas de Informação Móveis * Gustavo Fortes Tondello PPGCC – UFSC – 2005 * Original: A.
Aula prática 13 Orientação a Objetos – C++ Parte 1
Prof. Alessandro Gonçalves
Transações Prof: Galina
SISTEMAS DE GERENCIAMENTO DE BANCO DE DADOS Hélder Lima e Silva - hmls
Concorrência e Java RMI
Fiabilidade de Sistemas Informáticos Acções Atómicas
Controle Distribuído da Concorrência
Exercícios SGBD - CESPE
Transações Atômicas Distribuídas Prof. Alcides Calsavara
Controle de concorrência
Concorrência e thread Petrônio Júnior(pglj) Márcio Neves(mmn2)
Controle de Concorrência Locks. Conceito de Transação Transações podem ser vistas como um grupo de operações combinadas em uma unidade lógica de trabalho.
Universidade Federal de Campina Grande Centro de Engenharia Elétrica e Informática – CEEI Departamento de Sistemas e Computação Programa de Pós-Graduação.
Semáforos J2SE 5.0 Estudo da API e comparação com definição clássica Gustavo Frainer Rômulo Rosinha
Processos.
Transações Concorrentes
SISTEMAS DISTRIBUÍDOS Transações Atômicas
Problema de Inconsistência em Transações
Paulo Borba e Augusto Sampaio Centro de Informática Universidade Federal de Pernambuco Especificação de Sistemas Distribuídos.
Troca de Mensagens Programação concorrente
Bloqueios de Atualização
Sistemas Concorrentes Capítulo 02 – Threads
Protocolo de Bloqueios
Sistemas Distribuídos Aula 05 – Programação Multithread/Paralela
Controle de Concorrência
Video Capítulo 7: Sincronização de Processos. Silberschatz, Galvin and Gagne  Video Operating System Concepts Assuntos n Cenário n O problema.
Serialização Relaxada em Banco de Dados Múltiplos Andressa Sebben
Métodos e Classes para Sincronização no JDK 5.0 Vitor Hugo Becker
Controle de Concorrência Locks. Mecanismo de sincronização entre threads. Locks são utilizados há muitos anos em sistemas de banco de dados. O método.
Sumário 1 Processamento de Consultas 2 Introdução a Transações
Transações Banco de Dados II Aline S Costa 1. TRANSAÇÕES Conjunto de operações que formam uma única unidade lógica de trabalho; Conjunto de instruções.
UCSal – Bacharelado em Informática Tópicos Especiais em Informática II Profa. Semíramis Assis
Faculdade Pernambucana - FAPE Sistemas Operacionais Prof. Flávio Gonçalves da Rocha.
Transcrição da apresentação:

Controle de Concorrência Locks

Conceito de Transação Transações podem ser vistas como um grupo de operações combinadas em uma unidade lógica de trabalho. São usadas para controlar e manter a consistência e a integridade de cada ação em uma transação, a despeito dos erros que poderão ocorrer no sistema. 

Conceito de Transação Uma transação define uma sequência de operações que é garantida por um servidor, para ser atômica na presença de múltiplos clientes e na classe de falhas por crash de processos em servidores.

Atomicidade de Transações Atomicidade: “uma transação deve ser tudo ou nada”. Consistência: “uma transação toma o sistema de um estado consistente para um outro estado consistente”. Isolamento: “cada transação deve ser realizada sem interferência de outras transações”. Durabilidade: “após uma transação ter sido completada bem sucedida, todos os seus efeitos são salvos em memória permanente.

Transação Do ponto de vista do cliente, uma transação é uma sequência de operações que formam um única etapa, transformando os dados de um servidor de um estado consistente para um outro estado consistente. O cliente é provido com operações para marcar o início e o fim de uma transação.

Indivisibilidade Uma transação de cliente é também considerada como indivisível do ponto de vista da transação de outro cliente, no sentido que as operações de uma transação não podem observar os efeitos parciais das operações de uma outra transação.

Primeiro aspecto para a atomicidade “Tudo ou nada” Uma transação ou é completada bem sucedidamente e o efeito de todas as suas operações é registrado nos objetos, ou se ela falha ou é deliberadamente abortada, ela não tem nenhum efeito no todo.

Transaction Life Histories Figura 1 Successful Aborted by client Aborted by server openTransaction openTransaction openTransaction operation operation operation operation operation operation server aborts transaction operation operation operation ERROR reported to client closeTransaction abortTransaction Instructor’s Guide for Coulouris, Dollimore and Kindberg Distributed Systems: Concepts and Design Edn. 4 © Addison-Wesley Publishers 2005

Exemplo 1 Usamos como exemplo, uma aplicação bancária. Cada conta é representada por um objeto remoto, cuja interface Account provê operações para fazer depósito, saques, estabelecer (calcular) saldos e pedir informações sobre esses.

Operations of the Account interface deposit(amount) deposit amount in the account withdraw(amount) withdraw amount from the account getBalance() -> amount return the balance of the account setBalance(amount) set the balance of the account to amount

Exemplo de Transações 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 (saldo) são: A igual a $100, B igual a $200, C igual a $300.

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

Problema de Inconsistência Lost Update (Atualização Perdida)

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

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.

Transações Uma transação é a execução de uma sequência de solicitações (requests) de um cliente sobre operações (withdraw, deposit).

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%.

Sem sincronização Um servidor que controle transações, não cuidadosamente projetado, suas operações de diferentes clientes podem algumas vezes interferir com outras operações. Tais interferências podem resultar em valores incorretos nos objetos.

The “lost update” problem Figura 2 Transaction T : balance= b.getBalance(); b.setBalance(balance*1.1); a.withdraw(balance/10) U c.withdraw(balance/10) balance=b.getBalance(); $200 balance= b.getBalance() b.setBalance(balance*1.1) $220 $80 $280 Instructor’s Guide for Coulouris, Dollimore and Kindberg Distributed Systems: Concepts and Design Edn. 4 © Addison-Wesley Publishers 2005

Observações na Figura 2 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.

Observações na Figura 2 E o leitor da figura 2 deve assumir que uma operação, numa linha em particular, é executada num tempo posterior do que a linha acima.

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.

Resultado Obtido Figura 2 Os efeitos de permitir as transações T e U executarem 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.

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.

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).

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.

Intercalação Não-Serialmente Equivalente de operações de Transações T e U Considere a figura 2, com as transações T e U definidas. Então, considere a intercalação de suas execuções como na figura 2. Note que cada acesso de transação à variável b, não é serializado com respeito a um outro acesso.

Intercalação Não-Serialmente Equivalente de operações de Transações T e U Porque T não faz todos os seus acessos a b antes de U fazer, e U não faz todos os seus acessos a b antes de T fazer.

Ordem Serialmente Equivalente de operações de Transações T e U Ordens serialmente equivalentes requerem uma das seguintes condições: T acessa b antes de U. ou U acessa b antes de T.

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.

Uma intercalação serialmente equivalente de T e U - Figura 3 T Transaction balance = b.getBalance() b.setBalance(balance*1.1) a.withdraw(balance/10) U Transaction c.withdraw(balance/10) balance = b.getBalance() $200 $220 $242 $80 $278 Instructor’s Guide for Coulouris, Dollimore and Kindberg Distributed Systems: Concepts and Design Edn. 4 © Addison-Wesley Publishers 2005

Uma intercalação serialmente equivalente de T e U A figura 3 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 e conclui, antes da transação U começar a acessar B.

Uma intercalação serialmente equivalente de T e 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.

Equivalência em Série Se cada uma das transações tem o efeito correto quando executada sozinha ... Então pode-se inferir que se essas transações forem executadas uma por vez, em alguma ordem, o efeito combinado também será correto.

Equivalência em Série Uma intercalação das operações das transações em que o efeito combinado é igual ao que seria se as transações tivessem sido executadas uma por vez, em alguma ordem, é uma intercalação equivalente em série.

Equivalência em Série A figura 4 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.

Equivalência Serial 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.

Equivalência Serial Como implementar no computador ??? Usa-se, para controle de concorrência, o mecanismo de Locks.

Locks Um servidor pode obter equivalência em série de transações, dispondo em série o acesso aos dados compartilhados.

Transações T and U com Locks - Figura 4 Transaction : T Transaction : U balance = b.getBalance() balance = b.getBalance() b.setBalance(bal*1.1) b.setBalance(bal*1.1) a.withdraw(bal/10) c.withdraw(bal/10) Operations Locks Operations Locks openTransaction bal = b.getBalance() lock B openTransaction b.setBalance(bal*1.1) bal = b.getBalance() a.withdraw(bal/10) lock A waits for T ’s unlock on B closeTransaction unlock A , B lock B b.setBalance(bal*1.1) c.withdraw(bal/10) lock C closeTransaction unlock B C , Instructor’s Guide for Coulouris, Dollimore and Kindberg Distributed Systems: Concepts and Design Edn. 4 © Addison-Wesley Publishers 2005

Locks (Travas) Um exemplo simples de mecanismo para a disposição das transações em série, é o uso de locks (travas) exclusivos. Nesse esquema, um Lock tenta impedir o acesso (travar) a qualquer dado que esteja para ser usado por qualquer operação da transação de um cliente.

Locks Se um cliente solicitar o acesso a um dado 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.

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;

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

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.

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

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.

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.