Sistemas Operativos: Threadspfs/aulas/so1011/at/5threads.pdf · Processos em Unix I Em Unix e SOs...

34
Sistemas Operativos: Threads Pedro F. Souto ([email protected]) March 22, 2011

Transcript of Sistemas Operativos: Threadspfs/aulas/so1011/at/5threads.pdf · Processos em Unix I Em Unix e SOs...

Page 1: Sistemas Operativos: Threadspfs/aulas/so1011/at/5threads.pdf · Processos em Unix I Em Unix e SOs dele derivados, como Linux, um processo dispõe essencialmente dum computador virtual:

Sistemas Operativos: Threads

Pedro F. Souto ([email protected])

March 22, 2011

Page 2: Sistemas Operativos: Threadspfs/aulas/so1011/at/5threads.pdf · Processos em Unix I Em Unix e SOs dele derivados, como Linux, um processo dispõe essencialmente dum computador virtual:

Sumário

Conceito de Thread

Uso de threads

Implementação de Threads

Libpthreads

Problemas da Programação com Threads

Leitura Adicional

Page 3: Sistemas Operativos: Threadspfs/aulas/so1011/at/5threads.pdf · Processos em Unix I Em Unix e SOs dele derivados, como Linux, um processo dispõe essencialmente dum computador virtual:

Processos em Unix

I Em Unix e SOs dele derivados, como Linux, um processodispõe essencialmente dum computador virtual:

I a maioria dos recursos usados por um processo éreservado para seu uso exclusivo;

I cada processo usa a sua própria memória, a qual, poromissão, não é partilhada com outros processos.

I Um processo pode ser visto como:I Uma máquina virtual para execução de programas

em vez deI Um programa em execução

Page 4: Sistemas Operativos: Threadspfs/aulas/so1011/at/5threads.pdf · Processos em Unix I Em Unix e SOs dele derivados, como Linux, um processo dispõe essencialmente dum computador virtual:

Comunicação entre Processos em Unix

I A comunicação entre processos em Unix não é fácil:I o processo pai pode passar alguma informação antes de

criar o processo filho, mas depois ...I o processo filho só pode retornar informação (e muito

limitada) ao processo pai quando termina;I sincronização entre processos só entre o pai e os seus

filhos.I Suporte de memória partilhada entre processos pelo SO:

+ facilita a cooperação entre processos;− não é muito conveniente de usar;− é relativamente ineficiente, já que requer a intervenção do

SO para sincronização.

Page 5: Sistemas Operativos: Threadspfs/aulas/so1011/at/5threads.pdf · Processos em Unix I Em Unix e SOs dele derivados, como Linux, um processo dispõe essencialmente dum computador virtual:

Threads

Threads abstraiem a execução duma sequência deinstruções.

Grosso modo, enquanto que um processo corre-sponde à execução dum programa, um thread cor-responde à execução duma função.

I Em SOs mais recentes, um processo pode incluir mais doque um thread.

Data

Text

Data

Text

Page 6: Sistemas Operativos: Threadspfs/aulas/so1011/at/5threads.pdf · Processos em Unix I Em Unix e SOs dele derivados, como Linux, um processo dispõe essencialmente dum computador virtual:

Processador de Texto MultithreadedA ideia é usar um thread por tarefa.

KernelKeyboard Disk

Four score and seven years ago, our fathers brought forth upon this continent a new nation: conceived in liberty, and dedicated to the proposition that all men are created equal. Now we are engaged in a great civil war testing whether that

nation, or any nation so conceived and so dedicated, can long endure. We are met on a great battlefield of that war. We have come to dedicate a portion of that field as a final resting place for those who here gave their

lives that this nation might live. It is altogether fitting and proper that we should do this. But, in a larger sense, we cannot dedicate, we cannot consecrate we cannot hallow this ground. The brave men, living and dead,

who struggled here have consecrated it, far above our poor power to add or detract. The world will little note, nor long remember, what we say here, but it can never forget what they did here. It is for us the living, rather, to be dedicated

here to the unfinished work which they who fought here have thus far so nobly advanced. It is rather for us to be here dedicated to the great task remaining before us, that from these honored dead we take increased devotion to that cause for which

