Beruflich Dokumente
Kultur Dokumente
Threads
• Visão geral
• Modelos multithreads
• Aspectos do uso de threads
• Pthreads
• Threads no Windows XP
• Threads no Linux
• Threads em Java
Threads
• De forma geral, cada fluxo de execução do sistema, seja
associado a um processo ou no interior do núcleo, é
denominado thread
• Uma Thread (ou processo leve) é uma unidade básica
da utilização da CPU; ela consiste em:
– contador de programa
– conjunto de registradores
– espaço de pilha
Threads
• Uma Thread compartilha com suas Threads afins:
– sua seção de código
– sua seção de dados
Processos e Threads
um processo um processo
uma thread múltiplas threads
Process
Control User User User
Block Stack Stack Stack
User Kernel
Address Stack
Space
User
Address Kernel Kernel Kernel
Space Stack Stack Stack
Threads
Threads
Vantagens
• Responsividade: programa continua mesmo que parte
dele esteja bloqueada. Exemplo: navegador Web
multithread pode interagir com o usuário enquanto
carrega imagens
• Compartilhamento de recursos
Vantagens
Threads
Threads
Threads de Usuário
• Sem poder contar com o suporte do sistema operacional
para a criação de múltiplos threads, os desenvolvedores
contornaram o problema construindo bibliotecas para
gerenciar threads dentro de cada processo, sem o
envolvimento do núcleo.
Threads de kernel
• Exemplos
– Windows XP/2000
– Solaris
– Linux
– Tru64 UNIX
– Mac OS X
Modelos Multithreads
• Muitos-para-um
• Um-para-um
• Muitos-para-muitos
Muitos-para-Um
• Muitas threads no nível do usuário associadas a uma única
thread de kernel
• Exemplos
– Solaris Green Threads
– GNU Portable Threads
Um-para-Um
• Cada thread do usuário associada a uma thread de kernel
• O modelo de threads 1:1 é adequado para a maioria da
situações e atende bem às necessidades das aplicações
interativas e servidores de rede. No entanto, é pouco
escalável: a criação de um grande número de threads impõe
um carga significativa ao núcleo do sistema, inviabilizando
aplicações com muitas tarefas (como grandes servidores Web
e simulações de grande porte).
• Exemplos
• Windows NT/XP/2000
• Linux
• Solaris 9 e acima
Modelo Um-para-Um
Muitos-para-Muitos
• Exemplos
– Solaris antes da versão 9
– Windows NT/2000 com o pacote ThreadFiber
• Exemplos
– IRIX
– HP-UX
– Tru64 UNIX
– Solaris até a versão 8
Threads do Solaris 2
• Cancelamento da thread
• Tratamento de sinais
• Bancos de threads
• Ativações de escalonador
Cancelamento da Thread
Tratamento de Sinais
Tratamento de Sinais
• Opções:
– Entregar o sinal a thread a que ele se aplica
– Entregar o sinal a cada thread no processo
– Entregar o sinal a certas threads no processo
– Atribuir uma thread específica para receber todos
os sinais para o processo
Bancos de Threads
Ativações do Escalonador
Pthreads
Pthreads
int sum; /* esses dados são compartilhados pela(s) Thread(s) */
void *runner(void *param); /* a thread*/
sum = 0;
if (upper > 0) {
for (i = 1; i <= upper; i++)
sum += i;
}
pthread_exit(0);
}
Silberschatz, Galvin e Gagne (c) 2003
Sistemas Operacionais com Java
Threads no Windows XP
Threads no Windows XP
Threads no Linux
Threads em Java
A interface Runnable
public interface Runnable
{
public abstract void run();
}
Estados da thread
try { task.join(); }
catch (InterruptedException ie) { }
System.out.println(“Terminado");
}
}
Cancelamento da Thread
Thread thrd = new Thread (new InterruptibleThread());
Thrd.start();
...
// agora o interrompe
Thrd.interrupt();
Cancelamento da Thread
public class InterruptibleThread implements Runnable
{
public void run() {
while (true) {
/*
* faz algum trabalho por um tempo
*/
if (Thread.currentThread().isInterrupted()) {
System.out.println(“Fui interrompida! ");
break;
}
}
// limpa e termina
}
}
/**
* apanha código de erro para esta transação
*/
public static Object getErrorCode() {
return errorCode.get();
}
}
Problema Produtor-Consumidor
public class Factory
{
public Factory() {
// Primeiro cria o buffer de mensagens
Channel mailBox = new MessageQueue();
producerThread.start();
consumerThread.start();
}
Thread Produtor
class Producer implements Runnable
{
private Channel mbox;
while (true) {
SleepUtilities.nap();
message = new Date();
System.out.println("Produtor produziu " + message);
Thread Consumidor
class Consumer implements Runnable
{
private Channel mbox;
while (true) {
SleepUtilities.nap();
// consome um item do buffer
System.out.println("Consumidor deseja consumir.");
message = (Date)mbox.receive();
if (message != null)
System.out.println("Consumer consumed "+ message);
}
}
}