Buscar

Sistemas Operacionais aula 04

Prévia do material em texto

CCT0011 – Sistemas Operacionais
Aula 04 – Threads
Professor Ricardo Bernardo
Sistemas Operacionais
Conteúdo da Aula
Breve Revisão Última Aula
Conceito de Threads
Tipos de Threads
Aplicações dos Threads
Sistemas Operacionais
Revisão
• Um programa por si só não é um processo. 
• Um programa é uma entidade passiva, enquanto o processo é uma entidade ativa 
• Processos são programas em execução, constituídos por: 
• código executável,
• pilha de execução
• estado do processo
• prioridade do processo
• valor do contador de programa (PC)
• valor do apontador de pilha (SP)
• valores de demais registradores 
• Um programa é carregado para a memória onde aloca uma determinada área para código e dados
Sistemas Operacionais
Revisão
Um processo é formado por 
três partes conhecidas como contexto 
de hardware, contexto de software e 
espaço de endereçamento, que 
juntos mantêm todas as informações 
necessárias à execução de um 
programa. 
Sistemas Operacionais
Threads - Introdução
Até a década de 70 os sistemas operacionais suportavam apenas processos com um único thread, 
ou seja, um processo com apenas um único programa fazendo parte do seu contexto.
Em meados de 1980 foi introduzido o conceito onde o espaço de endereçamento de um processo 
era compartilhado por vários programas.
A partir do conceito de múltiplos threads é possível projetar e implementar aplicações 
concorrentes de forma eficiente, pois um processo pode ter partes diferentes do seu código sendo 
executadas em paralelo. Com menor overhead do que utilizando múltiplos processos.
Sistemas Operacionais
Threads - Introdução
O modelo de processos é baseado em dois conceitos independentes:
Agrupamento de recursos:
• Espaço de endereçamento, arquivos abertos, etc.
• Aglutinar estes recursos na forma de um processo facilita o gerenciamento destes recursos.
Execução do processo, o qual contém:
• Um contador de programa que aponta para a próxima instrução a ser executada.
• Registradores, que contém as variáveis de trabalho atuais.
• A pilha que traz a história da execução, com uma estrutura para cada rotina chamada mas ainda 
não terminada;
Sistemas Operacionais
Threads - Introdução
O modelo de processos estudado supõe o uso de apenas uma thread por processo.
Cada processo tem o seu espaço de endereçamento e um único thread de controle. 
Exceto pelo espaço de endereçamento compartilhado. Intuitivamente, threads são como processos 
dentro de outro processo (são linhas/fluxo de execução).
Thread é uma forma de um processo dividir a si mesmo em duas ou mais tarefas.
Apesar de threads serem executadas em processos, ambos são conceitos diferentes e podem ser 
tratados separadamente.
• Processos são usados para agrupar recursos.
• Threads são as entidades escalonadas para usar a CPU.
Sistemas Operacionais
Threads - Para que Servem
• Melhor aproveitamento da fatia de tempo
• Compartilhamento de Recursos
• Economia de tempo de gerenciamento
• Utilização de Múltiplos Processadores
Sistemas Operacionais
Threads
O modelo de threads permite que múltiplas execuções ocorram no mesmo ambiente de processo, 
com um grande grau de independência uma da outra.
Threads (também chamadas de processos leves) são linhas de execução, e compreendem:
• Id: identificador da thread
• Endereço da próxima instrução a ser executada
• Conjunto de registradores em uso
• Uma pilha de execução
Threads compartilham com outras threads recursos, como:
• Trecho de código
• Dados
• Arquivos abertos
Sistemas Operacionais
Conclusão
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.
O programador deve especificar os threads, associando-os às sub-rotinas assíncronas.
Um ambiente multithread possibilita a execução concorrente de sub-rotinas dentro de um mesmo 
processo.
Mas, quando é desejável utilizar mais de uma thread?
Sistemas Operacionais
Unidade de Alocação
Ambientes Monothread
O processo é ao mesmo tempo a unidade de alocação de recursos e a unidade de escalonamento.
Ambiente Multithread
A unidade de alocação de recursos é o processo, onde todos os seus threads compartilham o 
espaço de endereçamento, descritores de arquivos e dispositivos de E/S. Cada thread representa uma 
unidade de escalonamento independente. Neste caso o sistema não seleciona um processo para a 
execução, mas um de seus threads.
Sistemas Operacionais
Ambiente Monothread
Um programa é uma sequência de instruções, composta por desvios, repetições e chamadas a 
procedimentos e funções.
Em um ambiente monothread, um processo suporta apenas um programa no seu espaço de 
endereçamento.
Neste ambiente, aplicações concorrentes são implementadas apenas com o uso de múltiplos 
processos independentes ou subprocessos.
Thread ThreadThread
Sistemas Operacionais
Ambiente Monothread
• A utilização de processos independentes e 
subprocessos permite dividir uma aplicação em 
partes que podem trabalhar de forma concorrente. 
• Exemplo: aplicações gráfica, software de 
gerenciamento de e-mails. Um usuário pode estar 
lendo suas mensagens antigas, e ao mesmo tempo 
que pode estar enviando e-mails e recebendo 
novas mensagens.
Subprocessos Processos Independentes
Sistemas Operacionais
Problemas com Ambientes Monothreads
• A utilização de processos no 
desenvolvimento de aplicações concorrentes 
demanda consumo de diversos recursos do 
sistema.
• Sempre que um processo é criado, o sistema 
deve alocar recursos para cada processo, 
consumindo tempo de processador neste 
trabalho. No caso do término do processo, o 
sistema dispensa tempo para desalocar 
recursos previamente alocados.
• Cada um possui contextos de hardware, 
software e de endereçamento próprios.
Subprocessos Processos Independentes
Como cada processo possui seu próprio espaço de 
endereçamento próprio, a comunicação entre 
processos torna-se difícil e lenta, pois utiliza 
mecanismos como pipes, semáforos, memória ou 
compartilhamento de mensagem.
Sistemas Operacionais
Ambiente Multithread 
Em um ambiente multithread, não existe a ideia 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 inúmeros outros threads.
A utilização do processador, dos discos e de outros periféricos pode ser feita de forma concorrente 
pelos diversos threads, significando melhor utilização dos recursos computacionais disponíveis.
Em algumas aplicações, a utilização de threads pode melhorar o desempenho da aplicação apenas 
executando tarefas em background enquanto operações de E/S estão sendo processadas.
Sistemas Operacionais
Ambiente Multithread
Na figura ao lado existe apenas um processo com 
três threads de execução compartilhando o 
mesmo espaço de endereçamento.
Desta forma o ambiente multithread possibilita a 
execução concorrente de sub-rotinas dentro de um 
mesmo processo.
Sistemas Operacionais
Ambiente Multithread
Inicialmente, o processo é criado apenas com o 
thread1 para a execução do programa principal.
Quando o programa principal chama as sub-rotinas 
Sub_1 e Sub_2, são criados os Thread_2 e Thread_3, 
e executados independentemente do programa 
principal. 
Espaço de
endereçamento
Processo
Programa Principal
C
o
n
te
x
to
 d
