Programação Concorrente e Paralela. Noemi Rodriguez

Documentos relacionados
Sistema Distribuído. Sistema Distribuído. Aplicações Distribuídas. Conceitos Básicos

Programação Concorrente

Programação de Alto Desempenho - 2. Prof: Carla Osthoff

Fundamentos de Sistemas Operacionais

Ferramentas para Programação em Processadores Multi-Core

Sistemas Operacionais

Fundamentos de Sistemas Operacionais

Paralelização de Algoritmos de CFD em Clusters Multi-Core MC7. Escola de Verão Arquiteturas Multi-Core

INE5645 Programação Paralela e Distribuída - Prova 1 22/10/2012 Aluno: Parte 1 Controle de Concorrência Conceitos Básicos (2,5)

Processos e Threads e em sistemas distribuídos. Prof. Me. Hélio Esperidião

1 Porque o estado de um processo deve ser salvo quando ele deixa a CPU?

Sistemas Distribuídos e Paralelos

Sincronização e Comunicação entre Processos. Adão de Melo Neto

Fundamentos de Sistemas Operacionais

Aula 6: Comunicação entre processos. Instituto Federal da Bahia INF009 - Sistemas Operacionais Profª Flávia Maristela

OpenMP: Variáveis de Ambiente

Programação Paralela e Distribuída

Programação Concorrente e Paralela

Sistemas Distribuídos Aula 3

DEPARTAMENTO DE CIÊNCIA DA COMPUTAÇÃO SISTEMAS OPERACIONAIS I SEM/12 PROVA I. Tempo de Prova: 100 minutos / Escore Máximo: 300 pontos

Sistemas Distribuídos Aula 7

Sistemas Distribuídos

Thread. Thread. Sistemas Operacionais. Leonard B. Moreira. UNIVERSIDADE ESTÁCIO DE SÁ fevereiro, / 41

Computadores e Programação (DCC/UFRJ)

Processamento Paralelo

Sistemas Operacionais. Condição de corrida e Região crítica

PROGRAMAÇÃO ORIENTADA A OBJETOS. Aula 11 - Threads e Concorrência

Algoritmos Computacionais

Introdução à Programação Paralela através de Padrões. Denise Stringhini Calebe Bianchini Luciano Silva

Programação Concorrente e Paralela

ENADE 2011 SISTEMAS OPERACIONAIS

Sistemas Operacionais (SO)

Sincronização e comunicação entre processos

Programação Paralela e Distribuída

Introdução Aplicações Concorrentes Especificação de Concorrência em Programas Problemas de Compartilhamento de Recursos Exclusão Mútua Sincronização

Programação concorrente (processos e threads)

Sistemas Operacionais. Comunicação entre processos

Multiprogramação leve em arquiteturas multi-core

Universidade Estadual de Mato Grosso do Sul UEMS Curso de Ciência da Computação Disciplina de Algoritmos Paralelos e Distribuídos

Processos Concorrentes

exercício 1 Piscar o LED a cada 1 segundo Parar ao pressionar o botão, mantendo o LED aceso para sempre Programa interativo!

SSC510 Arquitetura de Computadores. 6ª aula

Sistemas Operacionais Aula 3

Threads. O que é uma Thread? Paralelismo

Paralela e Distribuída. com o MPI e o OpenMP

1B Conceitos Básicos: Indique Verdade/Falso

Sistemas Operacionais II

Programação Orientada a Objetos. Concorrência

Sistemas Operacionais - UCSAL Professor : Marco Antônio C. Câmara Primeira Lista de Exercícios

Medida do Tempo de Execução de um Programa. Bruno Hott Algoritmos e Estruturas de Dados I DECSI UFOP

Concorrência. Sistemas Distribuídos e Tolerância a Falhas. Lia Ribeiro 1

Ruby e JRuby em... Paralelos e Distribuídos. Felipe Barden Lucas Fialho Zawacki

SOP - TADS Threads. Revisão Ultima aula. Programa em execução Cada processo têm sua própria CPU

PROGRAMAÇÃO ORIENTADA A OBJETOS. Aula 12 - Threads e Concorrência em Java

Capítulo 2. Multiprogramação. Conteúdo. Objetivo. Recordando. Recordando. DCA-108 Sistemas Operacionais

Exercícios Cap I. 1.1, 1.2, 1.3 (somente letras (a), (b) e (c)) , 1.8 e 1.12 IC - UFF

Introdução a Sistemas Operacionais. Adão de Melo Neto

Estratégias de Escalonamento de Processos

Escalonamento de Processos Estratégias de Escalonamento de Processos

Gerenciamento de Transações em Banco de Dados