they gave the last full measure of devotion, that we here highly resolve that these dead shall not have died in vain that this nation, under God, shall have a new birth of freedom and that government of the people by the people, for the people

1. Um thread para interagir com o utilizador (teclado e rato);2. Um thread para formatar o texto (em background);3. Um thread para guardar o ficheiro periodicamente no

disco.

Page 7: Sistemas Operativos: Threadspfs/aulas/so1011/at/5threads.pdf · Processos em Unix I Em Unix e SOs dele derivados, como Linux, um processo dispõe essencialmente dum computador virtual:

Partilha de recursos com Threads

I Threads dum mesmo processo podem partilhar a maiorparte dos recursos, com excepção da stack e do estado doprocessador:

Kernel

Thread 3's stack

Process

Thread 3Thread 1

Thread 2

Thread 1's stack

Page 8: Sistemas Operativos: Threadspfs/aulas/so1011/at/5threads.pdf · Processos em Unix I Em Unix e SOs dele derivados, como Linux, um processo dispõe essencialmente dum computador virtual:

Estado dum Thread

I Tal como um processo, um thread pode estar num de 3estados:

running

waitingready

1

2

3

4

I A informação específica a manter por cada thread érelativamente reduzida:

I o seu estado (pode estar bloqueado à espera dum evento);I o estado do processador (incluindo o SP e PC);I a stack.

Page 9: Sistemas Operativos: Threadspfs/aulas/so1011/at/5threads.pdf · Processos em Unix I Em Unix e SOs dele derivados, como Linux, um processo dispõe essencialmente dum computador virtual:

Sumário

Conceito de Thread

Uso de threads

Implementação de Threads

Libpthreads

Problemas da Programação com Threads

Leitura Adicional

Page 10: Sistemas Operativos: Threadspfs/aulas/so1011/at/5threads.pdf · Processos em Unix I Em Unix e SOs dele derivados, como Linux, um processo dispõe essencialmente dum computador virtual:

Uso de Threads

I Threads dum mesmo processo podem partilhar muitosrecursos, incluindo o espaço de endereçamento:

são particularmente apropriados para aplicaçõesconsistindo em actividades concorrentes.

I P.ex. servidor da Web:I Recebe e processa pedidos de páginas da Web.I As páginas da Web são ficheiros guardados em disco.I Mantém as páginas acedidas mais recentemente em

memória, cache.I Se a página pedida não estiver na cache, o servidor tem

que ir ao disco.

Page 11: Sistemas Operativos: Threadspfs/aulas/so1011/at/5threads.pdf · Processos em Unix I Em Unix e SOs dele derivados, como Linux, um processo dispõe essencialmente dum computador virtual:

Servidor da Web com um Único Thread

while( TRUE ) {get_next_request(&buf);lookup_page_in_cache(buf, &page);if( page == NULL )

read_page_from_disk(buf, &page);send_page(page);

}

I Se a página pedida não estiver na cache, o servidor temque ir ao disco, bloqueando.

I Enquanto a página não fôr trazida para memória, oservidor não pode processar outros pedidos.

I O número de pedidos que este servidor pode processarpor unidade de tempo é muito baixo.

Page 12: Sistemas Operativos: Threadspfs/aulas/so1011/at/5threads.pdf · Processos em Unix I Em Unix e SOs dele derivados, como Linux, um processo dispõe essencialmente dum computador virtual:

Servidor da Web com E/S Sem Bloqueio

I Alguns SOs suportam chamadas ao sistema de E/S quenão bloqueiam o processo que as invoca. Posteriormente:

I o processo pode interrogar o kernel sobre a conclusão daoperação (non-blocking I/O);

I alternativamente, o kernel pode notificar o processo daconclusão da operação (asynchronous I/O).

I Se a página pedida não estiver na cache, o servidor podeexecutar uma operação de E/S sem-bloqueio/assíncrona.

I Depois, pode receber e processar a mensagem seguinte.I O servidor tem que manter informação sobre o estado de

processamento de cada pedido pendente.I Este tipo de solução diz-se event driven, ou baseada

numa finite-state machine.