e
H
a
rd
w
a
re
C
o
n
te
x
to
 d
e
H
a
rd
w
a
re
C
o
n
te
x
to
 d
e
H
a
rd
w
a
re
Call Sub_1
Call Sub_2
Thread_1
Thread_2
Thread_3
PC
SP
PC
SP
PC
SP
Fim
Sub_2
Variáveis
RetSub_1
Ret
..
.
..
.
Sistemas Operacionais
Ambiente Multithread
Em ambiente cliente-servidor, threads são essenciais para 
solicitações de serviços remotos.
Em ambiente monothread, uma solicitação a serviço remoto, 
pode ficar esperando indefinidamente, enquanto aguarda o 
resultado.
Em ambiente multithread, um thread pode solicitar serviço 
remoto, enquanto a aplicação pode continuar realizando outras 
atividades.
Para o processo que atende a solicitação, múltiplos threads
permite que diversos pedidos sejam atendidos 
simultaneamente.
Sistemas Operacionais
Ambiente Multithreads
• Dentro de um mesmo processo, threads compartilham o mesmo contexto de software e espaço de 
endereçamento com os demais, porém cada um possui seu contexto de hardware individual.
• Threads são implementados internamente através de uma estrutura denominada bloco de controle 
do thread (TCB).
• O TCB armazena, além do contexto de hardware, mais algumas informações relacionadas 
exclusivamente ao thread, como, prioridade, estado de execução e bits de estado.
Em ambientes multithread, a unidade de alocação de recursos é o processo, onde todos os seus 
threads compartilham espaço de endereçamento, descritores de arquivos e dispositivos de E/S. Por 
outro lado cada thread representa uma unidade de alocação independente.
Neste caso o SO seleciona threads e não processos para a execução.
Sistemas Operacionais
Ambiente Multithreads - Características
 Cada processo pode responder a várias solicitações concorrentemente ou mesmo simultaneamente, 