Parallel Computing Paradigms

Sistemas Distribuídos Capítulo 3 - Aula 3

Linguagens de Programação Classificação

Análise de Algoritmos

Prof. Silvana Rossetto 9 de julho de DCC/IM/UFRJ

Sistemas Operacionais

Transcrição:

2016

o que é programação concorrente e paralela? programação concorrente: composição de linhas de atividades independentes programação paralela: execução simultânea de linhas de atividades Go blog (Rob Pike) Concurrency is about dealing with lots of things at once. Parallelism is about doing lots of things at once.

Programação Concorrente não necessariamente envolve diferentes linhas de execução alternativas para modelos de servidores concorrentes mas modelo mais comum de concorrência é multitarefa necessidade de comunicação entre diferentes linhas de execução

programação concorrente e paralela comunicação entre processos acesso compartilhado a dados concorrência: bases de dados, informações sobre conexões,... paralelismo: dados de problemas científicos,... espera por estados desejáveis concorrência: nova requisição de cliente,... paralelismo: novos resultados, novos dados para processamento,... sincronização!

Programação Concorrente linhas de controle independentes ativas simultaneamente o que é atividade? um processador X múltiplos processadores estudo nasceu com sistemas operacionais importância hoje: atendimentos concorrentes disputa por recursos!

Programação Paralela execução realmente simultânea linhas de execução que colaboram (ou não) em busca de solução paralelismo para melhoria de desempenho (ou viabilidade de execução) paralelismo e concorrência em ambos os casos necessidade de coordenação entre atividades cooperação x competição

Objetivos da disciplina princípios e técnicas de programação concorrente multiprocessadores memória compartilhada troca de mensagens memória distribuída troca de mensagens padrões de programação paralela exemplos clássicos: multiplicação de matrizes, resolução de sistemas casos mais irregulares: espaços de busca

que princípios e técnicas são esses? notações para controle de fluxo criação de processos e threads, ou outras formas de expressão de paralelismo abstrações de comunicação sincronização em sistemas de memória compartilhada... mas problemas também existem sem memória compartilhada... propriedades: safety e liveness avaliação de desempenho balanceamento de carga

Referências M. Herlihy, N. Shavit. The Art of Multiprocessor Programming. Morgan Kaufmann, 2008. M. Quinn. Parallel Programming in C with MPI and OpenMP. McGraw-Hill, 2003. P. Pacheco. An Introduction to Parallel Programming. McGraw-Hill, 2011. artigos técnicos.

Fluxos de Execução classificação

Fluxos de Execução processos, threads preemptivos, threads cooperativos pilha de execução dados globais? espaços de endereçamento protegidos? preempção?

Fluxos Independentes transferência globais arquivos abertos... pilha 1 pilha 2 pilhas independentes? acesso a globais?

Processos transferência descritores globais globais globais pilha 1 pilha 2 descritores locais descritores locais pilhas independentes globais independentes descritores podem ser compartilhados preempção

Threads Preemptivas transferência globais descritores pilha 1 pilha 2 pilhas independentes globais compartilhadas descritores compartilhados preempção

Preempção I/O completado bloqueado pronto escalonado preempção requisição i/o fim em execução finalizado

Threads Cooperativas transferência globais descritores pilha 1 pilha 2 pilhas independentes globais compartilhadas descritores compartilhados sem preempção

Concorrência: modelo mais comum threads preemptivos com memória compartilhada pthreads

Exemplo: Busca de primos com memória compartilhada imprimir primos entre 1 e 10 10 máquina de 10 processadores um thread por processador

Busca de Primos com Memória Compartilhada void primeprint (void) { long int j; for (j = 1, j<100000000000; j++) { if (isprime(j)) printf("%ld\n", j); } }

