Ferramentas para Programação em Processadores Multi-Core

Documentos relacionados
Pthreads. O que são threads? Mario João Junior. Uma thread é um fluxo de execução de instruções que pode ser escalonado pelo sistema operacional.

ORGANIZAÇÃO E ARQUITETURA DE COMPUTADORES II AULA 07: PROGRAMANDO COM THREADS EM LINGUAGEM C

POSIX Threads. Walter Fetter Lages.

Introdução aos Sistemas Operacionais. Threads

Ferramentas para Programação em Processadores Multi-Core

Trabalhando com Processos e Threads em Ambiente LINUX

Programação com Pthreads

Na Aula Anterior... O Conceito de Threads

as alterações feitas por um thread num recurso partilhado (ex: fechar um ficheiro) serão "vistaa" pelos outros threads.

Programação em Memória Partilhada com o Pthreads

Exclusão Mútua (mutex)

Multiprogramação leve em arquiteturas multi-core

Programação concorrente usando threads POSIX e Java

Sincronização e comunicação entre entidades de processamento. Mutex Volnys Bernal 1. Tópicos. Exclusão Mútua (mutex) Exclusão Mútua (Mutex)

Sistemas Operacionais

Programming for Shared Memory with Pthreads

Threads. threads em Linux Taisy Weber

Sistemas Operacionais

EEL770 Sistemas Operacionais

Threads. Agenda. Threads. Processo. Processo. Processo. Processo. (c) Volnys B. Bernal Versão de 22/3/2012

Threads em Ambiente LINUX. Estudo e testes com a biblioteca pthreads

Sistemas Operacionais

Arquitetura de Computadores Sistemas Operacionais II

Sistemas Operacionais

Leandro Soares de Sousa (DSc.) Página: Aula 04 - desenvolvimento multithread

Linguagem de Programação I

Sistemas Operacionais II

Sistemas Operacionais II

72 ERAD 2009 Caxias do Sul, 17 a 20 de março de 2009

Leandro Soares de Sousa (DSc.) Página: Parte II

Introdução a Programação Concorrente. Aula 02. Prof. André Luis Meneses Silva

Sistemas de Computação. Threads e Sincronização

Programação Sistemas

Pthreads API. Criação de Threads: usando Pthreads

Introdução ao OpenMP

Universidade Estadual de Mato Grosso do Sul Bacharelado em Ciência da Computação Sistemas Operacionais Prof. Fabrício Sérgio de Paula

Paralelismo em Computadores com Tecnologia Multicore

Sistemas Operacionais

Programando com Threads em C

Threads. Pedro Cruz. EEL770 Sistemas Operacionais

OO Engenharia Eletrônica

OO Engenharia Eletrônica

Memória Compartilhada

Programação de Sistemas

Unidade 2. Processos Threads Concorrência em Java

Ferramentas para Programação em Processadores Multi-Core

Escalonamento (Exclusão Mútua)

INE 5645 Programação Paralela e Distribuída

Mecanismos de Sincronização com Variáveis Compartilhadas

Threads ou Processos Leves

Processos e Threads. Ciclo 2 AT3. Prof. Hermes Senger

ASOP - Arquitecturas e Sistemas Operativos (2009/10) 2 a Parte do Exame (Sistemas Operativos/A) 5 de Julho de 2010

AULA 06: PROGRAMAÇÃO EM MÁQUINAS PARALELAS

Programação Concorrente com Thread Java. Luiz Affonso Guedes Sistemas Distribuidos

2 Programação Concorrente: Threads, MPI e PVM

INE 5645 PROGRAMAÇÃO PARALELA E DISTRIBUIDA PROVA 2 12/06/2017 ALUNO

INE 5645 PROGRAMAÇÃO PARALELA E DISTRIBUIDA PROVA 2 12/06/2017. ALUNO Prof. Bosco

Fluxos de Execução. Um programa seqüencial consiste de um único fluxo de execução, o qual realiza uma certa tarefa computacional.

INTRODUÇÃO AOS SISTEMAS OPERACIONAIS SEMANA 13

Sistemas Distribuídos Aula 7

Programação em Paralelo OpenMP

LabSO Gerência de Processos. Processos. Porque eu preciso entender este assunto?

Threads

Introdução OpenMP. Nielsen Castelo Damasceno

Programação de Sistemas Carris

Threads. Fluxos de Execução. Exemplos de Programas MT (1) Exemplos de Programas MT (2)

Threads

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

Sistemas Operativos: Concorrência (Parte 2)

Eventos. Rotinas Assíncronas

Programação com Posix Threads

Programação de Sistemas Cafetaria

