Programação Concorrente Prof. Hugo Vieira Neto
Concorrência Um programa concorrente descreve diversas atividades que ocorrem simultaneamente, de modo diferente de programas comuns, que descrevem apenas uma atividade (ex: função main em linguagem C)
Prog. Sequencial x Prog. Concorrente Analogia indivíduo x equipe Indivíduo: Responsável por todas as tarefas Equipe: Ocorre divisão de tarefas entre vários indivíduos
Vantagens do Trabalho em Equipe Em uma equipe é menos complexo definir o trabalho de cada indivíduo Não há necessidade de um indivíduo mudar de atividade ao longo do tempo Há separação entre atividade e controle de atividade (priorização)
Implementação de Concorrência Sequencial Laço + Interrupções RTOS (Multi-thread) Tarefa 1 Laço Tarefa 1 Int Tarefa 2 Interrupção 1 Tarefa 2 Interrupção 2 Int Tarefa 3 Interrupção 3 Tarefa 3
Desafios Multi-core Sincronização de tarefas Mono-core Preempção de tarefas Compartilhamento de recursos Processador (chaveamento de contexto) Regiões de memória (variáveis) Periféricos
Multi-threading com RTOS Múltiplas linhas de execução P1 P2... Pn Múltiplos processos Memória compartilhada Periféricos compartilhados RTOS Hardware Processador Memória Periféricos
Multi-threading com RTOS RTOS cria processadores virtuais idênticos Registradores e pilha individuais Sistemas multi-core Muito mais processadores virtuais do que núcleos A soma da capacidade de processamento dos processadores virtuais é igual à capacidade de processamento original
Regiões de Memória Programação sequencial Flash RAM CPU CODE HEAP STACK DATA Registradores
Regiões de Memória Programação concorrente com RTOS Flash CPU CODE Registradores RAM RAM RAM HEAP Regs 1... Regs n DATA STACK 1 STACK n
Estado das Tarefas
Efeito ao Longo do Tempo (granularidade grossa)
Efeito ao Longo do Tempo (granularidade fina)
Exemplo de Aplicação com RTOS
Diagrama de Classes/Objetos (UML) Associação Agregação (guarda ponteiro) Composição (guarda mensagem) Obs: direção da seta indica navegabilidade da relação (quem conhece quem, quem pertence a quem); uso de estereótipos (<< >>) e ícones
Diagrama de Classes/Objetos (UML) Fila de mensagens Semáforo Evento Temporizador de software (RTOS) Funções: <<start>>, <<stop>>, <<callback>>
Diagrama de Classes/Objetos (UML) Comentário (ligado por linha tracejada) Comentário Threads (classes/objetos ativos) Nome Atributos Métodos
Diagrama de Classes/Objetos (UML) Objetos passivos Estereótipos comuns <<estereótipo>> Nome Objetos: <<isr>>, <<hw>>, <<function>> Relações: <<rd>>, <<wr>>, <<irq>>, <<start>>, <<stop>>, <<callback>>
Exemplo Utilizar a notação gráfica de diagramas de classe/objetos (UML) para representar uma aplicação que pisca um LED a cada 2 segundos utilizando um temporizador de software Thread T1 (controle do temporizador e do LED) Função de callback para temporização Comunicação: função de callback do temporizador avisa a thread T1 sobre a passagem do tempo por uma fila de mensagens
Acesso a Recursos Compartilhados Acessos múltiplos a recursos compartilhados, sem modificações de estado, podem ocorrer em paralelo sem conflitos Problemas surgem quando acessos a recursos compartilhados modificam o seu estado Acesso concorrente a memória compartilhada Acesso concorrente a periférico compartilhado Problema geral: garantir exclusão mútua
Conceito de Seção Crítica Seção do programa que acessa um ou mais recursos compartilhados Um único processo pode estar nesta seção em determinado instante de tempo Certificar-se de que no máximo um processo pode entrar na sua seção crítica (exclusão mútua)
Maiores Preocupações em Programação Concorrente Exclusão mútua Apenas um processo na seção crítica em determinado instante de tempo Ausência de impasse (deadlock) Se dois ou mais tentarem entrar, ao menos um terá sucesso Ausência de atrasos desnecessários Se não houver outros processos na seção crítica, um processo tentando entrar não deve sofrer atrasos Garantia de entrada
Como Garantir Exclusão Mútua? Soluções Software Semáforos Mensagens Suporte em hardware Processadores virtuais Ciclos RMW (read-modify-write) atômicos* Instruções LD/ST exclusivo (seção 5.7 do livro do Joseph Yiu): utilizadas para ligar e desligar semáforos
Algoritmo de Peterson (Software)
Trem 1 Trilho compartilhado Semáforos Analogia Semáforos em estradas de ferro, que indicam se os trilhos à frente estão livres ou ocupados por outro trem Estado: desligado ou ligado (por tempo suficiente para outro trem parar) Trem 2 Garantem exclusão mútua das seções críticas dos trilhos compartilhados Semáforo
Semáforos (RTOS) Tipos: Binário (sincronização) Um único recurso compartilhado do mesmo tipo (teto de contagem = 1) Contador (sincronização) Múltiplos recursos compartilhados do mesmo tipo (teto de contagem > 1) Mutex (exclusão mútua) Binário, mas somente a tarefa dona (owner) do semáforo pode desligá-lo
Sincronização por Mensagens (RTOS) Métodos Assíncrono Síncrono Síncrono com resposta
Método Assíncrono
Método Síncrono
Método Síncrono com Resposta
Projeto de Software Alto Nível (Arquitetura) Baixo Nível (Detalhado) Estrutural (Estático) Diagramas de Classes/objetos (geral) Diagramas de Classes/objetos (thread por thread) Comportamental (Dinâmico) Diagramas de Estado Diagramas de Sequência Diagramas de Atividades Diagramas de Estados
Projeto de Alto Nível Arquitetura da solução Classes/objetos ativos (threads, interrupções) Classes/objetos passivos (armazenamento) Threads periódicas: associadas a temporizador Temporizador: objeto passivo + callback Semáforos (binário, contador e mutex) Fila de mensagens (inteiros) Fila de eventos (bits)
Projeto de Baixo Nível Detalhamento da solução O que cada tarefa faz? Estruturas de controle Laço infinito com temporização Laço infinito com sincronização por mensagem ou evento Função com final de execução O que cada classe/objeto faz? Diagramas de estado Diagramas de atividade