39
Threads Aula 15

Threads Aula 15. Prof. José Gonçalves - DI/UFES Sist. Operacionais - 2003/2 Fluxos de Execução Um programa seqüencial consiste de um único fluxo de execução,

Embed Size (px)

Citation preview

Page 1: Threads Aula 15. Prof. José Gonçalves - DI/UFES Sist. Operacionais - 2003/2 Fluxos de Execução Um programa seqüencial consiste de um único fluxo de execução,

Threads

Aula 15

Page 2: Threads Aula 15. Prof. José Gonçalves - DI/UFES Sist. Operacionais - 2003/2 Fluxos de Execução Um programa seqüencial consiste de um único fluxo de execução,

Prof. José Gonçalves - DI/UFESSist. Operacionais - 2003/2

Fluxos de Execução

Um programa seqüencial consiste de um único fluxo de execução, o qual realiza uma certa tarefa computacional. A maioria dos programas simples tem essa

característica: só possuem um único fluxo de execução. Por conseguinte, não executam dois trechos de código “simultaneamente”.

Grande parte do software de maior complexidade escrito hoje em dia faz uso de mais de uma linha de execução.

Page 3: Threads Aula 15. Prof. José Gonçalves - DI/UFES Sist. Operacionais - 2003/2 Fluxos de Execução Um programa seqüencial consiste de um único fluxo de execução,

Prof. José Gonçalves - DI/UFESSist. Operacionais - 2003/2

Exemplos de Programas

Navegador (browser) Consegue fazer o download de vários arquivos ao

mesmo tempo, gerenciando as diferentes velocidades de cada servidor e, ainda assim, permitindo que o usuário continue interagindo, mudando de página enquanto os arquivos estão sendo carregados.

Editor de textos Permite que o usuário edite o arquivo enquanto ele

ainda está sendo carregado do disco. Processamento assíncrono (salvamento periódico)

Page 4: Threads Aula 15. Prof. José Gonçalves - DI/UFES Sist. Operacionais - 2003/2 Fluxos de Execução Um programa seqüencial consiste de um único fluxo de execução,

Prof. José Gonçalves - DI/UFESSist. Operacionais - 2003/2

Threads

Thread = “linha”, “fio”. Threads = fluxos de execução que rodam dentro

de um processo. Seqüência de instruções a serem executadas dentro de

um programa.

Thread é uma abstração que permite que uma aplicação execute mais de um trecho de código (ex: mais de um método) simultaneamente. Processos permitem ao S.O. executar mais de uma

aplicação ao mesmo tempo.

Page 5: Threads Aula 15. Prof. José Gonçalves - DI/UFES Sist. Operacionais - 2003/2 Fluxos de Execução Um programa seqüencial consiste de um único fluxo de execução,

Prof. José Gonçalves - DI/UFESSist. Operacionais - 2003/2

Threads e Processos (1)

Existem duas características fundamentais que são usualmente tratadas de forma independente pelo S.O.: Propriedade de recursos (“resource ownership”); Escalonamento (“scheduling / dispatching”).

Propriedade de recursos: Trata dos recursos alocados aos processos, e que são

necessários para a sua execução. Ex: a um processo é alocado um espaço de endereçamento virtual para manter a sua imagem. De de tempos em tempos, o processo pode requerer mais memória, controlar arquivos, requerer dispositivos de E/S, etc.

Page 6: Threads Aula 15. Prof. José Gonçalves - DI/UFES Sist. Operacionais - 2003/2 Fluxos de Execução Um programa seqüencial consiste de um único fluxo de execução,

Prof. José Gonçalves - DI/UFESSist. Operacionais - 2003/2

Threads e Processos (2)

Escalonamento: Relacionado à unidade de despacho do S.O. Determina o fluxo de execução (trecho de código) que é

executado pela CPU. Tradicionalmente, processo está associado a um

programa em execução e a um conjunto de recursos.

Em um ambiente com threads, processos estão associados somente à propriedade de recursos e threads às atividades de execução (i.e., threads constituem as unidades de despacho).

Page 7: Threads Aula 15. Prof. José Gonçalves - DI/UFES Sist. Operacionais - 2003/2 Fluxos de Execução Um programa seqüencial consiste de um único fluxo de execução,

Prof. José Gonçalves - DI/UFESSist. Operacionais - 2003/2

Threads e Processos (3)

Page 8: Threads Aula 15. Prof. José Gonçalves - DI/UFES Sist. Operacionais - 2003/2 Fluxos de Execução Um programa seqüencial consiste de um único fluxo de execução,