Chapter 4: Threads. Operating System Concepts 8th Edition

Paralela e Distribuída. Memória Partilhada com o Pthreads

Sincronização. Problema da Exclusão Mútua

Segundo trabalho prático de implementação Sistema de reserva de assentos

! Os primeiros computadores permitiam a execução de apenas um programa de cada vez, com acesso completo aos recursos do sistema

Threads em Java. Java Threads. Java Componentes: JVM JVM:

Real Time Application Interface

Sistemas Operacionais

tutorial. man fork man pthread_create man pthread_join man wait man sleep

Programação de Sistemas em Tempo Real

SISTEMAS OPERACIONAIS. 2ª. Lista de Exercícios

Programação Paralela

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

Linguagem de Programação I

UM ESTUDO COMPARATIVO DE DESEMPENHO UTILIZANDO PROGRAMAÇÃO SEQUENCIAL VS PARALELA APLICADO EM ALGORITMOS GENÉTICOS 1

INE 5645 PROGRAMAÇÃO PARALELA E DISTRIBUIDA PROVA 2 12/06/2017 ALUNO

Ferramentas modernas para programação multithread

Fundamentos de Sistemas Operacionais

Sistemas Operacionais I

Sincronização e Comunicação entre Processos. Sincronização e Comunicação Volnys Bernal 1. Agenda

Programação concorrente (processos e threads)

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

OO Engenharia Eletrônica

Sistemas Operacionais: Sincronização entre processos

Fundamentos de Sistemas Operacionais

MC504 Sistemas Operacionais MC514 Sistemas Operacionais: Teoria e

Transcrição:

Ferramentas para Programação em Processadores Multi-Core Prof. Dr. Departamento de Informática Universidade Federal de Pelotas Sumário Introdução Arquiteturas multi-core Programação multithread Prática de programação Considerações finais Programa de Verão 2008 Petrópolis, 14 a 17 de janeiro de 2008. 1 2 POSIX threads pthreads Biblioteca de funções Paralelismo não estruturado OpenMP Diretivas de compilação / Biblioteca de serviços Paralelismo aninhado.net Framework Integrado com a linguagem Threads definidas no contexto de objetos Padrão IEEE POSIX 1003.1c 1995 Definido para permitir compatibilidade de programas multithread entre diferentes plataformas Define a interface de serviço (API) É de uso geral Linux LinuxThreads NPTL Native POSIX Threads Library Windows pthreads_win32 3 4