caso haja mais de um processador.
 Programas concorrentes implementando múltiplos threads são mais rápidos que programas 
concorrentes que implementam múltiplos processos. A grande vantagem no uso de threads é a 
possibilidade de minimizar a alocação de recursos do sistemas, além de diminuir o overhead na 
criação, troca e eliminação de processos.
 Threads compartilham o processador da mesma maneira que processos e passam pelas mesmas 
mudanças de estado (execução, espera e pronto).
 Enquanto um thread espera por uma operação de E/S, outro thread pode ser executado.
 Para permitir a troca de contexto entre diversos threads, cada thread possui seu próprio contexto de 
hardware, com o conteúdo dos registrados gerais, PC (Program Counter) e SP (Stack Point).
Sistemas Operacionais
Ambiente Multithreads - Características
 Quando um thread está sendo executado, seu contexto de hardware está carregado nos registradores 
do processador. No momento em que o thread perde a utilização da UCP, as informações são 
atualizadas e salvas no seu contexto de hardware.
 Como não existe proteção no acesso a memória por threads de um mesmo processo, é fundamental 
que a aplicação implemente mecanismos de comunicação e sincronização entre threads a fim de 
garantir o acesso seguro aos dados compartilhados.
Implementação Tempo de Criação (µS) Tempo de Sincronização (µS)
Processo 1700 200
Processo Lightweight 350 390
Thread 52 66
Latência de Processos e Threads
Sistemas Operacionais
Threads - Vantagens
Tempo de resposta
• Uma aplicação interativa pode continuar sendo executada se parte dela está bloqueada, ou 
executando uma operação lenta.
Compartilhamento de recursos
• Por padrão os threads compartilham: memória e qualquer recurso alocado pelo processo ao qual 
estão subordinadas. Não é necessária a alocação de mais recursos no sistema.
Economia
• É mais econômico criar e trocar o contexto dos threads.
Utilização de arquiteturas multiprocessadas
• Cada thread pode ser executada de forma paralela, em processadores distintos.
Sistemas Operacionais
Multithreads
Sistemas Operacionais
Arquitetura e Implementação
Threads podem ser oferecidos por: 
• Modo Usuário  Biblioteca de rotinas fora do núcleo do sistema operacional.
• Modo Kernel Implementado pelo núcleo do sistema operacional
• Modo Híbrido  Por uma combinação de vantagens de ambos.
Sistemas Operacionais
Threads em Modo Usuário (TMU)
São implementados pela aplicação e não pelo sistema operacional.
Deve existir uma biblioteca de rotinas que possibilite à aplicação realizar tarefas como criação / 
eliminação de threads, troca de mensagens entre threads e uma política de escalonamento.
É responsabilidade exclusiva da aplicação gerenciar e sincronizar
os diversos threads existentes. SO não sabe da existência de
múltiplos threads.
A vantagem deste modelo é a possibilidade de implementar
aplicações multithreads mesmo em sistemas operacionais que
não suportam threads.
Esta implementação é mais rápida e eficientes por dispensarem acessos ao kernel do sistema 
operacional, evitando assim a mudança de modo de acesso (usuário-kernel-usuário).
Modo
usuário
Modo
kernel
Kernel
Biblioteca
Thr
ead
 0
