Problemas com Threads MO801/MC972. Muitas threads Se algumas threads ajudam o programa, muitas threads devem ajudar mais –Certo? O overhead de escalonamento.

Slides:



Advertisements
Apresentações semelhantes
Sistemas Operacionais
Advertisements

SISTEMAS OPERACIONAIS
Sistemas Distribuídos
Conceitos de Programação Paralela
IC - UFF Sistemas Operacionais Threads. IC - UFF Processos e threads Vimos o conceito de processo englobando duas características básicas: propriedade.
CONTROLE DE CONCORRÊNCIA
Introdução à Hierarquia de Memória
Sistemas distribuídos Metas de Projeto Prof. Diovani Milhorim
Sistemas Operacionais
WebDesign Redes de Computadores Aula 07
Bloqueios partilhados
Arquitetura de Sistemas Operacionais
Conceitos de Programação Paralela - 2
OpenMP MO801/MC972. Visão geral Biblioteca de mais alto nível para programação paralela Prevê memória compartilhada Requer suporte do compilador Exige.
PThreads MO801/MC972.
Memórias Transacionais
Aproveitamento do Processador
Chapter 4: Threads.
Capítulo 7: Deadlocks.
Bruno M. Carvalho Sala: 3F2 Horário: 35M34
Processos Conceitos Básicos.
Sincronização de Processos (3)
Arquitetura de Sistemas Operacionais
Threads.
Threads sem Sincronização
Concorrência em Java Threads em Java.
Monitores.
Locks.
Concorrência em Java Threads em Java.
Unidade 1-1 Processos e Threads
Fundamentos da Arquitetura de Computadores
SISTEMAS OPERACIONAIS
Sistemas Operacionais
Sistemas Operacionais
Linguagem de Programação IV
Sistemas Distribuídos
Conteúdo 1. Introdução Threads 2. Ambiente Monothread 3. Ambiente Multithread 4. Arquitetura e Implementação 5. Modelos de Programação.
Unidade 2 - Parte 1 Programação Concorrente
IC - UFF Sistemas Operacionais 4. Threads Texto base: capítulo 4 Operating Systems: Internals and Design Principles W. Stallings.
Transações Atômicas Distribuídas Prof. Alcides Calsavara
Controle de concorrência
Sistemas Operacionais
Sistemas Operacionais Prof. Galvez. PROBLEMA DE SEÇÃO CRITICA.
SISTEMAS OPERACIONAIS I Memória Virtual e Paginação
Computação L1: Infra-Estrutura Básica
Unidade Central De Processamento: Processador
Sistemas Operacionais
Programação com Threads
Escalonamento de Processos e Threads
Processos.
Transações Concorrentes
SISTEMAS OPERACIONAIS I
Sistemas Operacionais
Conceitos de thread Faculdade PITÁGORAS – Outubro de 2012
Sistemas Operacionais
Protocolo de Bloqueios
Controle de Concorrência
Gerenciamento de Memória
Bruno Affonso Diego Chiquito Ruan Berté.   O código de Escalonamento no Windows é implementado no Kernel.  A rotina que desempenha as tarefas do Escalonador.
Redes e Sistemas Distribuídos II – Cód Prof. MSc. Ronnison Reges Vidal.
Arquitetura de computadores
Capítulo 2 Processos e Threads 2.1 Processos 2.2 Threads
Deadlocks.
Programação Concorrente
Sistemas Operacionais
CURSO JAVA BÁSICO Módulo 9 – slide 1 Módulo 10 Threads.
Pearson Education Sistemas Operacionais Modernos – 2ª Edição 1 Sistemas Operacionais IESP - FATEC-PB Professor: Gustavo Wagner
Pearson Education Sistemas Operacionais Modernos – 2ª Edição 1 Sistemas Operacionais IESP - FATEC-PB Professor: Gustavo Wagner.
Pearson Education Sistemas Operacionais Modernos – 2ª Edição 1 Sistemas Operacionais FATEC-PB Professor: Gustavo Wagner
Pearson Education Sistemas Operacionais Modernos – 2ª Edição 1 Sistemas Operacionais FATEC-PB Professor: Gustavo Wagner
Transcrição da apresentação:

Problemas com Threads MO801/MC972