Pthread Corpo de um thread Função C/C++ convencional Recebe e retorna endereços de memória Variáveis locais visíveis apenas no escopo da função void *foo(void *args) {... // Código C/C++... Dois threads podem ser criados a partir da mesma função, no entanto, são instâncias diferentes!!! Interface básica Serviços pthread_xxxx Tipos de dados pthread_t_xxxx Macros PTHREAD_XXXXX Retorno dos serviços Código de erro. Execução sem erro retorna 0 (zero). Manipula a variável errno Conceito Estrutura de dados opaca 5 6 int pthread_create(..., void *(*foo)(void *), void *arg ); Término: void pthread_exit(void *retval ); return (void *)retval; Sincronização: int pthread_join(pthread_t tid, void **ret); Identificação: pthread_t* pthread_self(void); int pthread_create( pthread_t *tid, pthread_attr_t *atrib, void *(*func)(void *), void *args ); Cria um novo fluxo de execução (um novo thread). O novo fluxo executa de forma concorrente com o thread original 7 8

int pthread_create( pthread_t *tid, pthread_attr_t *atrib, void *(*func)(void *), void *args ); func: nome da função que contém o código a ser executado pelo thread int pthread_create( pthread_t *tid, pthread_attr_t *atrib, void *(*func)(void *), void *args ); args: ponteiro para uma região de memória com dados de entrada para a função 9 10 int pthread_create( pthread_t *tid, pthread_attr_t *atrib, void *(*func)(void *), void *args ); int pthread_create( pthread_t *tid, pthread_attr_t *atrib, void *(*func)(void *), void *args ); tid: identificador (único) do novo thread atrib: atributos de execução para o novo thread 11 12

tid2 tid main pthread_create(&tid,... OiMundo,...); pthread_create(&tid2,... OiMundo,...); tempo int main() { pthread_t tid; void *OiMundo(void *in){ char *str = (char *)in; printf("%s\n", str);... return (void*) NULL; char *str = strdup("oi mundo"); pthread_create( &tid, NULL, OiMundo, str );... 13 14 Término: Término: void pthread_exit(void *retval ); ou return (void *)retval; tid2 pthread_create(&tid,... OiMundo,...); pthread_create(&tid2,... OiMundo,...); return dta; Termina a execução do thread que executou a chamada. Joinable ou Detached retval: endereço de uma posição de memória contendo o dado a ser retornado tid main tempo 15 16

Término: pthread_exit A execução do thread é interrompida e o processo de computação abandonado No caso de utilização com programas C++, escopos de funções/métodos não são terminados e há risco de objetos não serem destruídos com invocação ao destrutor. return Abandona a execução do thread corrente fechando o contexto de memória utilizado. Sincronização: int pthread_join( pthread_t tid, void **ret ); Aguarda o término de um thread (se ele ainda não terminou) e recupera o resultado produzido. 17 18 Sincronização: Sincronização: int pthread_join( pthread_t tid, void **ret ); int pthread_join( pthread_t tid, void **ret ); tid: identificador do thread a ter seu término sincronizado ret: endereço de um ponteiro que será atualizado com a posição de memória que contém os dados retornados Cada thread suporta, no máximo, uma operação de join 19 20

Sincronização: Sincronização: int pthread_detach( pthread_t tid ); tid2 pthread_create(&tid,... OiMundo,...); pthread_create(&tid2,... OiMundo,...); return dta; Aguarda término Operação inversa ao join: O thread tid não sofrerá nenhuma sincronização por join tid main pthread_join(tid, &ret); pthread_join(tid2, &ret2); tempo 21 22 Ciclo de vida lista de espera Criar Pronto time-out escalonamento Exec termina OK Bloq sincronização return Zumbi Joinable Fim sincroniza 23 main(){ pthread_t p[5], c[5]; for(i = 0 ; i < 5 ; i++ ) { Exemplo: produtor/consumidor void *prod(void *args) { Buf *buf = malloc; produz item return buf; pthread_create(&(p[i]), NULL, prod, NULL ); pthread_create(&(c[i]), NULL, cons, &(p[i])); for(i = 0 ; i < 5 ; i++ ) pthread_join(c[i], NULL); void *cons(void *args) { Buf *buf; pthread_t p; p = (pthread_t)* args; pthread_join( p, &buf ); consome item return NULL; 24

void *prod(void *args) { Buf *buf = malloc; return NULL; main(){ correta pthread_t comunicação p[5], c[5]; entre as tarefas executadas for(i = 0 ; (controle i < 5 ; i++ da ) comunicação). { pthread_create(&(p[i]), NULL, prod, NULL ); pthread_create(&(c[i]), NULL, cons, &(p[i])); Exemplo: produtor/consumidor produz item return buf; A sincronização por join garante a for(i = 0 ; i < 5 ; i++ ) pthread_join(c[i], NULL); void *cons(void *args) { Buf *buf; pthread_t p; p = (pthread_t)* args; pthread_join( p, &buf ); consome item P 0 P 1 P 2 P 3 P 4 C 0 C 1 C 2 C 3 C 4 25 Descritor de threads Identificador do thread (Thread ID) Registradores Contador de Programa (PC) Ponteiro de Pilha (SP) Registradores Gerais Pilha de execução local Dados locais aos escopos Endereços de retorno para chamadas de subrotinas Endereço de retorno após completar a chamada Endereço dos outros threads Ponteiro do PCB do processo Informações de escalonamento Prioridade Estado Tipo de escalonamento... 26 Atributos de threads Alguns atributos podem ser definidos para execução Tamanho da pilha Política de escalonamento Pode Prioridade Escopo de execução pthread_attr_t não ser garantido Depende da implementação int pthread_attr_init( pthread_attr_t* atrib ); int pthread_attr_setxxxx( pthread_attr_t* atrib, int valor ); Atributos de threads Alguns atributos podem ser definidos para execução Escopo de execução Local ao processo: PTHREAD_SCOPE_PROCESS O thread deverá ser escalonado no escopo do processo Sistema: PTHREAD_SCOPE_SYSTEM É definida uma unidade de escalonamento próprio ao thread int pthread_attr_setscope( &atrib, XXXX ); 27 28

Atributos de threads Alguns atributos podem ser definidos para execução Estratégia de escalonamento SCHED_FF SCHED_RR SCHED_OTHER (default) No GNU-Linux: SCHED_FF e SCHED_FF apenas como super-usuário. Atributos de threads Alguns atributos podem ser definidos para execução Modo de execução Autônoma: PTHREAD_CREATE_DETACHED O thread não sofrerá operação de sincronização por join Sincronizável: PTHREAD_CREATE_JOINABLE (default) Algum thread deverá efetuar join sobre o thread int pthread_attr_setschedpolicy( &atrib, XXXX ); int pthread_attr_setdetachstate( &atrib, XXXX ); 29 30 Atributos de threads Manipulação da pilha do thread Identificação de um tamanho alternativo para a pilha int pthread_attr_setstacksize( pthread_attr_t* atrib, size_t tam ); Identificação de uma área de memória alternativa (com tamanho mínimo de PTHREAD_STACK_MIN) int pthread_attr_setstackaddr( pthread_attr_t* atrib, void* end ); Atenção: o padrão não define se end corresponde ao endereço baixo ou alto do memória Dados O controle do acesso aos dados é de responsabilidade do programador. 31 32

Os acessos à memória se dão através de operações de leitura e escrita convencionais: Escrita: DadoCompartilhado = valor; Leitura: variável = DadoCompartilhado; As instruções que acessam os dados compartilhados são considerados Seções Críticas int x = 313; // thread A a = x; a = a + 1; x = a; // thread B b = x; b = b - 1; x = b; A a = x A a = a + 1 B b = x A x = a B b = b - 1 B x = b 313 313 313 314 314 312 33 34 Exclusão mútua MUTEX Garantia de que apenas um thread poderá executar instruções que manipulam um dado na memória compartilhada em um determinado instante de tempo Mecanismo oferecido por POSIX, a utilização, no entanto, é de responsabilidade do programador 35 Tipo de dado: pthread_mutex_t Primitivas: MUTEX int pthread_mutex_lock(pthread_mutex_t *m); int pthread_mutex_unlock(pthread_mutex_t *m); int pthread_mutex_init(pthread_mutex_t *m, pthread_mutexattrib_t *atrib); Uso: init, para inicializar o mutex (NULL == aberto), lock para adquirir o passe e unlock para liberar. 36

int x = 313; pthread_mutex_t m; pthread_mutex_init(&m,null); // executado no main // thread A // thread B pthread_mutex_lock(&m); pthread_mutex_lock(&m); a = x; b = x; a = a + 1; b = b - 1; x = a; x = b; pthread_mutex_unlock(&m); pthread_mutex_unlock(&m); Variável de Condição Permite o acesso a uma seção crítica quando uma determinada condição for satisfeita Leva em conta o estado da memória no momento da sincronização Uso típico no compartilhamento de um buffer por produtores e consumidores. 37 38 Variável de Condição Tipo de dado: pthread_cond_t Primitivas: int pthread_cond_wait(pthread_cond_t *c, pthread_mutex_t *m); int pthread_cond_signal(pthread_cond_t *c); int pthread_cond_broadcast(pthread_cond_t *c); int pthread_cond_init(pthread_cond_t *c, pthread_condattrib_t *atrib); 39 Uso Variável de Condição init : Inicializa a variável de condição (NULL == satisfeita) wait : Bloqueia o thread, aguardando a condição signal : Sinaliza um dos threads que estão aguardando que a condição seja satisfeita (acorda um thread) broadcast : Sinaliza todas as threads que estão aguardando que a condição foi satisfeita (acorda todos threads) Uma variável de condição não garante acesso em exclusão mútua, apenas informa se uma condição foi ou não satisfeita. Portanto, variáveis de condição devem ser utilizadas em conjunto a um mutex. 40

Uso Variável de Condição pthread_mutex_t m; pthread_cond_t c; pthread_mutex_lock( &m ); while( teste ) pthread_cond_wait( &c, &m ); seção crítica pthread_mutex_unlock( &m ); 41 Uso for(;;) { // Produtor it =...; pthread_mutex_lock(&m); WrBuffer(it); nb_itens++; pthread_cond_signal(&c); pthread_mutex_unlock(&m); Variável de Condição for(;;) { // Consumidor pthread_mutex_lock(&m); while( nb_itens <= 0 ) pthread_cond_wait(&m,&c); it = InBuffer(); nb_itens--; pthread_mutex_unlock(&m); 42 Inicialização dinâmica int pthread_once(pthread_once_t *once_control, void (*init_routine)(void) ); Garante uma única execução de uma função em um processo #include <pthread.h> static pthread_once_t fooinicial = PTHREAD_ONCE_INIT; extern int foofuncao(); int random_function() { pthread_once( &fooinicial, foofuncao ); Sumário Introdução Arquiteturas multi-core Programação multithread POSIX Threads pthreads OpenMP.NET Framework Prática de programação Considerações finais 43 44

Ferramentas para Programação em Processadores Multi-Core Prof. Dr. Departamento de Informática Universidade Federal de Pelotas http://gersonc.anahy.org Programa de Verão 2008 Petrópolis, 14 a 17 de janeiro de 2008. 45