Thr
ead
 4
Thr
ead
 3
Thr
ead
 2
Thr
ead
 1
Sistemas Operacionais
Threads em Modo Usuário - Limitações
Threads em modo usuário possuem uma grande limitação, pois o SO gerencia cada processo como se 
existisse apenas um único thread.
No momento em que um thread chama uma rotina do sistema que o coloca em estado de espera, todo o 
processo é colocado no estado de espera, mesmo havendo outros threads para execução.
Para contornar esta limitação, a biblioteca tem que possuir rotinas que substituam as rotinas bloqueantes 
por outras que não possam causar o bloqueio de um thread.
Todo este controle é transparente para o usuário e o sistema operacional.
Um dos maiores problemas na implementação de threads em modo usuário, é o tratamento individual de 
sinais.
No caso de interrupção de clock, fundamental para a implementação de tempo compartilhado, esta 
limitação é crítica. Neste caso, os sinais de temporização devem ser interceptados, para que se possa 
interromper o thread em execução e realizar a troca de contexto.
Sistemas Operacionais
Threads em Modo Usuário - Limitações
Escalonamento em ambientes com múltiplos processadores não é possível threads de um mesmo 
processo sejam executados em CPUs diferentes simultaneamente.
Esta restrição limita drasticamente o grau de paralelismo da aplicação, já que os threads de um 
mesmo processo podem ser executados em somente um processador de cada vez.
Modo
usuário
Modo
kernel
Kernel
Biblioteca
Thr
ead
 0
Thr
ead
 4
Thr
ead
 3
Thr
ead
 2
Thr
ead
 1