Prof. José Gonçalves - DI/UFESSist. Operacionais - 2003/2

Multithreading (1)

S.O. multithreading permitem múltiplas threads de execução em um único processo.

MS-DOS: Suporta uma única thread.

Unix “standard”: Suporta múltiplos processos mas apenas uma thread

por processo.

Windows 2000, Linux, Solaris,OS/2, Mach: Suportam múltiplas threads por processo.

Page 9: Threads Aula 15. Prof. José Gonçalves - DI/UFES Sist. Operacionais - 2003/2 Fluxos de Execução Um programa seqüencial consiste de um único fluxo de execução,

Prof. José Gonçalves - DI/UFESSist. Operacionais - 2003/2

Multithreading (2)

Em um ambiente multithreaded, um processo:é a unidade de alocação e proteção de

recursos; tem um espaço de endereçamento virtual que

mantém a imagem do processo; tem acesso controlado a outros processos,

arquivos e outros recursos.

Page 10: Threads Aula 15. Prof. José Gonçalves - DI/UFES Sist. Operacionais - 2003/2 Fluxos de Execução Um programa seqüencial consiste de um único fluxo de execução,

Prof. José Gonçalves - DI/UFESSist. Operacionais - 2003/2

Multithreading (3)

Já uma thread apresenta:um estado de execução (pronta, bloqueada,...).um contexto salvo quando não estiver

executando.uma pilha de execução.acesso a variáveis locais próprias.acesso compartilhado com outras threads do

processo aos recursos do mesmo.

Page 11: Threads Aula 15. Prof. José Gonçalves - DI/UFES Sist. Operacionais - 2003/2 Fluxos de Execução Um programa seqüencial consiste de um único fluxo de execução,

Prof. José Gonçalves - DI/UFESSist. Operacionais - 2003/2

Processos Mono e Multithreaded (1)

Page 12: Threads Aula 15. Prof. José Gonçalves - DI/UFES Sist. Operacionais - 2003/2 Fluxos de Execução Um programa seqüencial consiste de um único fluxo de execução,

Prof. José Gonçalves - DI/UFESSist. Operacionais - 2003/2

Processos Mono e Multithreaded (2)

Page 13: Threads Aula 15. Prof. José Gonçalves - DI/UFES Sist. Operacionais - 2003/2 Fluxos de Execução Um programa seqüencial consiste de um único fluxo de execução,

Prof. José Gonçalves - DI/UFESSist. Operacionais - 2003/2

Processos Mono e Multithreaded (3)

serv serv

processo 1

tempo

pedidoRPC

pedidoRPC

serv

serv

thread A

thread B

(processo 1)

pedidoRPC

pedidoRPC

executando

bloqueado(a)

Page 14: Threads Aula 15. Prof. José Gonçalves - DI/UFES Sist. Operacionais - 2003/2 Fluxos de Execução Um programa seqüencial consiste de um único fluxo de execução,

Prof. José Gonçalves - DI/UFESSist. Operacionais - 2003/2

Benefícios das Threads

É mais rápido criar uma thread do que um processo.

É mais rápido terminar uma thread que um processo.

É mais rápido chavear entre threads de um mesmo processo do que entre processos.

Threads podem se comunicar sem invocar o núcleo já que compartilham memória e arquivos.

Permite paralelismo de atividades e melhor organização do programa.

Page 15: Threads Aula 15. Prof. José Gonçalves - DI/UFES Sist. Operacionais - 2003/2 Fluxos de Execução Um programa seqüencial consiste de um único fluxo de execução,

Prof. José Gonçalves - DI/UFESSist. Operacionais - 2003/2

Estados de uma Thread

Estados fundamentais: executando, pronta e bloqueada

O que acontece com as threads de um processo quando uma delas bloqueia?

Suspender um processo implica em suspender todas as threads deste processo.

O término de um processo implica no término de todas as threads do processo.

Page 16: Threads Aula 15. Prof. José Gonçalves - DI/UFES Sist. Operacionais - 2003/2 Fluxos de Execução Um programa seqüencial consiste de um único fluxo de execução,

Prof. José Gonçalves - DI/UFESSist. Operacionais - 2003/2

Java Threads States

Page 17: Threads Aula 15. Prof. José Gonçalves - DI/UFES Sist. Operacionais - 2003/2 Fluxos de Execução Um programa seqüencial consiste de um único fluxo de execução,

