Escolar Documentos
Profissional Documentos
Cultura Documentos
¤ Um conjunto de recursos do SO
n Arquivos abertos, conexões de rede, canais de áudio…
O que precisamos?
¨ Em muitos casos
¤ Todos precisam executar o mesmo código
¤ Todos precisam acessar os mesmos dados
¤ Todos precisam ter os mesmos privilégios
¤ Todos usam os mesmos recursos (arq. abertos, conexões de rede, etc)
¨ Ineficiente
¤ Espaço: PCB, tabela de páginas, etc
¤ Tempo: Criar estruturas do SO, criar/copiar espaços de
endereçamento, etc
É possível fazer melhor?
¨ Ideia chave:
¤ Separar o conceito de processo (espaço de endereçamento,
recursos de SO)
¤ … do fluxo de controle mínimo (pilha, ponteiro para pilha,
contador de programa, registradores)
Key
older
MS/DOS UNIXes
thread
Java Mach, NT,
Chorus,
Linux, …
many threads per process many threads per process
one process many processes
Espaço de endereçamento de um
(old)(antigo)
processo Process address space
0xFFFFFFFF
stack
(dynamic allocated mem)
SP
static data
(data segment)
code PC
(text segment)
0x00000000
Espaço de endereçamento de um
processo (novo)
(new) Address space with threads
thread 1 stack
SP (T1)
0xFFFFFFFF
thread 2 stack
SP (T2)
thread 3 stack
SP (T3)
address space
heap
(dynamic allocated mem)
static data
(data segment)
0x00000000 PC (T2)
code
PC (T1)
(text segment)
PC (T3)
Exemplos
¨ Navegador web
¤ Thread para exibir imagens
¤ Thread para recuperar dados da rede
¨ Processador de texto
¤ Thread exibir gráficos
¤ Thread para ler sequência de teclas
¨ Porém:
¤ a transferência de controle entre threads de um mesmo
processo requer chaveamento para modo núcleo
(chamadas de sistemas)
Mach, NT,
Chorus,
address
Linux, …
space
os kernel
thread CPU
(thread create, destroy,
signal, wait, etc.)
Tipos de threads: usuário
¨ gerenciamento das threads é feito pela aplicação
¤ sem intervenção do SO
¨ o núcleo desconhece a existência de thread
¨ bibliotecas para
¤ criação e destruição de threads
¤ envio de msgs
¤ escalonamento de threads
¤ salvamento e recuperação de contexto
¨ chaveamento entre threads não requer privilégio de
modo núcleo
Tipos de threads: usuário
¤ implementadas através de bibliotecas: executam em
qualquer SO
¨ Porém:
¤ chamada ao sistema bloqueia todas as threads de um
processo (para o SO é só um processo)
¤ não aproveita os benefícios do multiprocessamento
(estão em algum processo!)
Tipos de threads: usuário
User-level threads
user-level
thread library
os kernel
CPU
Tipos de threads: usuário
User-level threads: what the kernel see
¨ O que o kernel vê
address
space
os kernel
thread CPU
Tipos de threads: usuário
¨ Problema: se um thread de usuário bloqueia, por exemplo
por E/S, todas as outras do mesmo processo bloqueiam
User-level threads
user-level
thread library
kernel threads
os kernel
read CPU
(kernel thread create, destroy,
signal, wait, etc.)
Exemplo de desempenho (antigo)
¨ Processo
¤ criar: 251 μS
¨ Thread de kernel
¤ criar: 94 μS (2,5 vezes mais rápido)
¨ Thread de usuário
¤ criar: 4,5 μS (20 vezes mais rápido)
Modelos de Multi-threading
¨ Muitos-para-um
¨ Um-para-um
¨ Muitos-para-muitos
Muitos-para-um
¨ Muitas threads do
usuário mapeadas para
uma única thread do
núcleo
¨ Não tira vantagem de
sistemas
multiprocessadores
¨ Exemplos:
¤ Solaris Green
Threads
¤ GNU Portable
Threads
Um-para-um
¨ Cada thread do usuário é mapeada uma uma thread
do núcleo (também é uma desvantagem -> restringe
nº de threads)
¨ Exemplos
¤ Windows NT/XP/2000
¤ Linux
¤ Solaris 9 e posterior
Muitos-para-muitos
¨ Permite que muitas
threads do usuário
sejam mapeadas em
muitas threads do
núcleo (menor ou
igual)
¨ Exemplos
¤ Solaris antes da
versão 9
¤ Windows NT/2000
como o pacote
ThreadFiber
Modelo em dois níveis
¨ Similar ao M:M porém
também permite que
uma thread do
usuário seja
associada a uma
thread do núcleo
¨ Exemplos
¤ IRIX
¤ HP-UX
¤ Tru64 UNIX
¤ Solaris 8 e anteriores
Bibliotecas de threads
¨ Bibliotecas de threads oferecem uma API para
criação e manipulação de threads
¨ Cancelamento de threads
¤ Assíncrono versus adiado
¨ Pools de Thread
As chamadas de sistema fork() e exec()
P1: T1 e T2
T2:fork()
P2
P1: T1 e T2 P1: T1 e T2
T2:fork() T2:fork()
P2: T1 e T2 P2:T2
exec()
P2
Cancelamento de threads
¨ Cancelar uma thread antes de sua conclusão
¨ Duas abordagens
¤ Cancelamento assíncrono: termina a thread alvo
imediatamente. Pode não liberar recursos
necessários a nível de sistema
¤ Cancelamento adiado: permite que a thread alvo
verifique periodicamente se ela deve ser cancelada
Pool de threads
¨ Cria um número de threads em um pool onde
elas aguardam por trabalho
¨ Vantagens:
¤ Geralmente é um pouco mais rápido requisitar
uma thread já existente do que criar uma nova
thread
¤ Permite que o número de threads na(s)
aplicação(ões) seja limitado ao tamanho do pool
Exercício
pid_t pid;
1 pid = fork();
2 if (pid == 0) { // Child process
3 fork();
4 thread_create( . . . );
}
5 fork();
Exercício
P1/T1
Linha 1 Linha 5
P2/T2 P3/T3
Linha 5
Linha 3
Linha 4
Linha 4 Linha 5
T4.1 P5/T5