01.3) Thread
01.3) Thread
Ambientes MonoThreadd:
Um único processo
Suportando múltiplos threads
Cada qual associado a uma parte do código da aplicação
Threads compartilham: Código, Dados e Arquivos
Thread é um pequeno conjunto de instruções projetadas para serem agendadas e
executadas pela CPU de forma independente do processo-pai.
Contador de programa;
Registradores;
Pilha;
Estado.
Threads Compartilham:
Seção de código
Seção de dados
E outros recursos do sistema operacional como arquivos abertos e sinais
Estados novo e executável: Um novo thread inicia seu ciclo de vida no estado novo. Ela
permanece nesse estado até que o programa inicie a thread, o que a coloca no estado
executável.
Estado de espera: um thread executável transita para o estado de espera enquanto aguarda
outra thread realizar uma tarefa. Um thread em espera volta ao estado executável somente
quando outra thread a notifica para continuar a execução.
Estado bloqueado: Um thread executável passa para o estado bloqueado quando tenta
realizar uma tarefa que não pode ser concluída imediatamente e deve esperar
temporariamente até que a tarefa seja concluída.
Estado terminado: Um thread executável entra no estado terminado quando ela conclui com
sucesso suas tarefas ou é de outro modo terminada.
Espera com tempo - Timed waiting: A thread está esperando por um período de tempo
definido. Isso acontece, por exemplo, quando você usa métodos como sleep() ou wait(long
timeout).
OpenMP
O OpenMP é um conjunto de diretivas de compilador assim como uma API para
programas escritos em C, C++ ou FORTRAN que dá suporte à programação paralela em
ambientes de memória compartilhada.
OpenMP identifica regiões paralelas como blocos de código que podem ser executados
em paralelo.
- Diretivas:
Regiões Paralelas: Quando OpenMP encontra a diretiva “#pragma omp parallel” ele
cria um número de threads equivalente ao número de núcleos de processamento do
sistema.
Seções Críticas: #pragma omp critical: especifica a região de código que segue a
diretiva, como uma seção crítica em que somente um thread pode estar ativo de cada
vez. Dessa forma, o OpenMP garante que os threads não gerem condições de corrida.
Seções Paralelas: Uma seção paralela OpenMP é um código OpenMP que permite
blocos separados de código serem executados em paralelo (ex. diversas sub-rotinas
independentes).
Encadeamento de Construtores: OpenMP deve suportar nested parallelism, no caso
de existirem vários níveis de encadeamento, ou seja, uma região paralela pode conter
outras regiões paralelas.
Taskwait: especifica uma espera na conclusão das tarefas filhas da tarefa atual
Untied: Especifica que qualquer thread pode executar a tarefa após uma suspensão,
isso traz flexibilidade na execução das tarefas.
- Cláusulas:
Threads em Java:
Threads no Linux:
Modelo muitos-para-um:
o Mapeia muitos threads de usuário para um único thread de kernel.
o Como somente 1 threads pode acessar o kernel se uma bloquear as outras
ficam incapazes de executar
Modelo um-para-um:
o
o Permite que múltiplos threads sejam executados em paralelo em
multiprocessadores.
o A única desvantagem e que a criação de um thread de usuário requer também
uma criação do thread de kernel com isso pode sobrecarregar o sistema.
Modelo Muitos-para-muitos:
o
o Múltiplos threads de nível de usuário para um número menor ou igual de
threads de kernel.
Extra:
Pthreads: É o padrão posix que define uma API para a criação e sincronização de threads. E
uma especificação para o comportamento dos threads e não uma implementação.
Surge porque existem muitos itens de dados que podem ser operados ao mesmo
tempo.
Usadas em arquitetura SIMD (Vetor, matriz)
Surge por que são criadas tarefas que podem operar de modo independente e
principalmente em paralelo.
Usada em arquitetura MIMD (Multiprocessamento)