Prof. José Gonçalves - DI/UFESSist. Operacionais - 2003/2

Tipos de Threads

A implementação de threads pode ser feita em um dos seguintes níveis:Nível de usuário: user-level threads Nível de kernel: kernel-level threads

Page 18: Threads Aula 15. Prof. José Gonçalves - DI/UFES Sist. Operacionais - 2003/2 Fluxos de Execução Um programa seqüencial consiste de um único fluxo de execução,

Prof. José Gonçalves - DI/UFESSist. Operacionais - 2003/2

User-level Threads (1)

O gerenciamento das threads é feito pela aplicação

O núcleo desconhece a existência de threads.

O chaveamento entre threads não requer privilégio de modo kernel; isso elimina o gasto de dois chaveamentos de modo.

O escalonamento é feito pela aplicação

Page 19: Threads Aula 15. Prof. José Gonçalves - DI/UFES Sist. Operacionais - 2003/2 Fluxos de Execução Um programa seqüencial consiste de um único fluxo de execução,

Prof. José Gonçalves - DI/UFESSist. Operacionais - 2003/2

User-level Threads (2)

São implementadas através de bibliotecas (executam em qualquer S.O.).

Chamada ao sistema bloqueia todas as threads de um processo.

Não aproveita os benefícios do multiprocessamento.

Exemplos: POSIX Pthreads, Mach C-threads e Solaris

threads.

Page 20: Threads Aula 15. Prof. José Gonçalves - DI/UFES Sist. Operacionais - 2003/2 Fluxos de Execução Um programa seqüencial consiste de um único fluxo de execução,

Prof. José Gonçalves - DI/UFESSist. Operacionais - 2003/2

User-level Threads (3)

espaço dousuário

espaço donúcleo

bibliotecade threads

P

P Processothreadnível usuário

Page 21: Threads Aula 15. Prof. José Gonçalves - DI/UFES Sist. Operacionais - 2003/2 Fluxos de Execução Um programa seqüencial consiste de um único fluxo de execução,

Prof. José Gonçalves - DI/UFESSist. Operacionais - 2003/2

Kernel-level Threads (1)

O gerenciamento das threads é feito pelo kernel.

O kernel mantém a informação de contexto para processo e threads.

O chaveamento das threads é feito pelo núcleo (escalonamento “thread-basis”).

O bloqueio de uma thread não implica no bloqueio das outras threads do processo.

Page 22: Threads Aula 15. Prof. José Gonçalves - DI/UFES Sist. Operacionais - 2003/2 Fluxos de Execução Um programa seqüencial consiste de um único fluxo de execução,

Prof. José Gonçalves - DI/UFESSist. Operacionais - 2003/2

Kernel-level Threads (2)

As threads podem aproveitar a capacidade de multiprocessamento.

O usuário enxerga uma API para threads do núcleo; porém a transferência de controle entre threads de um mesmo processo requer chaveamento para modo kernel.

Windows 2K, Linux e OS/2 são exemplos desta abordagem.

Page 23: Threads Aula 15. Prof. José Gonçalves - DI/UFES Sist. Operacionais - 2003/2 Fluxos de Execução Um programa seqüencial consiste de um único fluxo de execução,

Prof. José Gonçalves - DI/UFESSist. Operacionais - 2003/2

Kernel-level Threads (3)

espaço dousuário

espaço donúcleo

P

threadnível núcleo

threadnível usuário

P Processo

Page 24: Threads Aula 15. Prof. José Gonçalves - DI/UFES Sist. Operacionais - 2003/2 Fluxos de Execução Um programa seqüencial consiste de um único fluxo de execução,

Prof. José Gonçalves - DI/UFESSist. Operacionais - 2003/2

Combinando Modos (Solaris)

espaço dousuário

espaço donúcleo

P

threadnível núcleo

threadnível usuário

P Processo P

bibliotecade threads

Page 25: Threads Aula 15. Prof. José Gonçalves - DI/UFES Sist. Operacionais - 2003/2 Fluxos de Execução Um programa seqüencial consiste de um único fluxo de execução,

Prof. José Gonçalves - DI/UFESSist. Operacionais - 2003/2

Comparando AbordagensLatências de operação (s)

Operação Threads:

nível usuário Threads:

nível núcleo Processos

Fork nulo 34 948 11.300 Signal-wait 37 441 1.840

Obs.:

1. VAX monoprocessador executando SO tipo Unix 2. chamada de procedimento neste VAX: 7s 3. trap ao núcleo: 17s