Sistemas Operacionais
Threads em Modo Usuário
• As threads de usuário facilitam aspectos de portabilidade 
e são criadas e gerenciadas por uma biblioteca no nível do 
usuário. 
• O kernel não enxerga essas threads e, por esse motivo, 
não podem ser gerenciadas individualmente.
• Bibliotecas de threads: POSIX Pthreads , Win32 threads, 
Java threads
Sistemas Operacionais
Threads em Modo Kernel
São implementados diretamente pelo núcleo do sistema operacional, através de chamadas a rotinas 
do sistema que oferecem todas as funções de gerenciamento e sincronização.
Enquanto nos pacotes em modo usuário todo tratamento é feito sem a ajuda do sistema operacional, 
ou seja sem a mudança do modo de acesso (usuário-kernel-usuário), pacotes em modo kernel utilizam 
chamadas a rotinas do sistema e consequentemente, várias mudanças de modo de acesso.
SO pode escalonar cada thread individualmente.
O grande problema para pacotes em modo
kernel é o seu baixo desempenho
Modo
usuário
Modo
kernelKernel
Threa
d 0 Threa
d 4
Threa
d 3
Threa
d 2
Threa
d 1
Sistemas Operacionais
Threads em Modo Kernel
• As threads em modo kernel são criadas e gerenciadas pelo 
kernel do sistema operacional e não podem ser diretamente 
utilizadas pelo usuário. 
• O suporte a múltiplas threads é uma característica do 
sistema operacional.
P
ImplementaçãoOperação 1 (µS) Operação 2 (µS)
Subprocesso 11.300 1.840
Thread em Modo Kernel 948 441
Thread em Modo Usuário 34 37
Sistemas Operacionais
Threads em Modo Híbrido
A arquitetura de threads em modo híbrido combina as vantagens de threads implementados em 
modo usuário (TMU) e threads em modo kernel (TMK). 
Um processo pode ter vários TMKs e, por sua vez, um TKM pode ter vários TMUs.
O modo híbrido apesar de maior flexibilidade, apresenta problemas herdados de ambas as 
implementações. Por exemplo, quando um TMK realiza uma
chamada bloqueante, todos os seus TMUs são colocados no
estado de espera.
Modo
usuário
Modo
kernel
Kernel
TMK 0 TMK 3TMK 2TMK 1
Biblioteca
TM
U 
0
TM
U 
4
TM
U 
5
TM
U 
3
TM
U 
2
TM
U 
1
Sistemas Operacionais
Threads em Modo Híbrido
A associação entre threads de usuário e de kernel depende 
do sistema operacional. 
• Modo usuário: rápida criação e chaveamento entre 
threads.
• Modo núcleo: o processo todo não é bloqueado pelo 
bloqueio de uma thread.
• A ideia é utilizar algumas threads de núcleo e 
multiplexar threads de usuários sobre elas.
• O usuário decide quantas threads utilizar, tendo uma 
maior flexibilidade.
• Esta é a solução mais utilizada nos sistemas 
modernos.
Sistemas Operacionais
Processo Independentes, Subprocessos e Threads
• Processos independentes, subprocessos e threads são maneiras diferentes de implementar a 
concorrência dentro de uma aplicação. 
• Nesse caso, busca-se subdividir o código em partes para trabalharem de forma cooperativa. 
• Considere um banco de dados com produtos de uma grande loja, onde vendedores fazem 
frequentemente consultas. 
• Neste caso, a concorrência na aplicação proporciona um tempo de espera menor entre as consultas, 
melhorando o desempenho da aplicação e beneficiando os usuários. 
Sistemas Operacionais
Processo Independentes
• O uso de processos independentes é a maneira mais simples de implementar a concorrência em 
sistema multiprogramáveis. 
• Neste caso, não existe vínculo do processo criado com o seu criador. 
• A criação de um processo independente exige a alocação de um PCB, possuindo contextos de 
hardware, contextos de software e espaço de endereçamento próprios 
Sistemas Operacionais
Subprocessos
• Subprocessos são processos criados dentro de uma estrutura hierárquica. 
• Nesse modo o processo criador é denominado processo-pai, enquanto o novo processo é chamado 
de subprocesso ou processo-filho. 
• O subprocesso, por sua vez, pode criar outras estruturas de subprocessos. 
• Uma característica desta implementação é a dependência existente entre o processo criador e o 
subprocesso. 
• Caso um processo pai deixe de existir, os subprocessos subordinados são automaticamente 
eliminados. 
• De modo semelhante aos processos independentes, subprocessos possuem seu próprio PCB. 
• Além da dependência hierárquica entre processos e subprocessos, uma outra característica neste 
tipo de implementação é que subprocessos podem compartilhar quotas com o processo pai. 
• Neste caso, quando um subprocesso é criado o processo-pai cede parte de suas quotas ao processo-
filho. 
Sistemas Operacionais
Threads
• O conceito de thread foi introduzido na tentativa de reduzir o tempo gasto em criação, eliminação e 
troca de contexto de processos nas aplicações concorrentes, bem como economizar recursos do 
sistema como um todo. 
• Em um ambiente multithread, um único processo pode suportar múltiplos threads, cada qual 
associado a uma parte do código da aplicação. 
• Neste caso, não é necessário haver diversos processos para a implementação da concorrência. 
• Threads compartilham o processador da mesma maneira que um processo, ou seja, enquanto um 
thread espera por uma operação de E/S, outro thread pode ser executado.
• Cada thread possui seu próprio contexto de hardware, porém compartilha o mesmo contexto de 
software e espaço de endereçamento com os demais threads do processo. 
• O compartilhamento do espaço de endereçamento permite que a comunicação de threads dentro do 
mesmo processo seja realizada de forma simples e rápida. 
• A Pilha é uma área reservada para uso exclusivo. Não é permitido o compartilhamento da pilha entre 
as threads. 
Sistemas Operacionais
Dúvidas

Continue navegando