A apresentação está carregando. Por favor, espere

A apresentação está carregando. Por favor, espere

Threads Aula 15.

Apresentações semelhantes


Apresentação em tema: "Threads Aula 15."— Transcrição da apresentação:

1 Threads Aula 15

2 Prof. José Gonçalves - DI/UFES
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. Sist. Operacionais /2 Prof. José Gonçalves - DI/UFES

3 Prof. José Gonçalves - DI/UFES
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) Sist. Operacionais /2 Prof. José Gonçalves - DI/UFES

4 Prof. José Gonçalves - DI/UFES
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. Sist. Operacionais /2 Prof. José Gonçalves - DI/UFES

5 Prof. José Gonçalves - DI/UFES
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. Sist. Operacionais /2 Prof. José Gonçalves - DI/UFES

6 Prof. José Gonçalves - DI/UFES
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). Sist. Operacionais /2 Prof. José Gonçalves - DI/UFES

7 Prof. José Gonçalves - DI/UFES
Threads e Processos (3) Sist. Operacionais /2 Prof. José Gonçalves - DI/UFES

8 Prof. José Gonçalves - DI/UFES
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. Sist. Operacionais /2 Prof. José Gonçalves - DI/UFES

9 Prof. José Gonçalves - DI/UFES
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. Sist. Operacionais /2 Prof. José Gonçalves - DI/UFES

10 Prof. José Gonçalves - DI/UFES
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. Sist. Operacionais /2 Prof. José Gonçalves - DI/UFES

11 Processos Mono e Multithreaded (1)
Sist. Operacionais /2 Prof. José Gonçalves - DI/UFES

12 Processos Mono e Multithreaded (2)
Sist. Operacionais /2 Prof. José Gonçalves - DI/UFES

13 Processos Mono e Multithreaded (3)
tempo pedido RPC pedido RPC processo 1 serv serv serv thread A thread B (processo 1) pedido RPC executando bloqueado(a) Sist. Operacionais /2 Prof. José Gonçalves - DI/UFES

14 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. Sist. Operacionais /2 Prof. José Gonçalves - DI/UFES

15 Prof. José Gonçalves - DI/UFES
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. Sist. Operacionais /2 Prof. José Gonçalves - DI/UFES

16 Prof. José Gonçalves - DI/UFES
Java Threads States Sist. Operacionais /2 Prof. José Gonçalves - DI/UFES

17 Prof. José Gonçalves - DI/UFES
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 Sist. Operacionais /2 Prof. José Gonçalves - DI/UFES

18 Prof. José Gonçalves - DI/UFES
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 Sist. Operacionais /2 Prof. José Gonçalves - DI/UFES

19 Prof. José Gonçalves - DI/UFES
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. Sist. Operacionais /2 Prof. José Gonçalves - DI/UFES

20 Prof. José Gonçalves - DI/UFES
User-level Threads (3) biblioteca de threads espaço do usuário espaço do núcleo P thread nível usuário P Processo Sist. Operacionais /2 Prof. José Gonçalves - DI/UFES

21 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. Sist. Operacionais /2 Prof. José Gonçalves - DI/UFES

22 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. Sist. Operacionais /2 Prof. José Gonçalves - DI/UFES

23 Kernel-level Threads (3)
espaço do usuário núcleo P thread nível núcleo nível usuário P Processo Sist. Operacionais /2 Prof. José Gonçalves - DI/UFES

24 Combinando Modos (Solaris)
biblioteca de threads espaço do usuário espaço do núcleo thread nível núcleo nível usuário P Processo P P Sist. Operacionais /2 Prof. José Gonçalves - DI/UFES

25 Comparando Abordagens
Sist. Operacionais /2 Prof. José Gonçalves - DI/UFES

26 User-level e Kernel-level Threads
Sist. Operacionais /2 Prof. José Gonçalves - DI/UFES

27 Modelo Muitos-para-Um
Muitas user-level threads mapeadas em uma única kernel thread. Modelo usado em sistemas que não suportam kernel threads. Sist. Operacionais /2 Prof. José Gonçalves - DI/UFES

28 Prof. José Gonçalves - DI/UFES
Modelo Um-para-Um Cada user-level thread é mapeada em uma única kernel thread. Exemplos: Windows 95/98/NT/2000 e OS/2 Sist. Operacionais /2 Prof. José Gonçalves - DI/UFES

29 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. Sist. Operacionais /2 Prof. José Gonçalves - DI/UFES

30 Prof. José Gonçalves - DI/UFES
Pthreads API padrão POSIX (IEEE c) 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 - Sist. Operacionais /2 Prof. José Gonçalves - DI/UFES

31 Prof. José Gonçalves - DI/UFES
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. Sist. Operacionais /2 Prof. José Gonçalves - DI/UFES

32 Prof. José Gonçalves - DI/UFES
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). Sist. Operacionais /2 Prof. José Gonçalves - DI/UFES

33 Prof. José Gonçalves - DI/UFES
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. Sist. Operacionais /2 Prof. José Gonçalves - DI/UFES

34 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). Sist. Operacionais /2 Prof. José Gonçalves - DI/UFES

35 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. Sist. Operacionais /2 Prof. José Gonçalves - DI/UFES

36 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. Sist. Operacionais /2 Prof. José Gonçalves - DI/UFES

37 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. Sist. Operacionais /2 Prof. José Gonçalves - DI/UFES

38 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); } Sist. Operacionais /2 Prof. José Gonçalves - DI/UFES

39 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 */ Sist. Operacionais /2 Prof. José Gonçalves - DI/UFES


Carregar ppt "Threads Aula 15."

Apresentações semelhantes


Anúncios Google