Muitas threads Se algumas threads ajudam o programa, muitas threads devem ajudar mais –Certo? O overhead de escalonamento de escalonamento começa a pesar –Tempo para salvar e restaurar o contexto –Concorrência pela cache –Concorrência pela memória virtual –Concorrência por recursos escassos (lock por exemplo)

Tempo para salvar e restaurar o contexto Em geral é bem pequeno Otimizado pelos sistemas operacionais que usam time slice de um tamanho razoável O que acontece quando, sucessivamente, threads são ativadas e bloqueiam logo em seguida?

Concorrência pela cache Assuma –Multithread com conjuntos de dados separados –Mais threads que o número físico de processadores A concorrência fará com que as threads sejam suspensas Os mecanismos de substituição das caches trocam os dados mais antigos –Que são exatamente os dados das threads antigas Acesso à memória é caro, não tirar proveito da cache também é caro

Concorrência pela memória virtual Mesmo problema da cache, em outro nível Pode não haver memória física o suficiente Pode não haver memória virtual o suficiente!

Concorrências por recursos escassos Locks geram serialização de acesso Muitas threads esperando por um mesmo lock –Se a thread que possui o lock encerrar seu time slot, todas as outras terão que esperar mais ainda

Sugestões Trabalhar com número de threads relacionado com o número físico de processadores –OpenMP Usar pool de threads, evitando o overhead de criar/matar threads –Existem bibliotecas para isso Criar seu próprio gerenciador de tarefas, usando work stealing (uma thread rouba trabalho da outra)

Onde e como podem acontecer condições de corrida Thread 1 x += 1 a[i] += 1 *p += 1 Foo(1) add [edi], 1 Thread 2 x += 2 a[j] += 2 *q += 2 Foo(2) add [edi], 2

Como corrigir? Inserir locks é uma alternativa Onde inserir? –Baixo nível Nos exemplos anteriores, locks poderiam ser colocados Como alternativas, poderiam ser usadas instruções atômicas –Alto nível Provavelmente também será necessário utilizar locks num nível de abstração superior Locks redundantes geram problemas de desempenho –Em geral, as implementações de locks são otimizadas para o caso mais comum (isso é bom)

Deadlocks Ocorrem quando –Há acesso exclusivo a um recurso –Uma thread pode possuir um recurso e solicitar outro –Nenhuma thread desiste do seu recurso –Existe um ciclo de threads tentando obter os recursos umas das outras Pode ser removido resolvendo uma das situações acima

Evitando deadlocks Replicação dos dados –Melhora também a escalabilidade –Nem sempre é possível Ordenação dos locks –Todas as threads solicitam os locks na mesma ordem –Qualquer ordem é suficiente Lexicográfica no nome do lock Ordem de endereço da memória do lock A thread desiste dos locks que possui se não conseguir os que necessita

Ordenação de Locks void AcquireTwoLocksViaOrdering( Lock& x, Lock& y) { if (&x<&y) { aquire x aquire y } else { aquire y aquire x }

Desistir de lock e tentar novamente void AcquireTwoLocksViaBackoff( Lock& x, Lock& y) { for (int t=1; ; t*=2) { acquire x try to acquire y if (y was acquired) break; release x wait for random amount of time between 0 and t }

Inversão de prioridades Threads de alta prioridade podem ser suspensas ao aguardarem por recursos bloqueados por threads de baixa prioridade –Nesse intervalo de tempo, threads de prioridade abaixo da primeira ficam executando Aconteceu na missão Mars Pathfinder da NASA

Soluções Herança de prioridade –Quando uma thread aguarda um lock, a thread que possui esse lock pode ter sua prioridade elevada para o mesmo nível da primeira –Somente locks que possuem inversão de prioridade cairão no caso acima –Método lazy

Soluções Teto de prioridade –Para cada lock é definido o valor máximo de prioridade que uma thread que o obtém pode ter –Qualquer thread que obtém o lock é elevada a esse nível de prioridade –Esse método eleva mais prioridades que o necessário

Particionamento de lock Ao invés de um único lock para um grande recurso, é interessante dividí-lo em partes e utilzar locks separados Use uma função de hash com o parâmetro para indicar que lock obter –Ex.: Um vetor de elementos com 20 locks apenas

Compartilhamento falso em caches A menor unidade de compartilhamento de dados entre processadores é uma linha de cache Ao invés de implementar concorrência em nível de palavras, procure aumentar o tamanho do elemento –Tamanho do vetor –Tamanho da estrutura