Page 26: Threads Aula 15. Prof. José Gonçalves - DI/UFES Sist. Operacionais - 2003/2 Fluxos de Execução Um programa seqüencial consiste de um único fluxo de execução,

Prof. José Gonçalves - DI/UFESSist. Operacionais - 2003/2

User-level e Kernel-level Threads

Page 27: Threads Aula 15. Prof. José Gonçalves - DI/UFES Sist. Operacionais - 2003/2 Fluxos de Execução Um programa seqüencial consiste de um único fluxo de execução,

Prof. José Gonçalves - DI/UFESSist. Operacionais - 2003/2

Modelo Muitos-para-Um Muitas user-

level threads mapeadas em uma única kernel thread.

Modelo usado em sistemas que não suportam kernel threads.

Page 28: Threads Aula 15. Prof. José Gonçalves - DI/UFES Sist. Operacionais - 2003/2 Fluxos de Execução Um programa seqüencial consiste de um único fluxo de execução,

Prof. José Gonçalves - DI/UFESSist. Operacionais - 2003/2

Modelo Um-para-Um Cada user-level thread é mapeada em uma

única kernel thread. Exemplos: Windows 95/98/NT/2000 e OS/2

Page 29: Threads Aula 15. Prof. José Gonçalves - DI/UFES Sist. Operacionais - 2003/2 Fluxos de Execução Um programa seqüencial consiste de um único fluxo de execução,

Prof. José Gonçalves - DI/UFESSist. Operacionais - 2003/2

Modelo Muitos-para-Muitos Permite que diferentes

user-level threads de um processo possam ser mapeadas em kernel threads distintas.

Permite ao S.O. criar um número suficiente de kernel threads.

Exemplos: Solaris 2 e Windows NT/2000 com o ThreadFiber package.

Page 30: Threads Aula 15. Prof. José Gonçalves - DI/UFES Sist. Operacionais - 2003/2 Fluxos de Execução Um programa seqüencial consiste de um único fluxo de execução,

Prof. José Gonçalves - DI/UFESSist. Operacionais - 2003/2

Pthreads API padrão POSIX (IEEE 1003.1c) para a

criação e sincronização de threads (user-level threads).

A API especifica o comportamento da biblioteca de threads (a implementação é tarefa do desenvolvedor da biblioteca).

Comum em sistemas operacionais UNIX. Ex: pacote LinuxThreads, que implementa o

padrão pthreads - http://pauillac.inria.fr/~xleroy/linuxthreads/

Page 31: Threads Aula 15. Prof. José Gonçalves - DI/UFES Sist. Operacionais - 2003/2 Fluxos de Execução Um programa seqüencial consiste de um único fluxo de execução,

Prof. José Gonçalves - DI/UFESSist. Operacionais - 2003/2

Windows 2000 Threads

Implementa o modelo de mapeamento um-para-um.

Cada thread contém:

- um thread id

- um register set

- área separadas para user stack e kernel stack

- área para armazenamento de dados privados.

Page 32: Threads Aula 15. Prof. José Gonçalves - DI/UFES Sist. Operacionais - 2003/2 Fluxos de Execução Um programa seqüencial consiste de um único fluxo de execução,

Prof. José Gonçalves - DI/UFESSist. Operacionais - 2003/2

Linux Threads No Linux as threads são referenciadas como

tasks (tarefas). A criação de threads é feita através da SVC

(chamada ao sistema) clone(). Clone() permite à tarefa filha compartilhar o

mesmo espaço de endereçamento que a tarefa pai (processo).

Page 33: Threads Aula 15. Prof. José Gonçalves - DI/UFES Sist. Operacionais - 2003/2 Fluxos de Execução Um programa seqüencial consiste de um único fluxo de execução,

Prof. José Gonçalves - DI/UFESSist. Operacionais - 2003/2

Java Threads Threads em Java podem ser criadas das

seguintes maneiras:Estendendo a classe Thread Implementando a interface Runnable.

As threads Java são gerenciadas pela JVM.

Page 34: Threads Aula 15. Prof. José Gonçalves - DI/UFES Sist. Operacionais - 2003/2 Fluxos de Execução Um programa seqüencial consiste de um único fluxo de execução,

Prof. José Gonçalves - DI/UFESSist. Operacionais - 2003/2

Processos e Threads no Unix (1)

Processos são criados no Unix através do comando fork().

O comando id = fork() cria um filho idêntico ao processo que executou a

