Sistemas
Operacionais
Aula 9
Threads
Prof.: Edilberto M. Silva
http://www.edilms.eti.br
Baseado no material disponibilizado por:
SO - Prof. Edilberto Silva
Prof. José Juan Espantoso
Threads
Uma thread (ou um processo leve) é uma unidade básica
de utilização da CPU; ela consiste de:
– Contador de programas
– Conjunto de registradores
– Espaço de pilha
Uma thread compartilha com seus pares (outras threads
vinculadas):
– Seção de código
– Seção de dados
– Recursos do sistema operacional
Coletivamente conhecida como uma tarefa (task).
SO - Prof. Edilberto Silva
2
Threads
Modelo de Threads
(a) 3 processos, cada um com uma thread
(b) 1 processo com 3 Threads
SO - Prof. Edilberto Silva
3
Modelo de Threads
Itens compartilhados por todos as threads em um processo
Itens privados de cada thread
SO - Prof. Edilberto Silva
4
Modelo de Threads
Cada Thread possui sua própia pilha (stack)
SO - Prof. Edilberto Silva
5
Uso de Threads
Um editor de texto com três threads
SO - Prof. Edilberto Silva
6
Uso de Threads
Um servidor Web com Threads
SO - Prof. Edilberto Silva
7
Uso de Threads
Rough outline of code for previous slide
(a) Thread para disparo
(b) Thread trabalhadora
SO - Prof. Edilberto Silva
8
Ambiente Multithread
Aplicação multithread
Pro ce sso
E s p a ç o d e
e n d e r e ç a m e n to
V a riá v e is
P r o g r a m a P r in c ip a l
PC
SP
C a ll S u b _ 1
T h re a d _2
Su b _1
PC
SP
T h re a d _3
Su b _2
PC
SP
C o n te x t o d e
H a rd w a re
F im
C o n te x t o d e
H a rd w a re
C a ll S u b _ 2
Ret
Ret
...
Neste processo os
três threads são executados
concorrentemente.
T h re a d _1
C o n te x to d e
H ardw are
...
Na figura ao lado,
existe um programa principal
que realiza a chamada de
duas sub-rotinas assíncronas
(Sub_1
e
Sub2).
Inicialmente, o processo é
criado
apenas
com
o
Thread_0 para execução do
programa principal. Quando
o programa principal chama
as sub-rotinas, são criados
os thread_1 e Thread_2.
SO - Prof. Edilberto Silva
9
Ambiente Multithread
Benefícios de programação com múltiplos threads:
Capacidade de resposta – o multithreading de uma aplicação
interativa pode permitir que um programa continue executando
mesmo se parte dele estiver bloqueada ou executando uma operação
demorada, aumentando assim, a capacidade de resposta ao usuário.
Por exemplo, um navegador web com múltiplos threads poderia
permitir a interação do usuário em um thread enquanto uma imagem
está sendo carregada em outro thread
Compartilhamento de recursos – os threads compartilham a memória
e os recursos do processo aos quais pertencem. O Compartilhamento
de código permite que uma aplicação tenha vários threads diferentes
todos dentro do mesmo espaço de enderaçamento
SO - Prof. Edilberto Silva
10
Ambiente Multithread
Benefícios de programação com múltiplos threads:
Economia – alocar memória e recursos para a criação de
processo é caro. Como os threads compartilham recursos
do processo, é mais econômico criar e realizar a troca de
contexto de threads. No Solaris criar um processo é quase
30 vezes mais lento do que criar um thread, e a troca de
contexto é cinco vezes mais lenta
Utilização de arquiteturas de multiprocessador – os
benefícios são expandidos em arquitetura
multiprocessador, na qual cada thread pode estar
executando em paralelo em um processador diferente
SO - Prof. Edilberto Silva
11
Ambiente Multithread
Aplicação
multithread (a)
T h r e a d d e
e n tr a d a
Bu ffe r
T h r e a d d e
e x ib iç ã o
T h r e a d d e
g ra v a çã o
SO - Prof. Edilberto Silva
12
Ambiente Multithread
Aplicação
multithread (b)
P r o c e s s o s e r v id o r
S o lic ita ç õ e s
T h re a d
Th re a d
Th re a d
P r o c e s s o c lie n t e
P r o c e s s o c lie n t e
P r o c e s s o c lie n t e
SO - Prof. Edilberto Silva
13
Arquitetura e
Implementação
Pode ser fornecido suporte a threads no nível do
usuário, para threads de usuário, ou pelo kernel,
para threads de kernel
SO - Prof. Edilberto Silva
14
Arquitetura e
Implementação
Threads em modo usuário
são suportados acima do kernel e são implementados por
uma biblioteca no nível do usuário (criação,
escalonamento e gerência de thread, sem suporte do
kernel)
todas as atividades são feitas no espaço de usuário, sem
necessidade de intervenção do kernel. Portanto, os
threads de usuário são rápidos de criar e gerenciar; no
entanto, apresenta desvantagens. Por exemplo, se o kernel
tiver um único thread, qualquer thread de usuário
realizando uma chamada bloqueante ao sistema causará o
bloqueio de todo o processo, mesmo se houver outros
threads disponíveis na aplicação
SO - Prof. Edilberto Silva
15
T h re a d 4
Th re a d 3
Th re a d 2
T h r e a d 1
Th re a d 0
Threads em modo usuário
Arquitetura e
Implementação
M odo
u s u á rio
B ib lio t e c a
K e rn e l
SO - Prof. Edilberto Silva
M odo
k e rn e l
16
Threads em modo kernel
Arquitetura e
Implementação
São suportados diretamente pelo sistema operacional (criação,
escalonamento e a gerência são feitos pelo kernel no espaço do
kernel)
Como a gerência é feita pelo s.o., os threads de kernel são
geralmente mais lentos na criação e gerência do que os threads
de usuário. No entanto, se um thread realizar uma chamada
bloqueante ao sistema, o kernel poderá escalonar outro thread
na aplicação para execução. Além disso, em ambientes
multiprocessados, o kernel pode escalonar threads em
diferentes processadores
SO - Prof. Edilberto Silva
17
K e rn e l
T h r e a d 4
T h r e a d 3
T h r e a d 2
T h r e a d 1
T h r e a d 0
Threads em modo kernel
Arquitetura e
Implementação
M odo
u s u á rio
M odo
k e rn e l
•Windows NT, Solaris e Digital unix são sistemas
operacionais que suportam threads de kernel.
SO - Prof. Edilberto Silva
18
T M U 5
T M U 4
T M U 3
T M U 2
T M U 1
T M U 0
Threads em modo híbrido
Arquitetura e
Implementação
M odo
u s u á rio
B ib lio t e c a
TM K 0
TM K 1
TM K 2
K e rn e l
TM K 3
M odo
k e rn e l
•Muitos sistemas fornecem suporte a threads de usuário e
de kernel, resultando em diferentes modelos de
multithreading.
SO - Prof. Edilberto Silva
19
Threads de Java
Como visto o suporte para threads é fornecido pelo sistema
operacional ou por uma biblioteca de threads. Por exemplo, a
biblioteca win32 fornece um conjunto de APIs para efetuar
multithreading em aplicações nativas do windows e Pthreads
fornece uma biblioteca de funções de gerência de threads para
sistemas compatíveis com POSIX
Java fornece suporte no nível da linguagem para criação e geração
de threads
Todos os programas Java consistem em pelo menos um thread de
controle. Um programa Java com apenas um método main()
executa com um único thread na JVM
Uma forma de criar um thread explicitamente é criar uma nova
classe derivada da classe thread e redefinir o método run()
SO - Prof. Edilberto Silva
20
Thread em Java
Exemplo de criação de thread pela extensão da
classe Thread
class Worker1 extends Thread
{
public void run( ) {
system.out.println(“I am a worker thread”);
}
}
Public class First
{
public static void main)String args [ ]){
worker1 runner = new Worker1( );
runner.start( );
System.out.println(“I am The Main Thread”);
}
{
SO - Prof. Edilberto Silva
21
Thread em Java
Além de um programa Java que contém vários threads, existem
threads executando assincronamente para a JVM que tratam de
tarefas ao nível de nível
A especificação JVM não indica como os threads serão mapeados
no sistema operacional, isso depende de cada JVM em particular
Em geral, um thread Java é considerado um thread de usuário, e a
JVM é responsável pela gerência dos threads. O windows NT
utiliza o modelo um-para-um, ou seja, cada thread Java para uma
JVM executando no NT é mapeada em um thread de Kernel. O
solaris 2 inicialmente implementou a JVM em muitos-para-um
(threads verdes – Sun). Na versão 2.6, JVM 1, é utilizado o modelo
muitos-para-muitos
SO - Prof. Edilberto Silva
22