Disciplina de Sistemas Distribuídos Sincronização em SD Prof. M.Sc. Alessandro kraemer@utfpr.edu.br
Cronograma Contextualização Tipos de sincronização Mecanismos para sincronização da região crítica Exclusão mútua Semáforos Monitores Exemplo de Semáforo
Contextualização Envio e recebimento de dados Sistema A Porta 80 Porta 1025 Sistema B Sistema... Porta... Porta... Sistema... S.O. Linux S.O. Windows O estabelecimento e sequência da comunicação são determinados pelos protocolos. Os programas (sistemas) gerenciam o acesso concorrente e a sincronização.
Contextualização Em programas concorrentes, não é possível determinar a ordem em que os eventos vão ocorrer. É necessária alguma forma de sincronização entre processos. Sincronizar processos significa coordenar as tarefas paralelas no tempo.
Contextualização A sincronização é feita especificando o ponto no programa onde duas ou mais. tarefas devem estar para que possam continuar a execução. Sincronizar também é organizar processos que tentam acessar uma região em memória (região crítica), procurando evitar deadlocks.
Tipos de sincronização Os processos se comunicam através de mensagens (send/receive). Cada processo executa um código idêntico, mas os dados recebidos na mensagem são diferentes. Esses dados podem alterar a região critica e por isso esse acesso deve ser controlado com mais cuidado. Cada processo também possui uma identificação única (UID) que é utilizada para sincronização.
Tipos de sincronização Região crítica A sincronização procura evitar deadlocks receive Send... Processo: -- Códigos idênticos -- UID diferentes -- Dados diferentes receive Send... Processo: -- Códigos idênticos -- UID diferentes -- Dados diferentes
Mecanismos para sincronização da região crítica Exclusão mútua Semáforo Monitor implementam e adaptam a exclusão mútua
Exclusão mútua Controle de acesso a regiões críticas Algoritmo centralizado: 1. Um processo é eleito o coordenador; 2. Os processos concorrentes devem requisitar permissão de acesso ao coordenador 3. Um processo que termina de fazer acesso a uma região crítica deve comunicar a liberação da região ao coordenador; 4. Processos que tentam entrar em uma região crítica ocupada devem aguardar em uma fila controlada pelo coordenador.
Exclusão mútua Eleição do coordenador Algoritmo de Bully: 1. Um processo P envia uma mensagem ELECTION para todos os processos de maior número. 2. Se nenhum processo responde, P vence a eleição e se torna o coordenador. 3. Se um dos processos responde este inicia sua participação na eleição a partir do passo 1. O trabalho de P está feito.
Semáforos Dijkstra (o mesmo dos protocolos de estado de enlace) introduziu a noção de semáforo para impor a exclusão mútua entre processos. O semáforo é uma variável inteira utilizada para parar ou liberar processos. Existe uma fila associada a essa variável onde processos bloqueados ficam no aguardo. Um vez iniciado um método, ele vai até o fim sem interrupção.
Monitores O principal objetivo desta técnica é evitar código duplicado em cada processo. O acesso a região crítica é controlado pelo monitor. Existe uma fila de processos e na medida que são atendidos eles evocam métodos do monitor. A fila é formada dentro do monitor. Somente um processo por vez pode ser executado dentro do monitor (exclusão mútua).
Exemplo de Semáforo Em java usa-se a classe Semaphore (pacote java.util.concurrent) Estes são os métodos mais importantes: acquire adquire uma ou mais permissões bloqueantes release libera as permissões adquiridas availablepermits numero de permissões disponíveis Cada acesso é uma permissão.
Exemplo de Semáforo No construtor da classe é possível definir se existe Fila ou se não há garantia de ordem dos acessos. // semáforo com 10 permissões e FILA Semaphore semafifo = new Semaphore (10, true) ; // semáforo com 10 permissões sem FILA Semaphore sema = new Semaphore (10) ;
Exemplo de Semáforo import java.util.concurrent.semaphore; public class AcessoBD { //... já existe um atributo bd que dá acesso ao Banco de Dados private Semaphore sema; public AcessoBD ( ) { sema = new Semaphore(10); // 10 permissões } } public void insere(string pstrsql) throws InterruptedException { sema.acquire( ); // adquire uma permissão bd.insere(pstrsql); sema.release( ); // libera uma permissão }