Programação Concorrente Conceitos Multiprogramação Threads Prof. Gibson Pasquini Nascimento gibson.pasquini@gmail.com
O que é Concorrência? Uma unidade concorrente é um componente de um programa que não exige a execução seqüencial Concorrência relaciona-se com fluxo de controle Um programa possui mais de um fluxo de controle ativo ANHANGUERA EDUCACIONAL S.A. www.unianhanguera.edu.br
Fluxo: Seqüencial X Concorrente Tarefa 1 Tarefa 2 Tarefa 1 Tarefa 2 Tarefa 3 Tarefa 3 Os fluxos possuem pilhas individuais de execução
O queé Multiprogramação? Multiprogramaçãoé uma forma de simultaneidade de processamento utilizando um único processador [TANENBAUM] Conhecido como multiprocessamento Técnica utilizada para melhor aproveitamento dos recursos de um sistema operacional
Threads
Histórico Primeiros SOshabilitavam execução de programas concorrente, porém as linguagens não especificavam concorrência Ada (década de 1970 1980) Departamento de Defesa dos EUA (DoD) Empresas especializadas em defesa, que fabricavam sistemas militares (empresas contratadas pelo DoD) Não adotada por universidades e empresas privadas
Linguagens atuais Disponibilizam primitivas de concorrência para o programador São definidos Threads de execução, sendo que cada uma trata de uma parte do programa Com essa definição, estamos estabelecendo que pode haver concorrência Exemplos: Java, C#, Visual C++.NET, Visual Basic.NET, Pythom
Linguagens atuais C e C++ Não são multithreaded versões padronizadas ANSI/ISO Há bibliotecas que habilitam o suporte a multithreading #include <pthread.h> #include <semaphore.h>
O que são threads? Fluxo único de instruções ou fluxo de controle Também chamado de Processo Leve (Lightweight Process) Fazem parte e compartilham atributos de um processo tradicional (Heavyweight Process) Podem executar concorrentemente para atingir uma meta comum São escalonadas no processador com seu conjunto de instruções independentes Gerenciados pelo SO ou pela aplicação usuária
Threads e Processos Processo pesado Informações globais para todos os threads de um processo Espaço de endereçamento Outros dados globais do processo Registradores Registradores Registradores Informações locais para cada threads Pilha Máscara... Pilha Máscara... Pilha Máscara... Threads
Modelosde threads Threads de usuário São criadas por bibliotecas em tempo de execução e não executam acesso direto ao núcleo Threads de núcleo Realiza as operações que as threads de usuário não tem privilégio Mapeamentoum-para-um 1Thread de núcleoparacadathread de usuário
Por que criar threads? Projeto de Software Criação de segmentos de códigos que podem executar independentemente da aplicação Desempenho Compartilhamento de processador para execução de várias tarefas em paralelo Execução concorrente paralela reduz o tempo para conclusão de tarefas Cooperação Comunicação entre Threads de um processo é muito mais ágil (espaço de endereçamento compartilhado) que a comunicação intraprocessos
Ciclo de vida de threads nascido iniciar pronto preempção despacho notificar ou acordar esperar por evento dormir em execução concluir requisição de E/S conclusão de E/S em espera adormecido morto bloqueado intervalo de sono expira
Considerações sobre implementação de threads Entregade sinalde thread Umadas principaisformasde comunicaçãoentre processos Sinais síncronos: resultado de uma instrução executada pelo processo ou thread Aviso de execução de operação ilegal de memória Sinais assíncronos: resultado de evento não relacionado com a transação corrente Notificação de conclusão de E/S Suspensão, continuação, término de um processo
Considerações sobre implementação de threads (cont.) Entregade sinalde thread (cont.) Processoscom um únicothreadentregam os sinais diretamente Sinais síncronos: entrega do sinal ao thread corrente Sinais assíncronos: entrega direta se o processo estiver emexecuçãoouenviode sinalparaumafilade sinais pendentes
Considerações sobre implementação de threads (cont.) Entregade sinalde thread (cont.) Processosmultithread Sinais síncronos: entrega do sinal ao thread corrente Sinaisassíncronos: mecanismode identificaçãodo thread receptor Thread ID Problema com threads de usuário POSIX define o mascaramentoa criaçãodo ID de processoe o mascaramento de sinais
Considerações sobre implementação de threads (cont.) Término de threads Threads finalizame podemser removidasdo sistema por alguns motivos Normalmente: término de uma execução Prematuramente: exceção ou sinal de cancelamento Necessidade de criar mecanismos para remoção de threads Evitar gravação errada nos dados compartilhados (principal meio de troca de informações de threads)
POSIX e Pthreads Threads POSIX oupthreadssãoas threads que implementam os padrões POSIX POSIX Portable Operating Systems Interface for Computing Environments define: Conjunto de padrões para interfaces de sistemas operacionais(publicado no IEEE) baseado no UNIX Interface-padrãoentre threads e as bibliotecasde suportea threads nãose preocupacom detalhes de implementação
POSIX e Pthreads(cont.) A definição POSIX: Registradoresdo processador, pilhae máscarade sinais devem ser únicos para cada thread Outros recursos devem ser acessíveis globalmente Define regras para sinais Sinais de Exceções devem ser entregues diretamente Sinaispara matar umthread sãoentreguesa threads que não mascarem tal sinal
Threads em Java Em Java, thread significa duas coisas: Uma instância da classe java.lang.thread Um objeto com variáveis e operações Uma thread de execução Um processo individual Processo Leve (Lightweight Process)
Principais métodos start(): inicia a execução da thread (chama o método run) suspend(): suspende a execução da thread que está executando sleep(): faz a thread que está executando dormir por um tempo determinado yield(): faz a thread que está executando dormir por um tempo indeterminado resume(): resume a execução de uma thread suspensa
Principais métodos (cont.) stop():t erminaa execução de uma thread; a thread não pode ser mais executada. join():método que espera o término da THREAD para qual foi enviada a mensagem para ser liberada. interrupt():método que interrompe a execução de uma THREAD. interrupted():método que testa se uma THREAD está ou não interrompida.
Definindoumathread Herança java.lang.thread Maneira mais simples 1) Extender classe Thread. public class MyThreadextends Thread { public void run() { System.out.println( Herança"); } } 2) Sobrescrevero método run()
Definindoumathread (cont.) Limitações de utilizar herança É uma escolha considerada pobre quando falamos de design Java não suporte herança multipla
Definindoumathread (cont.) Interface java.lang.runnable 1) Implementar interface Runnable. public class MyThreadimplementsRunnable{ public void run() { System.out.println( Interface"); } } 2) Implementaro método run()
Criandoum thread Quando utilizamos herança MyThreadt = newmythread( ) Quando utilizamos interface Primeiro criamos um objeto da nossa classe: MyRunnabler = newmyrunnable(); Depois criamos um Thread (ele irá executar nosso trabalho) Thread t = newthread(r); Neste ponto precisamos passar nosso objeto para ser executado pela Thread criada
Executandoum thread Basta invocarmos o método start() t.start(); O que acontece internamente? public class Thread..... start() { }.. public class MyThread { public void run() { System.out.println( Interface"); }
Sugestão de leitura Linguagem Ada http://groups.engin.umd.umich.edu/cis/course.des/cis400/ada/ada.html Multithreading em C http://softpixel.com/~cwright/programming/threads/threads.c.php Threads SCJP Sun Certified Java Programmer for Java 5 Study Guide bykathy Sierraand Bert Bates
Obrigado!!!