Page 13: Sistemas Operativos: Threadspfs/aulas/so1011/at/5threads.pdf · Processos em Unix I Em Unix e SOs dele derivados, como Linux, um processo dispõe essencialmente dum computador virtual:

Servidor da Web com Múltiplos ThreadsI Um thread, o dispatcher , recebe os pedidos e passa-os a

outros threads, os worker .I Cada worker thread processa um pedido de cada vez:

pode usar operações de E/S que bloqueiem.

Dispatcher thread

Worker thread

Web page cache

Kernel

Network connection

Web server process

User space

Kernel space

Page 14: Sistemas Operativos: Threadspfs/aulas/so1011/at/5threads.pdf · Processos em Unix I Em Unix e SOs dele derivados, como Linux, um processo dispõe essencialmente dum computador virtual:

Servidor da Web com Múltiplos Threads

I Código do dispatcher thread :while( TRUE ) {

get_next_request(&buf);handoff_work(buf);

}

I Código dos worker threads:while( TRUE ) {

wait_for_work(&buf);lookup_page_in_cache(buf, &page);if( page == NULL )

read_page_from_disk(buf, &page);send_page(page);

}

Page 15: Sistemas Operativos: Threadspfs/aulas/so1011/at/5threads.pdf · Processos em Unix I Em Unix e SOs dele derivados, como Linux, um processo dispõe essencialmente dum computador virtual:

Servidor da Web: Comparação

Modêlo Paralelismo ProgramaçãoThread único Não Fácil.Event-driven Sim Trabalhosa.Multi-threaded Sim Nem sempre fácil.

Page 16: Sistemas Operativos: Threadspfs/aulas/so1011/at/5threads.pdf · Processos em Unix I Em Unix e SOs dele derivados, como Linux, um processo dispõe essencialmente dum computador virtual:

Sumário

Conceito de Thread

Uso de threads

Implementação de Threads

Libpthreads

Problemas da Programação com Threads

Leitura Adicional

Page 17: Sistemas Operativos: Threadspfs/aulas/so1011/at/5threads.pdf · Processos em Unix I Em Unix e SOs dele derivados, como Linux, um processo dispõe essencialmente dum computador virtual:

Implementação de threads

I Threads podem ser implementados:1. directamente pelo SO (kernel-level threads);2. por código que executa em user-level, i.e. acima do SO,

(user-level threads).

Page 18: Sistemas Operativos: Threadspfs/aulas/so1011/at/5threads.pdf · Processos em Unix I Em Unix e SOs dele derivados, como Linux, um processo dispõe essencialmente dum computador virtual:

Kernel-level Threads

I O kernel suporta processos com múltiplos threads:os threads são as “entidades” que disputam oCPU.

I O SO mantém uma tabela de threads com a informaçãoespecífica a cada thread.

I O PCB dum processo aponta para a sua tabela de threads.I Todas as operações de gestão de threads, p.ex. criar um

thread, requerem a execução de chamadas ao sistema.

Page 19: Sistemas Operativos: Threadspfs/aulas/so1011/at/5threads.pdf · Processos em Unix I Em Unix e SOs dele derivados, como Linux, um processo dispõe essencialmente dum computador virtual:

User-level Threads

I O kernel não sabe da existência dos threads:I são implementados inteiramente por uma biblioteca em

user-space;I podem ser implementados num SO que não suporta

threads.

Page 20: Sistemas Operativos: Threadspfs/aulas/so1011/at/5threads.pdf · Processos em Unix I Em Unix e SOs dele derivados, como Linux, um processo dispõe essencialmente dum computador virtual:

Implementação de User-level Threads

I A biblioteca de threads oferece funções que permitem:I criar/terminar threads;I sincronizar entre threads;I ceder o CPU a outros threads (yield);

I A biblioteca executa a comutação entre threads e mantémuma tabela de threads.

I Funções que encapsulam chamadas ao sistema quepodem bloquear têm que ser alteradas:

para evitar que todos os threads bloqueiem.I Algumas dificuldades:

I como executar chamadas ao sistema sem bloquear?I e page-faults?I como evitar que um thread monopolize o CPU?