Busca de Primos com Memória Compartilhada idéia 1: cada thread testa um intervalo pré-definido cada thread executa: void primeprint (void){ long int j; int i = ThreadID.get(); // IDs in {0..9} for (j = i*109+1, j<(i+1)*109; j++) { if (isprime(j)) printf("%ld\n", j); } } nem todos os intervalos têm números iguais de primos números grandes: maior dificuldade computacional desbalanceamento

Busca de Primos com Memória Compartilhada idéia 2: contador compartilhado int counter = new Counter(1); cada thread executa: void primeprint { long j = 0; while (...) { j = counter.getandincrement(); if (isprime(j)) print(j); } }

Contador Compartilhado o objeto counter é único para todos os threads public class Counter { private long value; } public long getandincrement() { return value++; }

Contador Compartilhado o objeto counter é único para todos os threads e o problema é que podemos ter: public class Counter { private long value; public long getandincrement() { return value++; } } temp = value; value = value + 1; return temp

Memória Compartilhada e Preempção muitos entrelaçamentos são possíveis... thread 1: thread 2: temp = value temp = temp + 1 value = temp temp = value temp = temp +1 value = temp que mundo é esse em que value++ não tem o efeito que esperamos...?

Memória Compartilhada e Preempção e mais do que isso... não basta pensar nos entrelaçamentos possíveis!

Memória Compartilhada e Preempção You don t know Jack about shared variables or memory models. Hans-J. Boehm and Sarita V. Adve. 2012. Commun. ACM 55, 2 (February 2012), 48-54.

Memória Compartilhada e Preempção imagine que o programa usa valores maiores do que a palavra do hardware x++ traduzido para algo como: tmp_hi = x_hi; tmp_lo = x_lo; (tmp_hi, tmp_lo)++; x_hi = tmp_hi; x_lo = tmp_lo;

Memória Compartilhada e Preempção ler artigo Boehm para a próxima aula

Concorrência: programador sempre terá que lidar com dificuldades de programação? mecanismos e técnicas mecanismos para lidar com memória compartilhada semáforos e locks monitores mecanismos não bloqueantes memória transacional eliminar memória compartilhada troca de mensagens e outras abstrações utilizar multithreading cooperativo soluções mais recentes propriedades garantidas pelo compilador D, DPJ,...

Paralelismo: questões como paralelizar a solução de um problema? objetivo maior normalmente é obter menor tempo de execução desenho da solução paralela normalmente é dependente da plataforma de execução que plataformas facilitam o desenvolvimento e depuração? como medir o tempo de execução e comparar soluções? tolerância a falhas: como garantir que o trabalho feito até o momento da falha não seja perdido?

Inicialmente: Sincronização como criar mecanismos que garantam acesso exclusivo aos dados em ambientes de memória compartilhada...? propriedades de safety e liveness

Seções Críticas conceito clássico em sistemas de memória compartilhada seção crítica: trecho de código que apenas uma thread pode estar executando em determinado momento public class Counter { private long value; private Lock lock; public long getandincrement() { int temp = value; value = value + 1; return temp; } }

Garantia de Exclusão Mútua protocolos de entrada e saída de regiões críticas public class Counter { private long value; private Lock lock; public long getandincrement() { lock.lock(); try { int temp = value; value = value + 1; } finally { lock.unlock(); } return temp; } } se executado em threads 0 e 1: RC 0 RC 1 ou RC 1 RC 0

Exclusão Mútua Propriedades garantia da exclusão mútua ausência de deadlock entrada em algum momento (ausência de starvation) ausência de esperas desnecessárias thread não espera quando não há competição pela RC

Classes de Propriedades safety programa nunca entra em estado ruim liveness programa em algum momento entra em estado bom

Soluções de exclusão mútua utilizando espera ocupada estudo clássico alguma utilidade com múltiplos processadores algoritmos interessantes (!) complexidade: caso com 2 threads é o mais inteligível Peterson Filtros Padaria

Exclusão Mútua Propriedades garantia da exclusão mútua safety ausência de deadlock safety entrada em algum momento (ausência de starvation) liveness ausência de esperas desnecessárias nível de concorrência

Exclusão mútua: algoritmo de Peterson

Exclusão Mútua public void lock(0) { flag[a] = true; victim = A; while (flag[b] && victim == A) {}; public void lock(0) { flag[b] = true; victim = B; while (flag[a] && victim == B) {}; funciona? vamos supor, por contradição, que ambos estão na seção crítica

... funciona? prova por contradição do código: write A (flag[a]=true)! write A (victim=a)! read A (flag[b])! read A (victim)!cs A write B (flag[b]=true)! write B (victim=b)! read B (flag[a])! read B (victim)!cs B vamos assumir: write B (victim=b)! write A (victim=a) como A entrou na RC: write A (victim=a)! read A (flag[b] == false) mas então write B (flag[b]=true)! write B (victim=b)! write A (victim=a)! read A (flag[b] == false) public void void lock(1) lock() { { flag[a] flag[i] = true; = true; victim = i; victim = A; Art of Multiprocessor while (flag[j] && victim == i) {}; while (flag[b] && victim Programming == A) {}; 55

Exclusão Mútua: problemas! soluções baseadas em variáveis dependem de ordenação que pode se perder na compilação... public void lock(0) { victim = 0; [2] flag[0] = true; [3] while (flag[1] && victim == 0) [4] {}; public void lock(1) { victim = 1; [1] flag[1] = true; [5] while (flag[0] && victim == 1) [6] {};