Programação concorrente usando threads POSIX e Java
|
|
|
- Vera Borja Alencar
- 9 Há anos
- Visualizações:
Transcrição
1 Programação concorrente usando threads POSIX e Java MAC 431 / MAC 5742 Introdução à Computação Paralela e Distribuída Daniel Cordeiro DCC - IME - USP 13 de agosto de 2012
2 Introdução Por que escrever programas concorrentes? Desempenho para explorar arquiteturas paralelas com memória compartilhada (SMP, hyperthreaded, multi-core, NUMA, etc.) Modelagem para descrever o paralelismo natural de algumas aplicações (tarefas independentes, sobreposição de operações de E/S, etc.) Daniel Cordeiro 13 de agosto de / 28
3 Processos vs. threads Processos Cada processo tem seu próprio espaço de endereçamento: segmento de texto: contém o código executável segmento de dados: contém as variáveis globais pilha: contém dados temporários (variáveis locais, endereços de retorno, etc.) O contador de programa e os registradores da CPU fazem parte do contexto do programa O contexto do programa é o conjunto mínimo de dados usados por um processo e deve ser gravado quando um processo é interrompido e relido quando um processo é retomado Daniel Cordeiro 13 de agosto de / 28
4 Processos vs. threads Threads Permitem múltiplas atividades independentes dentro de um único processo Threads de um mesmo processo compartilham: Todo o espaço de endereçamento, exceto a pilha, os registradores e o contador de programa Arquivos abertos Outros recursos Também são chamados de processos leves, pois a criação das threads e a troca de contexto são mais rápidas Permitem um alto grau de cooperação entre as atividades! Daniel Cordeiro 13 de agosto de / 28
5 Processos vs. threads Veremos duas formas de programação POSIX threads (pthreads) Threads em Java Daniel Cordeiro 13 de agosto de / 28
6 POSIX threads Padrão IEEE POSIX Norma internacional IEEE POSIX C Apenas a API é normalizada, não a ABI é fácil trocar a biblioteca que implementa a norma em tempo de compilação, mas não em tempo de execução Threads POSIX podem implementar threads em nível de usuário, em nível de kernel ou misto 1 Portable Operating System Interface Daniel Cordeiro 13 de agosto de / 28
7 POSIX threads Bibliotecas LinuxThread (1996): em nível de kernel; padrão do Linux por muitos anos; não é totalmente compatível com o padrão POSIX GNU Pth (1999): em nível de usuário; portável; POSIX NGPT (2002): misto; baseado no GNU Pth; POSIX; não é mais desenvolvido NPTL (2002): em nível de kernel; POSIX; é atualmente a biblioteca padrão do Linux PM2/Marcel (2011): misto; compatível com POSIX; possui várias extensões interessantes para computação de alto desempenho (por exemplo, controle do escalonamento das threads) Daniel Cordeiro 13 de agosto de / 28
8 POSIX threads Primeiros passos $ gcc -v Usando especificações internas. Alvo: x86_64-linux-gnu Configurado com: (...) Modelo de thread: posix versão do gcc (Ubuntu/Linaro ubuntu5) Um programa em C deve conter #include <pthread.h> E para compilar é necessário incluir a opção -pthread $ gcc -pthread programa.c Daniel Cordeiro 13 de agosto de / 28
9 POSIX threads Exemplo código-fonte #include <pthread.h> #include <stdlib.h> #define NUM_THREADS 5 void PrintHello(void threadid) { long tid = (long)threadid; printf("olá! Sou a thread #%ld!\n", tid); pthread_exit(null); int main (int argc, char argv[]) { pthread_t threads[num_threads]; int rc; long t; for(t=0; t<num_threads; t++){ printf("main: criando thread %ld\n", t); rc = pthread_create(&threads[t], NULL, PrintHello, (void )t); if (rc){ printf("erro; pthread_create() devolveu o erro %d\n", rc); exit( 1); for(t=0; t<num_threads; t++){ pthread_join(threads[t], NULL); Daniel Cordeiro 13 de agosto de / 28
10 POSIX threads Exemplo possível saída $./exemplo1 main: criando thread 0 main: criando thread 1 main: criando thread 2 Olá! Sou a thread #0! main: criando thread 3 Olá! Sou a thread #2! main: criando thread 4 Olá! Sou a thread #3! Olá! Sou a thread #1! Olá! Sou a thread #4! Daniel Cordeiro 13 de agosto de / 28
11 POSIX threads Considere o exemplo #include <pthread.h> #include <stdlib.h> #define NUM_THREADS 5 int saldo = 1000; void AtualizaSaldo(void threadid) { int meu_saldo = saldo; int novo_saldo = meu_saldo + (int)threadid 100; printf("novo saldo = %d\n", novo_saldo); saldo = novo_saldo; int main (int argc, char argv[]) { pthread_t threads[num_threads]; int rc; long t; for(t=0; t<num_threads; t++){ rc = pthread_create(&threads[t], NULL, AtualizaSaldo, (void )t); if (rc) exit( 1); for(t=0; t<num_threads; t++){ pthread_join(threads[t], NULL); printf("saldo final = %d\n", saldo); Daniel Cordeiro 13 de agosto de / 28
12 POSIX threads Ordem de execução A ordem de execução não é garantida! Thread 1 Thread 2 Saldo Lê saldo: R$ R$ Lê saldo: R$ R$ Deposita R$ 300 R$ Deposita R$ 200 R$ Atualiza saldo R$ R$ 200 R$ Atualiza saldo R$ R$ 300 R$ Daniel Cordeiro 13 de agosto de / 28
13 POSIX threads Solução: uso de sincronização (mutex) #include <pthread.h> #include <stdlib.h> #define NUM_THREADS 5 pthread_mutex_t meu_mutex = PTHREAD_MUTEX_INITIALIZER; int saldo = 1000; void AtualizaSaldo(void threadid) { pthread_mutex_lock(&meu_mutex); saldo = saldo + (int)threadid 100; printf("novo saldo = %d\n", saldo); pthread_mutex_unlock(&meu_mutex); int main (int argc, char argv[]) { pthread_t threads[num_threads]; long t; for(t=0; t<num_threads; t++) pthread_create(&threads[t], NULL, AtualizaSaldo, (void )t); for(t=0; t<num_threads; t++) pthread_join(threads[t], NULL); printf("saldo final = %d\n", saldo); Daniel Cordeiro 13 de agosto de / 28
14 POSIX threads API básica de POSIX threads Criação / destruição int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine)(void*), void *arg) void pthread_exit(void *value_ptr) int pthread_join(pthread_t thread, void **value_ptr) Sincronização (semáforos) int sem_init(sem_t *sem, int pshared, unsigned int value) int sem_wait(sem_t *sem) int sem_post(sem_t *sem) int sem_destroy(sem_t *sem) Daniel Cordeiro 13 de agosto de / 28
15 POSIX threads API básica de POSIX threads Sincronização (mutex) int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *attr) int pthread_mutex_lock(pthread_mutex_t *mutex) int pthread_mutex_unlock(pthread_mutex_t *mutex) int pthread_mutex_destroy(pthread_mutex_t *mutex) Sincronização (conditions) int pthread_cond_init(pthread_cond_t *cond, const pthread_condattr_t *attr) int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex) int pthread_cond_signal(pthread_cond_t *cond) Daniel Cordeiro 13 de agosto de / 28
16 Java threads Todo programa em Java executa várias threads Java foi a primeira linguagem de programação a incorporar threads desde a concepção da linguagem Se você já programou em Java, então já escreveu um programa multithreaded: A máquina virtual mantém várias threads: thread main, threads do coletor de lixo, threads de finalização de objetos, etc. Daniel Cordeiro 13 de agosto de / 28
17 Java threads Objetos do tipo Thread Cada thread é associada a uma instância da classe Thread. Há duas estratégias básicas para usar esses objetos para criar aplicações concorrentes: controlar e gerenciar manualmente instâncias de Thread abstrair o gerenciamento de threads do resto da aplicação utilizando um executor Daniel Cordeiro 13 de agosto de / 28
18 Java threads Definindo e criando threads Uma aplicação que cria uma instância de Thread pode definir o código a ser executado concorrentemente de duas formas: usando herança, criamos uma nova classe que estende Thread escrevendo uma classe que implementa a interface Runnable Daniel Cordeiro 13 de agosto de / 28
19 Java threads Usando herança Uma classe que estende Thread deve sobrescrever o método public void run() class Tarefa1 extends Thread { public void run() { for(int i=0; i<1000; i++) System.out.println("Usando herança"); public static void main(string args[]) { (new Tarefa1()).start(); Daniel Cordeiro 13 de agosto de / 28
20 Java threads Usando a interface Runnable A interface Runnable nos obriga a implementar o método public void run(): class Tarefa2 implements Runnable { public void run() { for(int i=0; i<1000; i++) System.out.println("Usando Runnable"); public static void main(string args[]) { (new Thread(new Tarefa2())).start(); Daniel Cordeiro 13 de agosto de / 28
21 Java threads Sleep, interrupções e joins Thread.sleep() suspende uma thread por um período de tempo determinado. Útil para permitir que outras threads possam utilizar a CPU Thread.interrupt() avisa uma thread que ela deve interromper o que está fazendo (por exemplo, terminar a execução). Uma thread que permite ser interrompida deve verificar periodicamente a flag de interrupção usando o método Thread.interrupted(). O modo mais comum de responder a uma interrupção é lançando uma InterruptedException Thread.join() faz a thread atual esperar que uma outra thread termine sua execução Daniel Cordeiro 13 de agosto de / 28
22 Java threads O modelo de consistência de memória Suponha que duas threads A e B compartilhem um contador. int contador = 0; A incrementa o contador: contador++; Logo em seguida, B imprime o contador: System.out.println(contador); Qual a saída na tela? Se A e B fossem a mesma thread, certamente 1 Mas a saída pode ser 0 ou 1; as mudanças em uma thread podem não ser visíveis para a outra. Sincronização estabelece uma relação de ordem entre as ações! (happens-before relationship) Daniel Cordeiro 13 de agosto de / 28
23 Java threads Sincronização A linguagem Java provê duas formas de sincronização básicas: métodos sincronizados expressões sincronizadas Daniel Cordeiro 13 de agosto de / 28
24 Java threads Sincronização A linguagem Java provê duas formas de sincronização básicas: métodos sincronizados expressões sincronizadas public class ContadorSincronizado { private int contador = 0; public synchronized void incrementa() { contador++; public synchronized int valor() { return contador; Daniel Cordeiro 13 de agosto de / 28
25 Java threads Sincronização A linguagem Java provê duas formas de sincronização básicas: métodos sincronizados expressões sincronizadas public void incrementa() { synchronized(this) { contador++ Daniel Cordeiro 13 de agosto de / 28
26 Java threads Sincronização A linguagem Java provê duas formas de sincronização básicas: métodos sincronizados expressões sincronizadas public void incrementa() { synchronized(this) { contador++ As sincronizações são reentrantes Uma thread não pode pegar o lock de uma outra thread, mas pode usar um mesmo lock já adquirido mais de uma vez. Daniel Cordeiro 13 de agosto de / 28
27 Java threads wait(), notify() e notifyall() Estes métodos da classe Object implementam o conceito de monitores sem utilizar espera ativa. Ao invés disso, notificam as threads indicando se estas devem ser suspensas ou se devem voltar a ficar em execução. O lock do objeto chamado pela thread para realizar as notificações será utilizado. Por isso, antes de chamar um dos três métodos, o lock deve ser obtido utilizando-se o comando synchronized. Daniel Cordeiro 13 de agosto de / 28
28 Java threads wait(), notify() e notifyall() Object.wait() suspende a thread que chamou o método até que outra thread a acorde ou até que o tempo especificado como argumento tenha passado Object.notify() acorda, se existir, alguma thread que esteja esperando um evento neste objeto Object.notifyAll() acorda todas as threads que estejam esperando neste objeto wait() synchronized (obj) { while (<condição não for satisfeita>) obj.wait(timeout);... // Realiza ações que // assumem a condição satisfeita notify() synchronized (obj) { condição = true obj.notify() Daniel Cordeiro 13 de agosto de / 28
29 Referências Referências pthreads Arnaud Legrand e Vincent Danjean. How to Efficiently Program High Performance Architectures? teaching/2011/pc_03_progpar.pdf POSIX Threads Programming Java The Java Tutorials: Concurrency: javase/tutorial/essential/concurrency/ Daniel Cordeiro 13 de agosto de / 28
Threads em Ambiente LINUX. Estudo e testes com a biblioteca pthreads
Universidade Federal do ABC Disciplina: BC 1518 Sistemas Operacionais (SO) Prática: Threads Atividade 3 Threads em Ambiente LINUX Objetivo Estudo e testes com a biblioteca pthreads Threads Como vimos em
Programação Concorrente com Thread Java. Luiz Affonso Guedes Sistemas Distribuidos
Programação Concorrente com Thread Java Luiz Affonso Guedes Sistemas Distribuidos Definições Básicas Threads são sub-procesos no sistema operacional. É menos custoso gerenciar threads do que processos.
Threads. O que é uma Thread? Paralelismo
Threads em Java 1 O que é uma Thread? Paralelismo Threads Multi- threading é o mecanismo de concorrência suportado explicitamente pela linguagem Java. Os mecanismos de gerenciamento e sincronização de
Introdução aos Sistemas Operacionais. Threads
Introdução aos Sistemas Operacionais Threads Eleri Cardozo FEEC/Unicamp O que é uma Thread? Uma thread (linha de controle) é uma unidade de execução e de controle, alocação e compartilhamento de recursos
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.
Pthreads Mario João Junior O que são threads? Uma thread é um fluxo de execução de instruções que pode ser escalonado pelo sistema operacional. O que são threads? No UNIX, uma thread: Existe no interior
Sistemas Operacionais
Sistemas Operacionais Programação Concorrente Sincronização entre processos Edson Moreno edsonmoreno@pucrsbr http://wwwinfpucrsbr/~emoreno Sumário Conceituação Princípios de concorrência Região crítica
PROGRAMAÇÃO ORIENTADA A OBJETOS. Aula 11 - Threads e Concorrência
Aula 11 - Threads e Concorrência Conteúdo Programático desta aula Apresentar os Conceitos de Threads, Concorrência e Sincronização. Verificar a aplicabilidade destes conceitos no mercado, bem como sua
Exclusão Mútua (mutex)
2004-2017 Volnys Bernal 1 Exclusão Mútua (mutex) Volnys Borges Bernal [email protected] Departamento de Sistemas Eletrônicos Escola Politécnica da USP 2004-2017 Volnys Bernal 2 Tópicos Exclusão Mútua (Mutex)
Múltiplas Linhas de Execução Java (Threads)
Múltiplas Linhas de Execução Java (Threads) SCC0604 - Programação Orientada a Objetos Prof. Fernando V. Paulovich http://www.icmc.usp.br/~paulovic [email protected] Instituto de Ciências Matemáticas
OO Engenharia Eletrônica
OO Engenharia Eletrônica - Programação em C/C++ Slides 18: Introdução à Multithreading. Introdução à Multithreading: execução concorrente de tarefas. Exemplos usando a biblioteca pthread que é de acordo
Linguagem de Programação I
Linguagem de Programação I Carlos Eduardo Batista Centro de Informática - UFPB [email protected] Exemplo: Explorar Templates e Exceções Incrementar com o uso de STL 2 Crie uma função verificarpalindromo()
MULTITHREADING. Prof.: Michele Nasu Tomiyama Bucci
MULTITHREADING Prof.: Michele Nasu Tomiyama Bucci Introdução O corpo humano realiza uma grande variedade de operações paralelamente, ou concorrentemente. Os computadores também realiza operações concorrentemente.
Universidade Estadual de Mato Grosso do Sul Bacharelado em Ciência da Computação Sistemas Operacionais Prof. Fabrício Sérgio de Paula
Universidade Estadual de Mato Grosso do Sul Bacharelado em Ciência da Computação Sistemas Operacionais Prof. Fabrício Sérgio de Paula Tópicos Conceitos Modelos multithreads Bibliotecas Opções de criação
Sistemas Distribuídos Aula 3
Sistemas Distribuídos Aula 3 Aula passada Processos IPC Características Ex. sinais, pipes, sockets Aula de hoje Threads Kernel level User level Escalonamento Motivação: Servidor Web Considere Servidor
Programação concorrente em Java
Programação concorrente em Java Paulo Sérgio Almeida Grupo de Sistemas Distribuídos Departamento de Informática Universidade do Minho 2007/2008 c 2000 2007 Paulo Sérgio Almeida Programação concorrente
Programando com Threads em C
Programando com Threads em C AEDS III Bruno Diniz de Paula ([email protected]) e-commerce System Performance Evaluation and Experimental Development Lab O que são Threads? Linhas de execução concorrentes
Gabriel de Oliveira Ramos Roland Teodorowitsch - Orientador
THREADS EM JAVA Gabriel de Oliveira Ramos Roland Teodorowitsch - Orientador Universidade Luterana do Brasil (Ulbra) Curso de Ciência da Computação Campus
Fundamentos de Sistemas Operacionais
Fundamentos de Sistemas Operacionais Aula 6: Monitores, Troca de Mensagens e Deadlock Diego Passos Última Aulas Mecanismos de Exclusão Mútua Operações atômicas. Protocolos de controle de acesso. Spin-locks.
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)
2004-2013 Volnys Bernal 1 2004-2013 Volnys Bernal 2 Tópicos Exclusão Mútua (mutex) Volnys Borges Bernal [email protected] http://www.lsi.usp.br/~volnys Exclusão Mútua () Objetivo, utilidade, requisitos
Sistemas Operacionais I Parte VI Threads
Sistemas Operacionais I Parte VI Threads Roteiro Introdução Benefícios Ciclo de Vida Estados Modelos Multithreading Modelo Muitos para Um Modelo Um para Um Modelo Muitos para Muitos Sistemas com Threads
Paralelismo em Computadores com Tecnologia Multicore
IFRN - Pau dos Ferros Pau dos Ferros/RN, 25 de fevereiro de 2016 O minicurso Descrição: Para se utilizar os vários núcleos de processamento disponíveis nos computadores atuais de forma eficiente, faz necessário
Chapter 4: Threads. Operating System Concepts 8th Edition
Chapter 4: Threads Sobre a apresentação (About the slides) Os slides e figuras dessa apresentação foram criados por Silberschatz, Galvin e Gagne em 2009. Esse apresentação foi modificada por Cristiano
Trabalhando com Processos e Threads em Ambiente LINUX
Objetivo Universidade Federal do ABC Disciplina: BC 1518 Sistemas Operacionais (SO) Prática: Processo/Threads Atividade 3 Trabalhando com Processos e Threads em Ambiente LINUX 1.Trabalhar com comandos
(Aula 17) Threads em Java
(Aula 17) Threads em Java Difícil As Threads thread threads de emjava classificar sãogerenciadaspelajvm. podemser com user criadasdas thread ou kernel Profa. Patrícia A seguintesmaneiras: Fazendo extend
Pthreads API. Criação de Threads: usando Pthreads
Pthreads API The POSIX 1003.1-2001 standard defines an application programming interface (API) for writing multithreaded applications. This interface is known more commonly as pthreads. 6.1 Criação de
Concorrência em Java. Threads em Java
Concorrência em Java Threads em Java Máquina Virtual Java, Processos e Threads Cada instância da JVM corresponde a um processo do sistema operacional hospedeiro. A JVM não possui o conceito de processos
SSC0640 Sistemas Operacionais I
SSC0640 Sistemas Operacionais I 2ª Aula Conceitos Básicos Profa. Sarita Mazzini Bruschi [email protected] Slides adaptados de Marcos José Santana / Regina H. C. Santana / Luciana A. F. Martimiano baseados
Threads: Conceitos e Implementação
Threads: Conceitos e 8 de Abril de 2011 Threads: Conceitos e Licença Threads: Conceitos e, por Renê de Souza Pinto [email protected], é licenciado sob a Atribuição-Uso não-comercial-compartilhamento pela
Só podem ser executados por uma Thread que detenha o lock do objecto
Transferência de controle entre Threads Os métodos wait(), notify() notifyall(), da classe Object, Permitem a transferência de controlo de uma Thread para outra. Só podem ser executados por uma Thread
AULA 06: PROGRAMAÇÃO EM MÁQUINAS PARALELAS
ORGANIZAÇÃO E ARQUITETURA DE COMPUTADORES II AULA 06: PROGRAMAÇÃO EM MÁQUINAS PARALELAS Prof. Max Santana Rolemberg Farias [email protected] Colegiado de Engenharia de Computação PROGRAMAÇÃO PARALELA
Eventos. Rotinas Assíncronas
Eventos Rotinas Assíncronas para Tratamento de acontecimentos assíncronos e excepções Rotinas Assíncronas Certos acontecimentos devem ser tratados pelas aplicações, embora não seja possível prever a sua
Java Threads. Introdução
Java Threads [email protected] 1 Introdução O único mecanismo de concorrência suportado explicitamente pela linguagem Java é multi-threading. threading. Os mecanismos de gerenciamento e sicronização
Processos. Processo (1) Processo (2) Processo (3) Conceitos Básicos
Processos Conceitos Básicos Processo (1) Abstração usada pelo S.O. para designar a execução de um programa. É caracterizado por uma thread de execução, um estado corrente e um conjunto associado de recursos
Processos. Conceitos Básicos
Processos Conceitos Básicos Processo (1) Abstração usada pelo S.O. para designar a execução de um programa. É caracterizado por uma thread de execução, um estado corrente e um conjunto associado de recursos
Prof. Silvana Rossetto 9 de julho de DCC/IM/UFRJ
Computação Concorrente (MAB117) Gabarito Segunda Prova Prof. Silvana Rossetto 9 de julho de 2015 1 DCC/IM/UFRJ Questão 1 (2,5 pts) O código Java abaixo implementa uma solução para o problema do barbeiro
Algoritmos e Programação
Algoritmos e Programação Aula 3 Introdução a Linguagem C Profa. Marina Gomes [email protected] 1 Aula de Hoje - Criar programas simples em C utilizando a estrutura básica; - Declarar variáveis;
AULA Nº 08 SISTEMAS OPERACIONAIS. Threads
AULA Nº 08 SISTEMAS OPERACIONAIS Threads Contextualizando Na aula passada Sincronização de Processos Aula de hoje Threads O Modelo de Processo 1) Utilizado para agrupar recursos 2) Um espaço de endereço
Sistemas Operacionais
Sistemas Operacionais Slides adaptados de Prof. Dr. Marcos José Santana, Prof. Dra. Regina Helena Carlucci Santana e Sarita Mazzini Bruschi baseados no livro Sistemas Operacionais Modernos de A. Tanenbaum
Programação de Sistemas
Programação de Sistemas Pai Natal Programação de Sistemas Pai Natal : 1/16 Problema (1) Considere o Pai Natal ( Santa Claus ) se encontra a dormir na sua loja em Rovaniemi-Lapónia finlandesa, sendo acordado
Palavras Reservadas da Linguagem Java
Palavras Reservadas da Linguagem Java Palavras Reservadas da Linguagem Java: Categorias Tipos de dados primitivos Literais Pseudo-variáveis Desvio e controle de fluxo Pacotes Exceções Modificadores de
1B Conceitos Básicos: Indique Verdade/Falso
INE5645 - Programação Paralela e Distribuída - Prova 1B 24/04/2017 Nome 1B Conceitos Básicos: Indique Verdade/Falso a) (Verdade/Falso) Threads distintas em um processo não são tão independentes quanto
Programação de Alto Desempenho - 2. Prof: Carla Osthoff
Programação de Alto Desempenho - 2 Prof: Carla Osthoff E-mail: [email protected] 3- Modelos de programação paralela Shared Memory/Threads Posix Win32 treads OpenMP Message Passing MPI Data Parallel OpenCL/Cuda