Page 21: Sistemas Operativos: Threadspfs/aulas/so1011/at/5threads.pdf · Processos em Unix I Em Unix e SOs dele derivados, como Linux, um processo dispõe essencialmente dum computador virtual:

User-level vs. Kernel-level Threads

+ O SO não precisa suportar threads.+ Evita a intervenção do kernel em muitas operações, p.ex.

criação/terminação de threads e comutação de threads.− Page-fault por um thread bloqueia os restantes threads do

processo.− Incapazes de explorar paralelismo em arquitecturas

multiprocessador.

Page 22: Sistemas Operativos: Threadspfs/aulas/so1011/at/5threads.pdf · Processos em Unix I Em Unix e SOs dele derivados, como Linux, um processo dispõe essencialmente dum computador virtual:

Implementação HíbridaA ideia é multiplexar user-level threads sobre kernel-level

threads

Multiple user threads on a kernel thread

User space

Kernel spaceKernel threadKernel

I O kernel não está a par dos user-level threads.I A biblioteca de user-level threads atribui estes aos

kernel-level threads.

Page 23: Sistemas Operativos: Threadspfs/aulas/so1011/at/5threads.pdf · Processos em Unix I Em Unix e SOs dele derivados, como Linux, um processo dispõe essencialmente dum computador virtual:

Sumário

Conceito de Thread

Uso de threads

Implementação de Threads

Libpthreads

Problemas da Programação com Threads

Leitura Adicional

Page 24: Sistemas Operativos: Threadspfs/aulas/so1011/at/5threads.pdf · Processos em Unix I Em Unix e SOs dele derivados, como Linux, um processo dispõe essencialmente dum computador virtual:

libpthread (pthreads)

I Biblioteca de threads especificada em POSIX:A sua utilização promove portabilidade do código.

I Esta biblioteca pode ser implementada usando:I kernel-level threads, p.ex. a biblioteca distribuída com

Linux;I user-level threads, p.ex. algumas bibliotecas disponíveis

para Linux;I usando ambos tipos de threads, p.ex. a biblioteca

distribuída com Solaris.

Page 25: Sistemas Operativos: Threadspfs/aulas/so1011/at/5threads.pdf · Processos em Unix I Em Unix e SOs dele derivados, como Linux, um processo dispõe essencialmente dum computador virtual:

Funções básicas de gestão de threadsint pthread_create(pthread_t *id, ...) cria um

thread que executa a função especificada no seuargumento:

fun()

fun() fun()

pthread_create()

Function invocation vs thread creation

void pthread_exit(void *value_ptr) termina othread ;

int pthread_join(pthread_t thread, void **value_ptr)espera que o thread especificado no argumentothread termine.

Page 26: Sistemas Operativos: Threadspfs/aulas/so1011/at/5threads.pdf · Processos em Unix I Em Unix e SOs dele derivados, como Linux, um processo dispõe essencialmente dum computador virtual:

Execução de Programas Multithreaded

I Num programa multithreaded um thread é criado quando:I O programa inicia: main() é executado pelo thread

principal .I Quando da invocação de pthread_create(): todos os

outros threads.I Um thread termina se, p.ex.:

I retorna da função inicial que executou (argumento depthread_create() ou main());

I executa pthread_exit().I Um programa multithreaded termina se, p.ex.:

I O thread principal terminar (ver acima);I Qualquer thread invocar a chamada ao sistema _exit().

Page 27: Sistemas Operativos: Threadspfs/aulas/so1011/at/5threads.pdf · Processos em Unix I Em Unix e SOs dele derivados, como Linux, um processo dispõe essencialmente dum computador virtual:

pthread_create()

int pthread_create(pthread_t *id,const pthread_att_t attr,void *(*start_fn)(void *), void *arg)

onde:

*id será inicializado com a identidade do threadcriado;

*attr é uma estrutura de dados que configura o modode funcionamento: pode ser inicializada comvalores por omissão usando:

int pthread_attr_init(pthread_attr_t *attr)

*start_fn uma função com o seguinte protótipo:void *thr_fun(void *)

que é a primeira função executada pelo thread acriar.

*arg é a estrutura de dados a passar à funçãothr_fun().

