Aula06 - Threadsezequielzorzal.com › aulas › SO › Aula06.pdfAula06 - Threads.ppt Author...
Transcript of Aula06 - Threadsezequielzorzal.com › aulas › SO › Aula06.pdfAula06 - Threads.ppt Author...
Objetivos
• Introduzir o conceito de thread • Discutir as APIs das bibliotecas de threads Pthreads,
Win32 e Java • Examinar questões relacionadas à programação
multithreaded
Processos de Único e Múltiplos Threads • Thread: uma unidade básica de utilização da CPU
(fluxo de controle dentro do processo) – Composta por uma ID – Um contador de programa – Um conjunto de registradores – Uma pilha
• Compartilha recursos com outros threads do mesmo processo
Benefícios • Capacidade de resposta
– Pode permitir que um programa continue a ser executado mesmo se parte dele estiver bloqueada
• Compartilhamento de recursos – Por padrão, as threads compartilham a memória e os recursos do processo ao qual
pertencem
• Economia – A alocação de memória e recursos para a criação de processos é dispendiosa. Os
threads compartilham os recursos do processo ao qual pertencem, é mais econômico criar threads e alternar seus contextos
• Utilização de arquiteturas de muitos processadores (escalabilidade)
– Os threads podem ser executados em paralelo em diferentes processadores
Programação multicore
• Alguns desafios para a programação multicore – Divisão de atividades
• Envolve a análise das aplicações em busca de áreas que possam ser divididas em tarefas separadas e concorrentes (executadas em paralelo)
– Equilíbrio • Assegurar queas tarefas executem esforço do mesmo valor
– Divisão de dados • Os dados acessados pelas aplicações devem ser divididos para execução
em núcleos separados – Dependência de dados
• Os dados devem ser examinados para que sejam determinadas dependencias entre duas ou mais tarefas
– Teste e depuração • Dificuldade, em programas que estão sendo executados em paralelo em
vários núcleos
Arquitetura de servidor com vários threads
Execução concorrente em um sistema com um único núcleo
Execução paralela em um sistema multicore
Threads do Usuário x Threads do Kernel • 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. – Sistemas Operacionais
• Windows XP/2000 • Solaris • Linux • Tru64 UNIX • Mac OS X
Mapeamento entre threads do usuário e threads do kernel • Muitos-para-um • Um-para-um • Muitos-para-muitos
Muitos para Um • Muitos threads em nível de usuário mapeados para
único thread do kernel • Exemplos:
– Solaris Green Threads – GNU Portable Threads
Um para Um
• Cada thread em nível de usuário é mapeado para um thread do kernel – Exemplos
• Windows NT/XP/2000 • Linux • Solaris 9 em diante
Muitos para Muitos
• 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 – Solaris antes da versão 9 – Windows NT/2000 com o pacote ThreadFiber
Modelo de dois níveis
• Semelhante a M:M, exceto por permitir que um thread do usuário seja ligado a um thread do kernel
• Exemplos – IRIX – HP-UX – Tru64 UNIX – Solaris 8 e mais antigos
Bibliotecas de Threads • Fornece ao programador uma API para a criação e
gerenciamento de threads • Duas abordagem de implementar uma biblioteca de thread
– Biblioteca no espaço do usuário sem suporte ao kernel • Chamar uma função da biblioteca >> chamada de função local no espaço
do usuário e não em uma chamada de sistema – Biblioteca no nível do kernel com suporte direto ao sistema operacional
• Bibliotecas mais usadas: – POSIX Pthreads (pode ser fornecida como nível usuário ou kernel) – Win32 threads (nível de kernel) – Java threads (Geralmente é implementada com o uso de uma biblioteca de
threads disponível no sistema hospedeiro)
Pthreads • Uma API padrão POSIX (IEEE 1003.1c) para criação e
sincronismo de thread • A API especifica o comportamento da biblioteca de
threads, a implementação fica para o desenvolvimento da biblioteca
• Comum em sistemas operacionais UNIX (Solaris, Linux, Mac OS X)
Exemplo: Pthreads
Exemplo: Threads Win32
Threads Java • Threads Java são gerenciados pela JVM • Threads Java podem ser criados de duas formas:
– Extendendo a classe Thread – Implementando a interface Runnable
Questões sobre a criação de Threads • Semântica das chamadas do sistema fork() e exec() • Cancelamento de thread • Tratamento de sinal • Pools de thread • Dados específicos de thread • Ativações do escalonador
Semântica de fork() e exec()
• fork() duplica apenas o thread que chama ou todos os threads? – Alguns sistemas UNIX optam por ter duas versões
• Uma duplica todos os threads • Outra duplica o thread que a invocou
• exec() – Se um thread a invocar, o programa especificado como
parâmetro para exec() substituirá o processo inteiro (inclusive todos os threads)
Cancelamento de Thread • Terminando um thread antes que ele tenha terminado • Duas técnicas gerais:
– Cancelamento assíncrono: termina o thread de destino imediatamente
– Cancelamento adiado: permite que o thread de destino verifique periodicamente se ele deve ser cancelado
Tratamento de Sinal • Sinais são usados em sistemas UNIX para notificar um processo de que
ocorreu um evento em particular (síncrono, assíncrono) • Sinais síncronos são distribuídos para o mesmo processo que executou a
operação que o causou • Assíncrono: o sinal é gerado por um evento externo a um processo em
execução • Um manipulador de sinal é usado para processar sinais
– Sinal é gerado por evento em particular – Sinal é entregue a um processo – Sinal é tratado
• Opções: – Entregar o sinal ao thread ao qual o sinal se aplica – Entregar o sinal a cada thread no processo – Entregar o sinal a certos threads no processo – Atribuir uma área específica para receber todos os sinais para o processo
Pool de Threads
• Exemplo: Servidor Web (solicitações) • Criam uma série de threads em um pool onde
esperam trabalho • Vantagens:
– Em geral, ligeiramente mais rápido para atender ma solicitação com um thread existente do que criar um novo thread
– Permite que uma série de threads nas aplicações seja vinculada ao tamanho do pool
Dados Específicos do Thread • Permite que cada thread tenha sua própria cópia dos
dados • Útil quando você não tem controle sobre o processo
de criação de threads (ou seja, ao usar um pool de threads)
Ativações do Escalonador • Os modelos M:M e de dois níveis exigem comunicação para
manter o número apropriado de threads de kernel alocados à aplicação
• Ativações do escalonador – Oferece upcalls – um mecanismo de comunicação do kernel para a
biblioteca de threads – Essa comunicação permite que uma aplicação mantenha o número correto
de threads do kernel
Exemplo: Threads no Linux • Linux se refere a eles como tarefas ao invés de threads • A criação de thread é feita por meio da chamada do sistema
clone() • clone() permite que uma tarefa filha compartilhe o espaço de
endereços da tarefa pai (processo)
Exemplo: Threads no Windows XP
• Implementa o mapeamento um-para-um • Cada thread contém
– Uma id de thread – Conjunto de registradores – Pilhas de usuário e kernel separadas – Área privativa de armazenamento de
dados • O conjunto de registradores, pilhas e
área de armazenamento privativa são conhecidos como o contexto dos threads