Concorrência STRD Roteiro Sistemas de Tempo Real Sistemas de Tempo Real Distribuidos Processos X Threads Concorrência Problemas Sistemas de Tempo Real Trabalham sobre restrições temporais. Subsistemas de controle (computadores) e subsistemas controlados (ambiente). Interação Tirar amostras Processar Responder Respeitando restrições de tempo. Sistemas de Tempo Real Hard Real Time Conseqüências catastróficas Ex.: Sistemas de controle de avião Soft Real Time Sem maiores conseqüências Ex.: Ar-condicionado Sistemas de Tempo Real Distribuídos Sistemas distribuídos com restrições temporais. Processos distintos em diferentes processadores trabalhando nos mesmos requisitos. Benefícios Concorrência Degradação Sistemas de Tempo Real Distribuídos Finalidade Melhorar tempo de resposta Aumentar confiabilidade Aumento de complexidade Particionamento de tarefas Comunicação entre processos Sistemas de Tempo Real Distribuídos Características Operação contínua Restrições de tempo severas Interação assíncrona entre processos Atrasos de comunicação e race conditions Resultados não deterministicos Estado global Múltiplas thread de interação de processos Processos vs Threads Processos -Um processo é uma forma abstrata de encarar um programa em execução. Threads -Linhas de execução dentro de um processo Processos vs Threads Diferenças Processos Threads Pode conter uma ou mais threads Tem um único processo como dono Cara comunicação entre processos(Troca de contexto) Comunicação barata, usa memória do processo. Seguro, não podem corromper outros processos Não é seguro, pois outras threads podem usam a mesma memória do processo. Exclusão Mútua Técnica usada para evitar que dois processos ou threads tenham acesso simultaneamente a um recurso compartilhado Atende: Único processo em região crítica Todo processo deve eventualmente conseguir entrar em sua região crítica Busy waiting É o método de controle de sincronização onde uma variável compartilhada cujo valor pode ser manipulado (modificado e testado/test-and-set) através de uma primitiva indivisível, cria-se um modo simples para a sincronização de processos concorrentes Busy waiting Busy waiting Busy-waiting possui várias desvantagens, como por exemplo, o gasto supérfluo de CPU. Programas utilizando tais primitivas são difíceis de entender, depurar e provar que estão corretos, em virtude de serem implementados em baixo nível. Semáforos Semáforos são estruturas de dados usadas para resolver problemas de sincronização de tarefas. Foi inventado por Edsger Dijkstra. Tem como função o controle de acesso a recursos compartilhados num ambiente multitarefa. Semáforos Um semáforo S é uma variável inteiro positiva sobre a qual os processos podem fazer duas operações P(S) e V(S). Operações de P e V são atômicas e indivisíveis. Uso de fila para manter processos que esperam no semáforo. Semáforos Inicialização: Recebe um valor inteiro indicando a quantidade de processos que podem acessar um determinado recurso. Operação P(S): Decrementa o valor do semáforo. Se o semáforo está com valor zerado, o processo é posto para dormir. Operação V(S): Se o semáforo estiver com o valor zerado e existir algum processo adormecido, um processo será acordado. Caso contrário, o valor do semáforo é incrementado. Tipos de Semáforos Semáforos Binários Valor inicial é 1. Usado para criar exclusão mútua no acesso a recursos . Semáforos de Contagem Valor inicial é normalmente maior do que 1. Utilizados para sincronização e controle de alocação de recursos Valor inicial do semáforo é igual ao número de unidades do recurso Monitores Monitor é um alto nível de construção para sincronização em programação concorrente Encapsula estados - Um monitor pode ser visto como uma classe que pode ser usada em programas concorrentes Como uma classe, um monitor tem métodos e atributos para manipular dados Várias threads podem acessar um monitor ao mesmo tempo, logo ele possui suporte a métodos que garantem a exclusão mútua Todo monitor tem uma fila associada com threads aguardando para entrar Monitores Monitores possuem variáveis de condição Um variável de condição possui duas operações: wait e notify Para uma variável de condição x, qualquer thread, t1, que faça chamada para x.wait() é bloqueada e colocada em uma fila associada com x Quando outra thread, t2, fizer uma chamada x.notify(), se a fila associada com x não estiver vazia, uma thread é removida da fila e inserida na fila de threads que estão eleitas para executar Sincronização de Processos Processo Processo Recursos do Sistema Processo Processo Corrupção de Dados Procedure echo(); Var out, in: character; begin input (in, keyboard); out := in; output (out, display) end. Starvartion P1 Recursos do Sistema P2 P3 Deadlock P1 R1 R2 P2 Soluções Exclusão Mútua Busy Wait Semáforo Selective Waiting Se o programa “guardado” for um operador de mensagem (receive, send) então chama-mos a declaração de selective waiting(introduzido em CSP). Selective Waiting Passagem de mensagem: o receptor deve esperar até que o processo ou canal entregue a comunicação. Problema: a ordem de chegada das mensagens é desconhecida para servidor Selective Waiting Djikstra’s guarded commands Executado quando a guarda é verdadeira Determinismo Uso de guardas: Não-determinística (Choice) Uso de declarações definidas: Escolha determinística (if) Selective Waiting Validação da guarda: Mais de uma verdadeira: escolha arbitrária. Nenhuma verdadeira: erro de condição => declaração abortada. Utilização de Recursos Controle dos recursos dispositivos externos, arquivos, dados compartilhados, etc Podem ser requisitados por vários processos que estão rodando concorrentemente Evitar deadlocks e inconsistências Gerenciamento e utilização desses Recursos • Processos: – Servers: Processos que controla o acesso e encapsula recursos do sistema – Clients: Processos que irão utilizar os recursos • Conditional Wait • Avoidance • Utilização: – Shared – Exclusive Deadlock Situação no sistema onde dois ou mais processos ficam impedidos de continuar suas execuções Condições para que ocorra um deadlock: Condição de não-preempção Condição de espera circular Condição de exclusão mútua Condição de posse-e-espera Deadlock • A prevenção pode ser feita garantindo que pelo menos uma das condições citadas nunca ocorra • Pode ser evitado fazendo com o que o sistema verifique as consequências da alocação de um recurso • Recuperação do sistema: – – – Desabilitando a exclusão mútua de algum recurso Abortando um ou mais processos Preempção de alguns recursos de um ou mais processos que estão em deadlock Referências Burns, Allan and Wellings, Andy. Real Time System and Their Programming Languages. Tsai, Jeffrey and Yang, Steve. Monitoring and Debugging of Distributed Real Time Systems.