Page 28: Sistemas Operativos: Threadspfs/aulas/so1011/at/5threads.pdf · Processos em Unix I Em Unix e SOs dele derivados, como Linux, um processo dispõe essencialmente dum computador virtual:

pthread_create(): exemplo

#include <pthread.h>void *fun(void *arg) { /* Actually the ar- */

... /* gument is not used */}

...pthread_attr_t attr;pthread_t tid;...pthread_attr_init(&attr); /* Initialize attr with

* default values */pthread_create(&tid, &attr, fun, NULL);...

I No caso geral, o último argumento depthread_create() é o endereço duma estrutura dedados contendo os argumentos da função fun().

Page 29: Sistemas Operativos: Threadspfs/aulas/so1011/at/5threads.pdf · Processos em Unix I Em Unix e SOs dele derivados, como Linux, um processo dispõe essencialmente dum computador virtual:

void *fun(void *arg)

Permite definir praticamente qualquer função.

I Para evitar avisos (warnings) do gcc o mais fácil é definirum tipo de apontador para uma função.

#include <pthread.h>typedef void *(thr_fun_t)(void *arg);

int *fun(int *arg) {...

}...pthread_attr_t attr;pthread_t tid;int thr_arg;...pthread_attr_init(&attr); /* Initialize attr */pthread_create(&tid, &attr, (thr_fun_t *) fun,

(void *)&thr_arg);...

Page 30: Sistemas Operativos: Threadspfs/aulas/so1011/at/5threads.pdf · Processos em Unix I Em Unix e SOs dele derivados, como Linux, um processo dispõe essencialmente dum computador virtual:

Múltiplos ThreadsNormalmente applicações multithreaded usam mais doque 2 threads

I É necessário alocar variáveis diferentes para cada thread.

#include <pthread.h>#define T 3 /* number of threads */typedef void *(thr_fun_t)(void *arg);

...pthread_attr_t attr[T];pthread_t tid[T];int thr_arg[T];...for( i = 0; i < T; i++ ) {

pthread_attr_init(&attr); /* Initialize attr */pthread_create(&(tid[i]), &(attr[i]),

(thr_fun_t *) fun,(void *)&(thr_arg[i]));

}...

Page 31: Sistemas Operativos: Threadspfs/aulas/so1011/at/5threads.pdf · Processos em Unix I Em Unix e SOs dele derivados, como Linux, um processo dispõe essencialmente dum computador virtual:

Sumário

Conceito de Thread

Uso de threads

Implementação de Threads

Libpthreads

Problemas da Programação com Threads

Leitura Adicional

Page 32: Sistemas Operativos: Threadspfs/aulas/so1011/at/5threads.pdf · Processos em Unix I Em Unix e SOs dele derivados, como Linux, um processo dispõe essencialmente dum computador virtual:

Programação com Múltiplos ThreadsI Código escrito para processos com um único thread

raramente funciona correctamente com múltiplos threads:I variáveis globais:

Thread 1 Thread 2

Access (errno set)

Errno inspected

Open (errno overwritten)

Tim

e

I funções não reentrantes;I concorrência (race conditions).

I Esta observação aplica-se também a código dasbibliotecas, incluindo a “C standard library”:

Com gcc, deve usar-se a opção -D_REENTRANT

Page 33: Sistemas Operativos: Threadspfs/aulas/so1011/at/5threads.pdf · Processos em Unix I Em Unix e SOs dele derivados, como Linux, um processo dispõe essencialmente dum computador virtual:

Sumário

Conceito de Thread

Uso de threads

Implementação de Threads

Libpthreads

Problemas da Programação com Threads

Leitura Adicional

Page 34: Sistemas Operativos: Threadspfs/aulas/so1011/at/5threads.pdf · Processos em Unix I Em Unix e SOs dele derivados, como Linux, um processo dispõe essencialmente dum computador virtual:

Leitura Adicional

I Secção 2.2 de Modern Operating Systems, 2nd Ed.I Secções 3.5 e 3.6.4 de

José Alves Marques e outros, Sistemas Operativos,FCA - Editora Informática, 2009

I Outra documentação (transparências e enunciadosdos TPs):http://web.fe.up.pt/~pfs/aulas/so1011/