1 Threads Prof. Alexandre Monteiro Recife. Contatos n Prof. Guilherme Alexandre Monteiro Reinaldo n Apelido: Alexandre Cordel n E-mail/gtalk: alexandrecordel@gmail.comalexandrecordel@gmail.com.
Post on 22-Apr-2015
112 Views
Preview:
Transcript
1
Threads
Prof. Alexandre Monteiro
Recife
Contatos
Prof. Guilherme Alexandre Monteiro Reinaldo
Apelido: Alexandre Cordel
E-mail/gtalk: alexandrecordel@gmail.com
greinaldo@fbv.edu.br
Site: http://www.alexandrecordel.com.br/fbv
Celular: (81) 9801-1878
Thread
Ambiente Monothread• Em um ambiente monothread um processo só suporta
um programa no seu espaço de endereçamento• Neste ambiente aplicações concorrentes são
implementadas só com o uso de processos independentes ou subprocessos
- Nestes casos a aplicação é dividida em partes que podem trabalhar concorrentemente.
De forma simplificada um thread pode ser definido como uma sub-rotina de um programa que pode ser executada de forma assíncrona. Ou seja, executada paralelamente ao programa chamador.
Ambiente Monothread
A limitação da abordagem monothread é que o uso de processos consomem muitos recursos do sistema
Quando um processo é criado/eliminado deve-se alocar/desalocar recursos do sistema
Além disso, como cada processo tem seu espaço de endereçamento, a comunicação entre processos é mais lenta
• A comunicação pode usar pipes, sinais, trocas de mensagens,...
Na abordagem monothread cada processo tem seu próprio contexto de HW, SW e Espaço de Endereçamento, o que dificulta a comunicação entre processos
Ambiente Multithread
Neste ambiente não existe a idéia de programas associados a processos, mas, sim, a threads
O processo tem pelo menos um thread de execução, mas pode compartilhar o seu espaço de endereçamento com outros threads
Thread
A grande diferença entre ambientes monothread e multithread está no uso do espaço de endereçamento
• Processos independentes ou subprocesso possuem espaços de endereçamento individuais e protegidos
• Multithreads compartilham o espaço de endereçamento dentro de um mesmo processo
- Como os threads compartilham o mesmo espaço de endereçamento, não se exige mecanismos para proteção no acesso a memória
- Isso permite que o compartilhamento de dados entre threads de um mesmo processo seja mais simples e rápido
Ambiente Multithread
Cada thread possui seu próprio contexto de HW, porém divide o mesmo contexto de SW e espaço de endereçamento com os demais threads do processo
Thread
O programador especifica os threads associando-os às sub-rotinas assíncronas
• É assim que se obtém a execução concorrente de subrotinas dentro de um mesmo processo
Por exemplo:• Um programa principal (calculadora) com 4
sub-rotinas assíncronas (+,-,*,/) - Chama-se primeiro o thread do PP, o qual chama os 4
threads- Os 4 threads são executados independentemente do PP- E os 5 threads são executados concorrentemente
Thread
Thread
No ambiente multithread cada processo pode responder a várias solicitações concorrentemente ou simultaneamente (caso haja mais de uma CPU)
A vantagem no uso de threads é a possibilidade de minimizar a alocação de recursos do sistema
Threads compartilham a CPU igualmente a processos
• EX: enquanto um thread espera uma E/S, outro é executado
Thread
Threads passam pelas mesmas mudanças de estado• (a) Pronto -> Execução• (b) Execução -> Bloqueado/Espera• (c) Bloqueado/Espera -> Pronto• (d) Execução -> Pronto
Para permitir a troca de contexto cada thread tem seu próprio contexto de HW• Thread em execução -> registradores ficam na
CPU• Thread parado -> registradores no seu contexto
de HW
Thread
Semelhante a processos, threads são implementados internamente através de uma estrutura de dados
Bloco de Controle de Thread (Thread Control Block - TCB)
• O TCB armazena, além do contexto de HW, dados exclusivos sobre o thread, como prioridade e estado de execução
• PCB X TCB ?
13
Implementação de Threads de Usuário
Um pacote de threads de usuário
14
Implementação de Threads de Núcleo
Um pacote de threads gerenciado pelo núcleo
PCB TCB
Threads de Núcleo
Não é necessário o sistema de tempo de execução (runtime), pois o núcleo possui uma tabela de todas as threads no sistema.
As informações são as mesmas das threads de usuário, porém agora estão no espaço do núcleo, mantidas em uma tabela de threads e outra tabela de processos.
Todas as chamadas implementam chamdas de sistema (System Calls) a um custo considerável maior que as chamadas de (runtime).
Tentam executar todas as threads de um processo para só então chavear o processo.
Custo alto de chamadas de sistema = Reciclagem de threads.
16
Implementações Híbridas
Multiplexação de threads de usuário sobre threads de núcleo
Threads Híbridas
Multiplexar threads de usuários sobre threads de núcleo.
O núcleo sabem apenas sobre as threads de núcleo.
Cada thread de núcleo possui algum conjunto de threads de usuário que aguarda sua vez para usar o processador.
Threads (ou Processo Leve) Thread é uma unidade básica de utilização da CPU, que
consiste em:
1. Apontador de instruções
2. Conjunto de registradores
3. Espaço de pilha Uma Thread compartilha com Threads irmãs:
1. Área de código
2. Área de Dados
3. Recursos do SO (coletivamente conhecidos como tarefas)
Um Processo tradicional é equivalente uma tarefa com uma única Thread.
Interação entre Threads
TCB 1
TCB 2
Múltiplas Threads em uma tarefa
TCBs
Thread Foi introduzido para reduzir o tempo gasto na criação,
eliminação e troca de contexto de processos
Em um ambiente multithead um processo suporta múltiplos threads (um para cada parte do código da aplicação)
• Neste caso não há a necessidade de vários processos para a implementação da concorrência.
• Isto permite compartilhar o espaço de endereçamento e o contexto de SW entre os threads e garantir que cada thread seja executado de forma independente
22
ThreadsO Modelo de Thread (1)
(a) Três processos cada um com um thread
(b) Um processo com três threads
Thread - Benefícios
Numa Thread dotada de múltiplos fluxos de execução, enquanto um fluxo está bloqueado, um outro fluxo na mesma tarefa pode continuar executando
Cooperação de múltiplas threads em uma mesma tarefa aumenta o throughput (quantidade de dados processados em um determinado espaço de tempo) e o desempenho.
Aplicações que requerem o compartilhamento de Buffers (Ex. produtores e consumidores) se beneficiam da utilização de threads.
O mecanismo de thread permite que processos sequenciais sejam executados paralelamente, apesar de poderem fazer chamadas ao sistema que bloqueiam processos
Threads: Motivação Concorrência Problemas:
• Programas que precisam de mais poder computacional
• Dificuldade de implementação de CPUs mais rápidas
Solução:
• Construção de computadores capazes de executar várias tarefas simultaneamente
Problema da Concorrência
Não-determinismo
– x = 1 || x = 2
• Qual o valor de “x” após a sua execução?
Dependência de Velocidade
– [[ f(); x = 1 ]] || [[ g(); x = 2 ]]
– O valor final de x depende de qual das funções, f() e g(), terminar primeiro
Starvation
– Processo de baixa prioridade precisa de um recurso que nunca é fornecido a ele...
Problemas de Concorrência
Deadlock
• Um sistema de bibliotecas só fornece o “nada consta” para alunos matriculados e o sistema de matricula só matricula os alunos perante a apresentação do “nada consta”
– Definição: dois processos bloqueiam a sua execução pois um precisa de um recurso bloqueado pelo outro processo.
Conceitos: starvation e deadlock (Veremos mais detalhes)
27
O Modelo de Thread (2)
• Items compartilhados por todos os threads em um processo• Itens privativos de cada thread
Compartilhados Privativos
28
O Modelo de Thread (3)
Cada thread tem sua própria pilha
Thread
Em ambientes cliente-servidor, múltiplos threads permitem que diversos pedidos sejam atendidos simultaneamente
Em multithread um thread pode solicitar um serviço remoto, e a aplicação pode continuar executando outras atividades.
Em monothread uma aplicação pode ficar esperando indefinidamente o resultado de um serviço remoto
Thread
Thread
Arquitetura e implementação
Pacote de threads = conjunto de rotinas para que uma aplicação utilize threads
Tipos de arquiteturas mais usuais
• Threads em Modo Usuário• Threads em Modo Kernel
Thread em modo usuário São implementados pela aplicação e não pelo SO
Deve existir uma biblioteca de rotinas que possibilite à aplicação realizar tarefas como:
• Criação/eliminação de threads• Troca de mensagens entre threads• Política de escalonamento
Neste modo o SO desconhece a existência de múltiplos threads, sendo responsabilidade da aplicação gerenciar/sincronizar os threads
A troca de contexto entre threads é feita em modo usuário pelo escalonador embutido em uma biblioteca:
- Não necessita privilégios especiais - Escalonamento depende da implementação
Thread em modo usuário
A vantagem desse modelo é a possibilidade de implementar aplicações multithreads mesmo em SO monothread
É rápida e eficiente, pois dispensa acessos ao kernel,
• Isto evita a mudança de modo de acesso (Usuário-Kernel-Usuário -> realiza TRAP)
34
Implementação de Threads de Usuário
Um pacote de threads de usuário
Threads em Modo Usuário Inserido no espaço do usuário e implementados por uma
biblioteca, executados em um sistema de tempo de execução (runtime = coleção de rotinas que gerenciam threads).
O núcleo não é informado sobre eles, pois o núcleo gerencia processos normais monothreads, e o chaveamento entre threads de usuário é mais rápido que desviar o controle para o núcleo.
1ª vantagem é que pode ser implementado em um SO que não suportada threads e 2ª vantagem é que permitem a cada processo ter seu próprio algoritmo de escalonamento.
Usa Tabela de Threads (TCB) para manter o controle das threads naquele processo e escalonam melhor, pois dividem o mesmo espaço de endereçamento e contexto de software.
Desvantagem é chavear threads de processos realizando trap.
Threads de Modo Usuário Sua grande limitação é o fato do SO gerenciar cada
processo como se existisse apenas um único thread• No momento que um thread entra em estado
bloqueado/espera todo o processo é colocado em bloqueado/espera
• Para contornar isso, a biblioteca deve ter rotinas que substituam as rotinas bloqueadas por outras que não possam bloquear um thread
- Todo esse controle é transparente para o usuário e SO
O fato do SO gerenciar o processo como um thread, também compromete o escalonamento e o tratamento de sinais
• Os sinais enviados para um processo devem ser reconhecidos e enviado para cada thread
• O escalonamento não é possível, pois os múltiplos threads de um processo não são executados em CPUs diferentes simultaneamente
- Os threads de um processo são executados em uma CPU por vez
Exemplo de Thread (runtime)
Biblioteca: executados em um sistema de tempo de execução (runtime = coleção de rotinas que gerenciam threads).
Exemplo de Thread (runtime) São implementados diretamento pelo Kernel, através de
chamadas a rotinas do SO
O SO conhece cada thread e escalona-os individualmente
No caso de múltiplas CPUs, os threads de um mesmo processo podem ser executados simultaneamente
Sua grande limitação é seu baixo desempenho• Exige muita troca de modo de acesso (Usuário-Kernel-
Usuário)
39
Implementação de Threads de Núcleo
Um pacote de threads gerenciado pelo núcleo
PCB TCB
Modelo de Programação
Um fator importante em multithread é o total de threads
• Muitos threads poderão sobrecarregar o sistema (desempenho ruim)
Para usufruir de thread, uma aplicação deve permitir que partes do seu código executem em paralelo e independente
Se um aplicativo executa muitas E/S e trata eventos assíncronos, a multithread aumenta o desempenho
• EX: SGBDs, Servidores de Impressão O desenvolvimento multithread não é simples,
exigindo muito sincronismos para evitar problemas de inconsistência e deadlock.
41
Uso de Thread (1)
Um processador de texto com três threads
Thread formata e reformata o conteúdo em segundo plano a medida em que o usuário digita novos teto do editor
Thread interativo com o usuário, trata dos textos digitados pelo usuário
Thread que realiza backups em disco a cada período de tempo, sem interferir nos outros dois.
42
Uso de Thread (2)
Um servidor web com múltiplos threads
43
Uso de Thread (3)
(a) Thread despachante: lê as requisições de trabalho que chegam da rede.
(b) Depois de examinar a requisição ele escolhe o Thread Operário ocioso (bloqueado) e entrega-lhe a requisição, colocando –o em estado de pronto. Em seguida o operário verifica se a requisição está na cache de páginas web. Se estiver entrega-o ao cliente e bloqueia o operário. Senão, bloqueia e procura em disco. Enquanto isso, outra requisição do despachante é atendida.
44
Uso de Thread (4)
Três maneiras de construir um servidor
45
Ativações do Escalonador Objetivo – imitar a funcionalidade dos threads de núcleo
• ganha desempenho de threads de usuário Evita transições usuário/núcleo desnecessárias Núcleo atribui processadores virtuais para cada processo
– deixa o sistema supervisor alocar threads para processadores
Problema:Baseia-se fundamentalmente nos upcalls - o núcleo (camada inferior) chamando procedimentos no espaço do usuário (camada superior)
Implementando modelo N:1
Vantagens e Desvantagens
Vantagens: • SO divide o tempo do processado entre os processos
“pesados” e, a biblioteca de threads divide o tempo do processo entre as threads, sem interação/intervenção do SO.
Desvantagens• Uma thread que realiza uma chamada de sistema
bloqueante leve ao bloqueio de todo o processo- Operações de entrada/saída
• Não explora paralelismo em máquinas multiprocessadoras.
Implementando modelo 1:1
Modelo 1:1 Threads a nível de sistema
• Kernel Level Threads ou ainda System Scope
Resolver desvantagens do modelo 1:1• SO mantém informações sobre processos e sobre threads • Troca de contexto necessita da intervenção do SO
O conceito de thread é considerado na implementação do SO.
Vantagens: • Explora paralelismo de máquinas multiprocessadoras• Facilita o recobrimento de entrada/saída por cálculos
Desvantagens • Implementação mais pesada que o modelo N:1
Implementando modelo M:N
Modelo M:N Abordagem que combina modelo N:1 e 1:1
Oferece dois níveis de escalonamento
• Nível usuário: threads sobre unidade de escalonamento
• Nível sistema: unidades de escalonamento sobre processador
Dificuldade é parametrizar M e N
Processos X Threads
Tipos de sistemas
• 1 processo com 1 thread: MSDOS• N processos, cada um com 1 thread: OS/386, VAX/VMS, Windows 3.1, UNIX antigo
• 1 processo com N threads: kernels para sistemas embarcados
• N processos, cada um com N threads: Windows 95/98,NT, UNIX
53
Threads Pop-Up
Criação de um novo thread quando chega uma mensagem(a) antes da mensagem chegar
(b) depois da mensagem chegar
Requisição de serviço
Threads Pop-up Normalmente usado em sistemas distribuídos são threads
novos sem qualquer história (registradores, pilhas, TCB) que deva ser restaurada e inicia recém-criado e é igual ao demais
Ao novo thread é dada uma mensagem para processar: (mensagem chega, é aceita, conteúdo examinado e então é processada)
A vantagem é que a latência entre a chegada da mensagem e o início do processamento pode ser muito pequena
Pode executar no espaço do núcleo ou do usuário, mas no núcleo é, em geral, mais fácil e rápido
Além disso, no núcleo pode ter acesso a todas as tabelas e aos dispositivos de E/S necessários ao processamento de interrupções.
Planejamento prévio: (em qual processo o thread executa?)
Porque utilizar threads?
Permitir o paralelismo real oferecidos por máquinas multiprocessadores (modelo N:1 e 1:1)
Aumentar o número de atividades executadas por unidade de tempo (throughput)
Diminuir o tempo de resposta• Possibilidade de associar threads a dispositivos
de E/S Sobrepor operações de cálculo com operações de E/S
Vantagens de Mutithreading
Tempo de criação/destruição de threads é inferior ao tempo de criação/destruição de processos
Chaveamento de contexto entre threads é mais rápido em tempo que chaveamento entre processos
Como threads compartilham o descritor do processo que as contem, elas dividem o mesmo espaço de endereçamento o que permite a comunicação por memória compartilhada, sem interação com o núcleo
Referências
Sistemas Operacionais Modernos – 3ª Edição. A. Tanenbaum, 2008.
Modern Operating Systems 3 e. Prentice-Hall, 2008.
top related