chamada. O filho recebe cópia das variáveis do processo pai (cópias privativas),bem como dos descritores de arquivos.

Os valores iniciais das variáveis do filho são iguais às do pai no momento da execução do fork. A única diferença é o valor da variável id (0 para o processo filho e o valor de retorno da função fork para o processo pai).

Page 35: Threads Aula 15. Prof. José Gonçalves - DI/UFES Sist. Operacionais - 2003/2 Fluxos de Execução Um programa seqüencial consiste de um único fluxo de execução,

Prof. José Gonçalves - DI/UFESSist. Operacionais - 2003/2

Processos e Threads no Unix (2)

O valor de retorno é o número de identificação do processo criado, referido por pid (process identification). Isto permite que os processos prossigam de acordo com suas identidades. Normalmente o comando seguinte ao fork tem a seguinte

forma: if id = 0 then {processamento do filho}

else {processamento do pai}

Um dos processos pode sobrepor um novo código sobre si, através da operação exec, a qual especifica um novo segmento de código e de dados para o processo.

Page 36: Threads Aula 15. Prof. José Gonçalves - DI/UFES Sist. Operacionais - 2003/2 Fluxos de Execução Um programa seqüencial consiste de um único fluxo de execução,

Prof. José Gonçalves - DI/UFESSist. Operacionais - 2003/2

Processos e Threads no Unix (3)

Na criação de threads, o pai e o filho compartilham o mesmo espaço de endereçamento (as mesmas variáveis, os mesmos descritores de arquivos,etc.).

Simplificação: Pai e filho passam a ser descritos por um mesmo (único)

registro descritor e cada um passa a utilizar um ”mini-descritor” próprio, para conter os atributos em que diferem.

Diminui o overhead já que não é mais necessário tantas trocas de contexto entre processos. Pode-se dizer que nos processos ficam mais “leves” (“threads = ligthweight process”) já que todas as threads de um processo são descritas por um mesmo (único) descritor.

Page 37: Threads Aula 15. Prof. José Gonçalves - DI/UFES Sist. Operacionais - 2003/2 Fluxos de Execução Um programa seqüencial consiste de um único fluxo de execução,

Prof. José Gonçalves - DI/UFESSist. Operacionais - 2003/2

Processos e Threads no Unix (4)

Simplificação (cont.): Cada thread possui um mini-descritor e uma pilha. O mini-

descritor é usado para salvar os valores dos registradores da CPU (PC,PSW, etc.) e a pilha é usada para as chamadas e retornos de procedimentos.

A função fork() do Unix cria um novo processo (não uma thread), pois pai e filho possuem espaços de endereçamento distintos. Não há compartilhamento de variáveis, embora sejam usados os mesmos nomes para as mesmas.

Page 38: Threads Aula 15. Prof. José Gonçalves - DI/UFES Sist. Operacionais - 2003/2 Fluxos de Execução Um programa seqüencial consiste de um único fluxo de execução,

Prof. José Gonçalves - DI/UFESSist. Operacionais - 2003/2

Threads - Exemplo de Uso (1)

#include <stdio.h>#include <pthread.h>

void thr_func(int *id); /* codigo threads 1 e 3 */void thr_yield(int *id); /* codigo thread 2 */

int main(){pthread_t thr1,thr2,thr3; /* declara as threads */int nThrID1,nThrID2,nThrID3;

nThrID1 = 1;nThrID2 = 2;nThrID3 = 3;

/* cria threads: id, inic, funcao, param funcao */pthread_create(&thr1,NULL,(void* )thr_func,&nThrID1);pthread_create(&thr2,NULL,(void* )thr_yield,&nThrID2);pthread_create(&thr3,NULL,(void* )thr_func,&nThrID3);

/* espera fim das threads: id, status de saida */pthread_join(thr3,NULL);pthread_join(thr2,NULL);pthread_join(thr1,NULL);

}

Page 39: Threads Aula 15. Prof. José Gonçalves - DI/UFES Sist. Operacionais - 2003/2 Fluxos de Execução Um programa seqüencial consiste de um único fluxo de execução,

Prof. José Gonçalves - DI/UFESSist. Operacionais - 2003/2

Threads - Exemplo de Uso (2)

/* codigo das threads 1 e 3 */void thr_func(int *id){

printf("Eu sou a thread %d\n",*id);}

/* codigo da thread 2 */void thr_yield(int *id){

sched_yield();printf("Eu sou a thread %d\n",*id);

}

/* compilacao: gcc -o threads -lthread -lposix4 threads.c */