Please enable JavaScript.
Coggle requires JavaScript to display documents.
Threads - Coggle Diagram
Threads
Programação Multicore
Tendência das CPUs modernas
Múltiplos Cores (núcleos)
Programação multithread
fornece um mecanismo para uso
eficiente de CPUs de múltiplos núcleos
Permite paralelismo real
Paralelismo x Concorrência
Paralelismo
Um sistema é paralelo quando pode executar
mais de uma tarefa simultaneamente
Concorrência
Um sistema concorrente dá suporte a mais de
uma tarefa
ilusão de que “tudo está rodando ao mesmo tempo”
É possível haver concorrência sem paralelismo
É também possível haver paralelismo e concorrência ao mesmo tempo
Desafios da programação multicore
Identificação de tarefas e divisão das atividades
O ideal é que as tarefas sejam independentes umas das outras
possam ser executadas em paralelo em núcleos individuais
Equilíbrio
É preciso dosar as atividades para que apresentem esforço computacional parecido
Divisão de dados
Dados acessados e manipulados devem ser divididos para a execução em núcleos separados
Dependência de dados
Dados devem ser examinados para que sejam determinadas dependências entre duas ou mais tarefas
é preciso haver uma sincronização das
tarefas
Teste e depuração (debug)
Execução de programas paralelos = Diferentes caminhos de execução
Isso torna o teste e
depuração mais difíceis
Tipos de Paralelismo
Paralelismo de Dados (Data Parallelism)
Distribui subconjuntos de um mesmo dado para múltiplos núcleos e executa a mesma operação em cada um deles
Ambos os modelos acabam sendo usados.
Paralelismo de Tarefas (Task Parallelism)
Distribuem-se tarefas a múltiplos núcleos
Essas tarefas são diferentes e podem operar sobre um mesmo conjunto de dados ou não
Visão Geral
Thread = Unidade básica de utilização de CPU
Individual
Compartilhado
Processo tradicional (ou pesado)
uma única thread
Threads = “Miniprocessos”
Motivação
Aplicações modernas = Processo separado + várias threads de controle
Navegador web
Processador de texto
Benefícios
Responsividade
Pode permitir que um programa continue funcionando mesmo que parte dele esteja bloqueado
Compartilhamento de recursos
Threads compartilham memória e recursos do
processo pai
Economia
Evita a dispendiosa alocação de memória e
recursos exigida pelos processos
Utilização de arquiteturas multiprocessadas
Uso de múltiplas CPUs ao mesmo tempo
(paralelamente)
Processos de uma única thread não se beneficiam de MP
Bibliotecas de Threads
Fornecem ao programador uma API para a
criação e o gerenciamento de threads
Formas de implementação
Biblioteca operando inteiramente no espaço de usuário
Biblioteca operando em nível de kernel
Criação de Threads
Assíncrona
pai cria uma thread-filho
o pai retoma sua execução para que ele e seu filho sejam executados concorrentemente
Síncrona
o thread-pai cria um ou mais filhos
deve esperar que todos os seus filhos terminem para ele voltar a ser executado
Três principais bibliotecas de threads
POSIX Pthreads
Windows Threads (Windows API)
Java Threads
Questões Relacionadas com a Criação de
Threads
Banco de Threads (Pool de Threads)
Criam uma série de threads em um pool onde esperam trabalho
Servidor recebe uma requisição e acorda uma thread do banco
Ao terminar, ela retorna ao banco
Vantagens
é ligeiramente mais rápido
Limita (controla) o número de threads existentes
Cancelamento de Threads
Cancelamento assíncrono
termina o thread de destino
imediatamente
Problemático
Cancelamento adiado
permite que o thread de destino
verifique periodicamente se ele deve ser cancelado
Manipulação de Sinais
Sinais são usados em sistemas UNIX para notificar um processo de que ocorreu um evento em particular
Um manipulador de sinal é usado para processar sinais
Ativações do escalonador
Os modelos M:N e de dois níveis exigem comunicação para manter o número apropriado de threads de kernel alocados à aplicação
é implementado usando uma estrutura
de dados intermediária
conhecida como
Processo Leve (LWP)
Modelos de Geração de Multithreads
Threads do usuário
Gerenciamento de thread feito
pela biblioteca de threads em nível de usuário
Threads do kernel
Threads admitidos diretamente pelo kernel.
Quase todos os SO modernos admitem
esse tipo de thread
Modelos de relacionamentos entre threads de usuário e kernel
Muitos para Um (N:1)
Muitos threads em nível de usuário mapeados para único thread do kernel.
Modelo eficiente
porém o processo inteiro será bloqueado se uma thread fizer uma chamada de sistema bloqueante
Imprópria para sistemas
multiprocessadores
pois somente uma thread pode
acessar o kernel por vez
Um para Um (1:1)
Cada thread em nível de usuário é mapeado para thread do kernel.
Maior concorrência e uso de MP
Única desvantagem
é custoso criar muitas threads de
kernel
podendo prejudicar o desempenho da aplicação
Usado pelo Linux e Windows
Muitos para Muitos (M:N)
Permite que muitos threads em nível de usuário sejam
mapeados para muitos threads do kernel
Permite que o sistema operacional crie um número suficiente de threads do kernel