Sistemas Operativos Cap. IV Threadsnetlab.ulusofona.pt/so/teoricas/SO-4-Threads-2016.pdf ·...
Transcript of Sistemas Operativos Cap. IV Threadsnetlab.ulusofona.pt/so/teoricas/SO-4-Threads-2016.pdf ·...
Sistemas Operativos
Cap. IV
Threads
Prof. José Rogado
Universidade Lusófona
4.2 Lições de Sistemas Operativos
Threads
Necessidades e Conceito
Modelos de Multithreading
Problemas de Threading
As Pthreads
Windows XP Threads
Linux Threads
Java Threads
4.3 Lições de Sistemas Operativos
Necessidades de Multithreading
Browser
Servidor
Web
Browser
Grande parte das aplicações interactivas e distribuídas precisa de
gerir diversos fluxos de execução simultâneos
Interactividade com utilizador (Browser) ou gestão de várias
conecções simultâneas (Web server)
A utilização de vários processos distintos não é óptima pois implica
overhead na comunicação de dados e comutação de contexto
Browser
Browser
Servidor
Web
4.4 Lições de Sistemas Operativos
Múltiplos Fluxos de Execução
A solução passa por criar vários fluxos de execução dentro de cada processo
Executam código independente
Podem bloquear sem que o processo bloqueie
Partilham todo o espaço de memória do processo
Têm contextos de execução separados
Esses fluxos de execução designam-se por threads ou actividades
Servidor
Web
BDs
Servidor
Web Servidor
Web Browser
Servidores
Web
BDs
4.5 Lições de Sistemas Operativos
Separação de Recursos
Um processo é caracterizado por dois tipos de recursos distintos
Recursos estáticos: espaço de endereçamento (código, dados, atributos, PCB, etc.
Recursos dinâmicos: execução, estado, pilha, registos,
escalonamento, etc.
O modelo mutithreaded separa estes dois tipos de recursos:
Os recursos estáticos são geridos através do conceito de processo ou tarefa (task)
Os recursos dinâmicos são geridos através do conceito de thread ou actividade (lightweight process)
O processo é a unidade de gestão de recursos
A thread é a unidade de escalonamento
4.6 Lições de Sistemas Operativos
Single and Multithreaded Processes
No modelo multithreaded, em cada processo existem
vários fluxos de execução ou threads (actividades)
As várias threads de um processo partilham o espaço de
endereçamento, mas têm contextos de execução distintos
Thread
Context
4.7 Lições de Sistemas Operativos
Benefícios
Maior interactividade
Menor tempo de resposta
Partilha de Recursos
Economia
Utilização de Arquitecturas Multiprocessador
Programação paralela de alto desempenho
4.8 Lições de Sistemas Operativos
Escalonamento Clássico
No modelo clássico, em cada processo existe um único fluxo de
execução
A atribuição do CPU é feita por processo, sendo necessário uma
comutação para passar de um fluxo para outro
So
urc
e: O
pe
ratin
g S
ys
tem
s, G
ary
Nu
tt
Co
pyrig
ht ©
20
04
Pe
ars
on
Ed
uc
atio
n, In
c.
4.9 Lições de Sistemas Operativos
Escalonamento Multi-threaded
No modelo multithreaded, cada processo pode ter vários fluxos de
execução
A atribuição do CPU é feita por thread, podendo não ser
necessário uma comutação para passar de um fluxo para outro
Schedulin
g P
rogre
ss
P1
P2
P3
Th1
Th2
Th3
Th4
Th5
Th1
Th6
Th2
Sched init
4.10 Lições de Sistemas Operativos
Implementação do Conceito de Thread A implementação do conceito de Thread (ou actividade) pode ser
feito de várias formas
Implementação em modo utilizador numa biblioteca, ligada ao executável da aplicação
Threads POSIX (pthreads) na implementação inicial
Threads Java
Fibers Windows
Implementadas no sistema operativo, e invocadas através de uma API específica que utiliza os system calls
Linux
Windows XP/2000
Solaris
Mac OS X
Frequentemente, a mesma biblioteca de threads pode suportar as duas implementações, com desempenhos diferentes
Threads POSIX (pthreads)
4.11 Lições de Sistemas Operativos
As pthreads
Uma API standard POSIX (IEEE 1003.1c) para a criação de
threads e sua sincronização
A API especifica o comportamento da biblioteca de threads, a
implementação é da responsabilidade da biblioteca
Comum aos sistemas UNIX (Solaris, Linux, Mac OS X)
Alguns métodos:
pthread_create: criação de uma thread
pthread_join: espera que uma thread acabe
pthread_exit: finalização da thread
pthread_mutex_init: criação de um mutex
pthread_mutex_lock: aquisição do mutex
pthread_mutex_try_lock: aquisição não bloqueante
pthread_mutex_unlock: libertação do mutex
4.12 Lições de Sistemas Operativos
Exemplo:
Criação das threads
Código da thread
Espera
4.13 Lições de Sistemas Operativos
Exemplo: Chat
Objectivo:
Pretende-se realizar uma aplicação que permita a dois
processos comunicarem em modo conversacional (chat)
Utilizando dois FIFOs para comunicar
Funcionalidades de cada processo
Ler o teclado e escrever no FIFO1
Ler o FIFO2 e escrever no terminal
Não deve bloquear, permitindo enviar e receber dados
simultaneamente
São dadas 4 rotinas
readKeyboard
writeTerminal
receiveBytes
sendBytes
4.14 Lições de Sistemas Operativos
P0 P1
writeTerminal writeTerminal
readKeyboard readKeyboard
sendBytes
receiveBytes
sendBytes
receiveBytes fifoOne fifoTwo
Chat: 1ª Solução
Funciona?
4.15 Lições de Sistemas Operativos
P0 P1
writeTerminal writeTerminal
readKeyboard readKeyboard
sendBytes sendBytes
receiveBytes receiveBytes fifoOne fifoTwo
Chat: 2ª Solução
Funciona!!
4.16 Lições de Sistemas Operativos
Problemas de Threading
Semântica dos system calls fork() e exec()
Cancelamento de Threads
Gestão de Sinais
Pools de Threads
Estruturas de controlo das threads
4.17 Lições de Sistemas Operativos
Semantica de fork() e exec()
Será que fork() deve duplicar todas as threads de um processo, ou
só aquela que invocou o system call ?
Se o processo invoca exec(), não é necessário duplicar as
threads pois o novo processo vai carregar código diferente
Se o processo continua a sua execução normal, deve ser
idêntico ao processo pai, incluindo no número de threads
Muitos sistemas (ex. Linux, Solaris) têm duas versões de fork()
uma que duplica as threads, outra que não duplica (vfork, clone)
No caso de fork() seguido de exec() deve ser utilizado vfork()
Em Windows o syscall CreateProcess(), utilizado para criar e
executar um novo processo, instancia sempre uma só thread
(primary thread).
Não existe equivalente de fork()
4.18 Lições de Sistemas Operativos
Cancelamento de Threads
Cancelar uma thread antes do código ter finalizado
Ex: caso de um browser que carrega uma página usando uma thread por frame e é interrompido pelo utilizador no meio do carregamento da página
Duas aproximações possíveis:
Terminação síncrona finaliza a thread imediatamente
Pode ser problemático se uma thread se encontra no decurso de uma actualização de um recurso e pode criar problemas de coerência
Terminação deferida deixa a thread alvo verificar periodicamente se deve ser terminada
Permite que a thread detecte o facto de ter sido cancelada, e realizar as operações necessárias para o fazer de forma correcta
A thread examina a ordem de terminar nos chamados cancellation points (pthreads)
4.19 Lições de Sistemas Operativos
Gestão de Sinais
Os Sinais são utilizados em sistemas Unix para notificar um processo de
que um dado evento ocorreu
Versão utilizador dos interrupts hardware
Syscall signal (int signum, sighandler_t handler)
Um processo declara um signal handler para gerir sinais
1. Um sinal é gerado por um evento específico
2. O sinal é entregue ao processo sob forma da invocação do signal
handler
3. O sinal é gerido pelo processo
Em processos com threads: em que thread é executado o handler ?
Na thread na qual o sinal faz sentido (caso das excepções)
Em todas as threads de um processo – confuso e difícil de gerir
Estabelecer de forma explícita que threads recebem que sinais
pthread_sigmask() estabelece os sinais para cada thread
sigwait() espera pelos sinais (cancellation point)
4.20 Lições de Sistemas Operativos
Pools de Threads Criação de um número de threads por antecipação
As threads são guardadas numa pool esperando pelo
necessidade de actuarem
Vantagens:
É mais rápido servir um pedido com uma thread existente do
que criar uma nova
Permitir que o numero de threads numa aplicação seja
limitado a um número pré determinado
Em caso de necessidade a aplicação pode alocar mais
threads, caso tenha direitos para o efeito.
Pode também diminuir o número de threads na pool em
função da carga.
Exemplos
Windows: QueueUserWorkItem (Function)
Permite executar uma função por uma thread da pool
Java: packageThreadPool.java
4.21 Lições de Sistemas Operativos
Linux Threads
Em Linux, uma nova thread cria um novo fluxo de execução que partilha todos os recursos
Internamente não há distinção entre thread e processo
Implementação one-to-one
A criação de threads é feita através do syscall clone() que permite implementar fork e pthread_create
Cria um novo fluxo de execução que pode ou não partilhar todos os recursos com o precedente
No caso de partilha total, obtém-se uma nova thread no “mesmo” processo com uma nova pilha
clone(CLONE_THREAD|CLONE_VM|CLONE_FILES, …)=> pthread_create
No caso de duplicação, obtém-se um novo processo com um espaço de endereçamento copiado mas distinto
clone(SIGCHLD, …) => fork
Ambas as funcionalidades são implementadas por uma rotina comum:
do_fork()
http://lxr.linux.no/#linux+v2.6.31/kernel/fork.c#L1333
4.22 Lições de Sistemas Operativos
Estruturas de Dados em Linux
task_struct 1
thread_info 1
task_struct 2
sched.h
thread_info.h
http://lxr.linux.no/#linux+v2.6.31/include/linux/sched.h#L1166
http://lxr.linux.no/#linux+v2.6.31/arch/x86/include/asm/thread_info.h
thread_info 2
4.23 Lições de Sistemas Operativos
A Task List
~2Kbytes de memória
So
urc
e:
Lin
ux
ke
rne
l Deve
lop
me
nt, R
ob
ert L
ove
No
ve
ll Pre
ss
, 20
05
.
4.24 Lições de Sistemas Operativos
Localização da thread_struct S
ou
rce
:
Lin
ux
ke
rne
l Deve
lop
me
nt, R
ob
ert L
ove
No
ve
ll Pre
ss
, 20
05
.
4.25 Lições de Sistemas Operativos
Threads Windows
Implementação one-to-one
Cada descritor de thread contém:
Um identificador: thread id
Cópia dos registos
2 pilhas: utilizador e supervisor
Dados privados
Os registos, as pilhas e os dados privados são designados
pelo contexto da thread
As estruturas de dados de uma thread incluem:
ETHREAD (executive thread block)
KTHREAD (kernel thread block)
TEB (thread environment block)
4.26 Lições de Sistemas Operativos
Arquitectura do Windows NT
Processor(s) Main Memory Devices
Libraries
Process
Process
Process
Subsystem User
Supervisor
Subsystem Subsystem
Hardware Abstraction Layer
NT Kernel
NT Executive
I/O Subsystem
T T
T
T T T T T
T
Process Management
Memory Management
File Management
Device Mgmt Infrastructure
Source: Operating Systems, Gary Nutt
Copyright © 2004 Pearson Education, Inc.
4.27 Lições de Sistemas Operativos
Criação de Processos no NT
CreateProcess(…);
Win32 Subsystem
ntCreateProcess(…);
…
ntCreateThread(…);
NT Executive
NT Kernel
…
Handle Table
Process Descriptor
Source: Operating Systems, Gary Nutt
Copyright © 2004 Pearson Education, Inc.
4.28 Lições de Sistemas Operativos
Estruturas de Dados em XP
As estruturas de dados de uma thread incluem:
ETHREAD (executive thread block)
KTHREAD (kernel thread block)
TEB (thread environment block)
So
urc
e: O
pe
ratin
g S
ys
tem
s, G
ary
Nu
tt
Co
pyrig
ht ©
20
04
Pe
ars
on
Ed
uc
atio
n, In
c.
4.29 Lições de Sistemas Operativos
ETHREAD
Windows NT Thread Descriptor
EPROCESS
KPROCESS
NT Kernel
KTHREAD
NT Executive
Source: Operating Systems, Gary Nutt
Copyright © 2004 Pearson Education, Inc.
4.30 Lições de Sistemas Operativos
API Threads do Windows
http://msdn2.microsoft.com/en-us/library/ms684847.aspx
4.31 Lições de Sistemas Operativos
Exemplo:
4.32 Lições de Sistemas Operativos
Java Threads
As threads Java são geridas pela JVM
Podem ser criadas:
Estendendo a classe Thread
class <name> extends Thread
Implementando a interface Runnable
class <name> implements Runnable
Ver em http://www.codestyle.org/java/faq-Threads.shtml
4.33 Lições de Sistemas Operativos
Java Thread States
Fim do Capítulo