• Nenhum resultado encontrado

Sistemas Operativos: Threads

N/A
N/A
Protected

Academic year: 2021

Share "Sistemas Operativos: Threads"

Copied!
34
0
0

Texto

(1)

Sistemas Operativos: Threads

Pedro F. Souto (pfs@fe.up.pt)

(2)

Sumário

Conceito de Thread

Uso de threads

Implementação de Threads Libpthreads

Problemas da Programação com Threads Leitura Adicional

(3)

Processos em Unix

I Em Unix e SOs dele derivados, como Linux, um processo dispõ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, por omissã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 de

(4)

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.

(5)

Threads

Threads abstraiem a execução duma sequência de

instruções.

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

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

Data Text

Data Text

(6)

Processador de Texto Multithreaded

A ideia é usar um thread por tarefa.

Kernel

Keyboard 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.

(7)

Partilha de recursos com Threads

I Threadsdum mesmo processo podem partilhar a maior parte dos recursos, com excepção dastacke do estado do processador: Kernel Thread 3's stack Process Thread 3 Thread 1 Thread 2 Thread 1's stack

(8)

Estado dum Thread

I Tal como um processo, um thread pode estar num de 3 estados: running waiting ready 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);

(9)

Sumário

Conceito de Thread

Uso de threads

Implementação de Threads Libpthreads

Problemas da Programação com Threads Leitura Adicional

(10)

Uso de Threads

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

são particularmente apropriados para aplicações consistindo emactividades 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.

(11)

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 tem que ir ao disco, bloqueando.

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

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

(12)

Servidor da Web com E/S Sem Bloqueio

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

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

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

I Se a página pedida não estiver na cache, o servidor pode executar 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-seevent driven, ou baseada numafinite-state machine.

(13)

Servidor da Web com Múltiplos Threads

I Um thread, odispatcher, recebe os pedidos e passa-os a outros threads, osworker.

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

(14)

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);

(15)

Servidor da Web: Comparação

Modêlo Paralelismo Programação

Thread único Não Fácil.

Event-driven Sim Trabalhosa. Multi-threaded Sim Nem sempre fácil.

(16)

Sumário

Conceito de Thread Uso de threads

Implementação de Threads

Libpthreads

Problemas da Programação com Threads Leitura Adicional

(17)

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).

(18)

Kernel-level Threads

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

I O SO mantém umatabela de threadscom a informação especí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

(19)

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.

(20)

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ém uma tabela de threads.

I Funções que encapsulam chamadas ao sistema que podem 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?

(21)

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.

(22)

Implementação Híbrida

A ideia é multiplexar user-level threads sobre kernel-level threads

Multiple user threads on a kernel thread User space Kernel space Kernel thread Kernel

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

(23)

Sumário

Conceito de Thread Uso de threads

Implementação de Threads

Libpthreads

Problemas da Programação com Threads Leitura Adicional

(24)

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.

(25)

Funções básicas de gestão de threads

int pthread_create(pthread_t *id, ...) cria um

thread que executa a função especificada no seu argumento:

fun()

fun() fun()

pthread_create() Function invocation vs thread creation

void pthread_exit(void *value_ptr) termina o

thread ;

int pthread_join(pthread_t thread, void **value_ptr)

espera que o thread especificado no argumento threadtermine.

(26)

Execução de Programas Multithreaded

I Num programa multithreaded umthread é criadoquando: I O programa inicia: main() é executado pelothread

principal.

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

I Umthread terminase, p.ex.:

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

I executa pthread_exit().

I Umprograma multithreaded terminase, p.ex.: I O thread principal terminar (ver acima);

(27)

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 thread

criado;

*attr é uma estrutura de dados que configura o modo

de funcionamento: pode ser inicializada com valores 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 a criar.

*arg é a estrutura de dados a passar à função

(28)

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 de

pthread_create()é o endereço duma estrutura de dados contendo os argumentos da função fun().

(29)

void *fun(void *arg)

Permite definir praticamente qualquer função.

I Para evitar avisos (warnings) do gcc o mais fácil é definir um 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);

(30)

Múltiplos Threads

Normalmente applicações multithreaded usam mais do que 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])); }

(31)

Sumário

Conceito de Thread Uso de threads

Implementação de Threads Libpthreads

Problemas da Programação com Threads

(32)

Programação com Múltiplos Threads

I 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)

T

ime

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

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

(33)

Sumário

Conceito de Thread Uso de threads

Implementação de Threads Libpthreads

Problemas da Programação com Threads

(34)

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 enunciados

dos TPs):

Referências

Documentos relacionados

As recomendações energéticas e de macronutrientes e micronutrientes para pacientes com a forma leve da doença não são bem detalhadas, pois as diretri- zes concentram maior

(44) De acordo com as autoridades norueguesas, a renda paga à TS pelo Município nos termos do novo contrato de arrendamento é conforme com o mercado, e,

Deuteronômio 26:12-13 “Quando acabares de separar todos os dízimos da tua colheita no ano terceiro, que é o ano dos dízimos, então os dará ao levita, ao

5.21 - Termo de Referência: É o instrumento orientador, elaborado pelo órgão ambiental com a participação do empreendedor, que tem como finalidade estabelecer as diretrizes para a

Essas operações, com e sem risco de crédito, são contabilizadas em conta do ativo “Outros créditos de operações com planos de assistência à saúde”

Se aceitarmos os desafios da época como pauta para a configuração de uma gestão escolar com vistas a qualidade da educação, esta não poderá ser enfraquecida por nenhuma

O Serviço Autônomo de Água e Esgoto de Porto Feliz torna público, para ciência dos interessados que, por intermédio de sua Pregoeira designada pela Portaria

O PROGRAMA DE PÓS-GRADUAÇÃO EM FISIOPATOLOGIA E CIÊNCIAS CIRÚRGICAS, DA UNIVERSIDADE DO ESTADO DO RIO DE JANEIRO - UERJ torna público o presente Edital,