1 threads prof. alexandre monteiro recife. contatos n prof. guilherme alexandre monteiro reinaldo n...

Post on 22-Apr-2015

112 Views

Category:

Documents

2 Downloads

Preview:

Click to see full reader

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