Você está na página 1de 38

SISTEMAS OPERACIONAIS

AULA - 4 Threads

Instituto Federal do Tocantins Campus Palmas Prof. Helder Cleber A. Pereira 2011 IFTO-Palmas Prof. Helder

SISTEMAS OPERACIONAIS

Definies de threads

IFTO-Palmas Prof. Helder

Definies de threads

Uma thread basicamente uma linha de execuo independente, contida dentro de um processo. Ou seja, threads permitem que um processo faa vrias coisas de forma simultnea j que um processo pode ter vrias threads; Todas as threads que fazem parte de um mesmo processo compartilham praticamente os mesmos recursos, portanto, todas tem acesso as variveis globais; Em sistemas operacionais tradicionais, cada processo tem um espao de endereamento e uma nica thread de controle; A funcionalidade de mltiplas threads quase se sobrepe a definio de mltiplos processos com fork(). Contudo, frequentemente existem situaes onde desejvel ter mltiplas threads de controle no mesmo espao de endereamento executando quase em paralelo, como se eles fossem processos separados;
IFTO-Palmas Prof. Helder 3

SISTEMAS OPERACIONAIS

Uso de threads

IFTO-Palmas Prof. Helder

Uso de threads

Comparado com a definio de processo, podemos chamar as threads de miniprocessos; A principal razo para existirem threads que em muitas aplicaes ocorrem mltiplas atividades ao mesmo tempo. Algumas dessas atividades podem ser bloqueadas de tempos em tempos; O modelo de programao se torna mais simples se decompormos uma aplicao em mltiplas threads sequenciais que executam quase em paralelo; Tanto os processos como as threads promovem a capacidade de processamento paralelo. As threads adicionam um novo elemento: a capacidade de entidades paralelas compartilharem o mesmo espao de endereamento, consequentemente, as variveis globais;

IFTO-Palmas Prof. Helder

Uso de threads
processo

thread Figura 1 Figura representativa de um processo e de uma thread IFTO-Palmas Prof. Helder 6

Uso de threads

Um segundo argumento para a existncia de threads que eles so mais fceis (rpidos) de criar e destruir que os processos, pois no tm quaisquer recursos associados a eles. Em muitos sistemas, criar uma thread cem vezes mais rpido do que criar um processo; Uma terceira razo tambm um argumento de desempenho. O uso de threads no resulta em ganho de desempenho quando todos eles so CPU-bound (limitados pela CPU, isto , muito processamento com pouca E/S). No entanto quando h grande quantidade de computao e E/S, as threads permitem que essas atividades se sobreponham e, desse modo, aceleram a aplicao; Finalmente, as threads so teis em sistemas com mltiplas CPUs, para os quais o paralelismo real possvel;

IFTO-Palmas Prof. Helder

Uso de threads

Exemplos de uso de threads: Em um editor de texto, pode existir uma thread que fica interagindo com o usurio, atendendo as solicitaes imediatistas do usurio, e pode haver uma segunda thread trabalhando em background que salva o arquivo automaticamente de tempos em tempos; Um segundo exemplo seria com um servidor web. A solicitao de site que chega a um servidor web, pode ser delegaga a uma thread, enquanto isso o servidor web fica livre para receber novas solicitaes;

Aplicaes (servidoras) que trabalham com vrias threads e que atendam solicitaes de outras aplicaes so chamadas multithread; Aplicaes multithreads conseguem paralelismo na execuo, mesmo em cenrios de chamadas de sistema blocante;

IFTO-Palmas Prof. Helder

SISTEMAS OPERACIONAIS

O modelo de thread clssico

IFTO-Palmas Prof. Helder

O modelo de threads clssico

O que as threads acrescentam ao modelo de processo permitir que mltiplas execues ocorram no mesmo ambiente do processo, com um grande grau de independncia uma da outra; Ter mltiplas threads executando em paralelo em um processo anlogo a mltiplos processos executando em paralelo em um nico computador; As threads compartilham um mesmo espao de endereamento e outros recursos. Os processos compartilham um espao fsico de memria, disco, impressoras e outros recursos; Como as threads possuem algumas das propriedades dos processo, elas so por vezes chamadas de processos leves; O termo multithread tambm usado para descrever a situao em que se permite a existncia de mltiplas threads no mesmo processo; Algumas CPUs tm suporte de hardware direto para multithread e permitem a ocorrncia de chaveamento de threads em uma escala de tempo de nanossegundos;
IFTO-Palmas Prof. Helder 10

O modelo de threads clssico

Figura 2 Processos e Threads IFTO-Palmas Prof. Helder 11

O modelo de threads clssico

Quando um processo com mltiplas threads executado em um sistema com uma nica CPU, as threads esperam a sua vez para executar; Ao chavear entre vrios processos, o sistema induz a iluso de processos sequenciais distintos executando em paralelo. O multithread funciona do mesmo modo; Threads distintas em um processo no so independentes como processos distintos. Todas as threads tm exatamente o mesmo espao de endereamento, o que significa que elas tambm compartilham as mesmas variveis globais; Como cada thread pode ter acesso a qualquer endereo de memria dentro do espao de endereamento do processo, uma thread pode ler, escrever ou at mesmo apagar completamente a pilha de outra thread;

IFTO-Palmas Prof. Helder

12

O modelo de threads clssico

No h proteo entre threads porque (1) impossvel e (2) no seria necessrio. J no caso de processos diversos, que podem ser de usurios diferentes e mutuamente hostis existe a necessidade de proteo; Assim como em processos tradicionais (isto processos com apenas uma thread), uma thread pode estar em um dos vrios estados: em execuo, bloqueado, pronto ou finalizado. As transies entre os estados da thread so as mesmas transies entre os estados dos processos; importante perceber que cada thread tem sua prpria pilha (a pilha grava o status de execuo do processo/thread); Quando ocorre a execuo de mltiplas threads, os processos normalmente iniciam com uma nica thread. Essa thread tem a capacidade de criar novas threads; Algumas vezes as threads so hierarquicas, com um relacionamento paifilho, mas com frequencia esse relacionamento no existe, uma vez que todos os threads so iguais;
IFTO-Palmas Prof. Helder 13

O modelo de threads clssico

Figura 3 Thread no sistema operacional IFTO-Palmas Prof. Helder 14

O modelo de threads clssico

Quando termina o seu trabalho uma thread chama uma rotina (thread_exit) de finalizao. Ela ento desaparece e no mais escalonvel; Uma thread tambm pode esperar pela sada de uma thread especfica, chamando o procedimento thread_join. Essa rotina bloqueia a thread que a executou at que a thread especfica tenha terminado; Outra chamada comum de thread a thread_yield, que permite que uma thread desista voluntariamente da CPU para deixar outra thread executar. Essa chamada importante porque no h uma interrupo de relgio para forar um tempo compartilhado, como existe com processos. Assim importante que as threads sejam corteses; Mesmo sendo teis em muitas situaes, as threads tambm introduzem vrias complicaes no modelo de programao. S para comear, considere os efeitos das chamada de sistema fork. Se o processo pai tiver mltiplos threads, o processo filho no deveria t-los tambm?
IFTO-Palmas Prof. Helder 15

O modelo de threads clssico

Contudo, se o processo filho possuir tantas threads quanto o pai, o que acontece se uma thread do pai estiver bloqueado em uma chamada read do teclado. Agora so dois threads bloqueados esperando entrada pelo teclado, um no pai e outro no filho? Quando uma linha for digitada, ambas as threads contero uma cpia dela? Somente o pai? Somente o filho? O mesmo problema existe com as conexes de rede em aberto. Outra classe de problemas est relacionada ao fato das threads compartilharem muitas estruturas de dados. O que acontece se uma thread fechar um arquivo enquanto outra estiver ainda lendo o mesmo arquivo? Suponha que uma thread perceba que exista pouca memria e comece a alocar mais memria. No meio dessa tarefa, ocorre um chaveamento entre threads, e ento o novo thread perceba que h pouca memria e comece tambm a alocar mais memria; Todos os problemas podem ser resolvidos com certa dificuldade, mas programas multithreads devem ser pensados e projetados com cuidado para que funcionem corretamente;
IFTO-Palmas Prof. Helder 16

SISTEMAS OPERACIONAIS

Threads POSIX

IFTO-Palmas Prof. Helder

17

Threads POSIX

Para possibilitar criar threads portteis o IEEE definiu um padro para threads, baseado na padronizao POSIX. Essas threads passam a ser chamadas de pthreads; Exemplos de chamadas pthreads (existem mais de 60); Chamada de thread Descrio
pthread-create pthread_exit pthread_join pthread_yield pthread_attr_init pthread_attr_destroy Cria uma nova thread Conclui a chamada da thread Espera que uma thread especfica seja terminada Libera a CPU para que outra thread seja executada Cria e inicializa uma estrutura de atributos da thread Remove uma estrutura de atributos da thread

Tabela1 Chamadas de sistemas para threadsl IFTO-Palmas Prof. Helder 18

Threads POSIX

Toda as threads Pthreads tm certas propriedades. Cada uma tem um identificador, um conjunto de registros (inclusive um contador de programa), e um conjunto de atributos, que so armazenados em uma estrtutura Os atributos da pthread incluem o tamanho da pilha , os parmetros de escalonamento e outros tens necessrios utilizao da thread; Quando uma thread terminou o trabalho para o qual foi designado, pode concluir a chamada com pthread_exit. Essa chamada interrompe a thread e libera a sua pilha;

IFTO-Palmas Prof. Helder

19

SISTEMAS OPERACIONAIS

Pthread_create

IFTO-Palmas Prof. Helder

20

Pthread_create()

Essa primitiva utilizada para criar threads; A funo pthread_create tem a seguinte sintaxe: #include <pthread.h> int pthread_create(pthread_t *thread, const pthread_attr_t *(*start_routine) (void *), void *arg); *attr, void

*thread um ponteiro para uma varivel do tipo pthread_t, responsvel pela identificao da thread recm criada; *attr um ponteiro para os atributos que so armazenados em uma varivel do tipo pthread_att.r_t. Ela permite que o programador defina alguns atributos especiais como poltica de escalonamento, seu escopo de execuo, dentre outros. Para utilizar o padro do sistema deve ser passado NULL; start_routine o nome da funo que ser executada pela thread;
IFTO-Palmas Prof. Helder 21

Pthread_create()
*arg passado como argumento para a rotina (dados para thread recm criada; A funo pthread_create() retorna zero caso tenha sucesso na criao de uma thread ou -1 no caso de erro;

Exerccios exemplos: prog1, prog2, prog3, prog4, prog5 e prog6

IFTO-Palmas Prof. Helder

22

SISTEMAS OPERACIONAIS

Pthread_join

IFTO-Palmas Prof. Helder

23

Pthread_join()

A primitiva pthread_join() suspende o processamento da thread que a chamou at que a thread identificada na funo termine normalmente atravs da funo pthread_exit() ou seja cancelada; Sintaxe: #include <pthread.h> int pthread_join( pthread_t th, void **thread_return);

Essa chamada de sistema recebe como parmetro a identificao da thread que vai ser esperada e o valor de retorno desta. Se o parmetro thread_return for NULL, o valor de retorno descartado; O valor de retorno dessa funo zero para operao bem sucedida e um valor diferente de zero para o caso de erro; Exemplo: prog7
IFTO-Palmas Prof. Helder 24

SISTEMAS OPERACIONAIS

Pthread_yield

IFTO-Palmas Prof. Helder

25

Pthread_yield()

A primitiva pthread_yield() permite que uma thread desista voluntariamente de uma CPU para deixar outra thread executar; Sintaxe: #include <pthread.h> int pthread_yield( void);

O valor de retorno dessa funo zero para operao bem sucedida e um valor diferente de zero para o caso de erro; Exemplo: prog8

IFTO-Palmas Prof. Helder

26

SISTEMAS OPERACIONAIS

Implementao de threads no espao do usurio

IFTO-Palmas Prof. Helder

27

Threads no espao do usurio

H dois modos principais de implementar um pacote de threads: no espao do usurio e no ncleo. Tambm possvel uma implementao hbrida; Threads no espao do usurio, significa que as threads so implementadas e gerenciadas somente no espao do usurio. O ncleo do sistema operacional fica alheio a presena de threads; Uma vantagem da implementao de threads no espao do usurio que as threads podem ser implementadas em um sistema operacional que no suporte threads. Com essa abordagem as threads so implementadas na forma de bibliotecas; Quando as threads so gerenciadas no espao do usurio, cada processo precisa de sua prpria tabela de threads para manter o controle das threads naquele processo. Essa tabela anloga tabela de processos no ncleo;
IFTO-Palmas Prof. Helder 28

Threads no espao do usurio

A tabela de threads gerenciada pelo sistema de tempo de execuo. Quando uma thread vai para o estado pronto ou bloqueado, a informao necessria para reinici-la armazenada na tabela de threads, exatamente do mesmo modo como o ncleo armazena as informaes sobre os processos na tabela de processos; Quando uma thread faz algo que possa bloque-la localmente por exemplo, espera que uma outra thread em seu processo termine o seu trabalho - , ela chama uma rotina do sistema de tempo de execuo. Essa rotina verifica se a thead deve entrar no estado bloqueado. Em caso afirmativo, ele armazena os registradores da thread na tabela de threads, busca na tabela por uma thread pronto para executar e recarrega os registradores da mquina com novos valores salvos da threads. Logo que o ponteiro de pilha e o contador de programa forem alterados, a nova thread reviver automaticamente; Se a mquina tiver uma instruo que salve todos os registradores e outra que carregue todos eles, o chaveamento da thread poder ser feito com poucas instrues;
IFTO-Palmas Prof. Helder 29

Threads no espao do usurio

Fazer o chaveamento de threads , pelo menos, de uma ordem de magnitude mais rpida que desviar o controle para o ncleo esse um forte argumento em favor dos pacotes de threads de usurio; Outra diferena fundamental que quando uma thread decide parar de executar por exemplo, quando executa a chamada thread_yield -, o cdigo desta pode salvar a informao da thread na prpria tabela de threads. Mais ainda: o escalonador de thread pode ser chamado pelo cdigo thread_yield para selecionar uma outra thread para executar. A rotina que salva o estado da thread e o escalonador so apenas rotinas locais, de modo que muito mais eficiente involc-las do que fazer uma chamada do ncleo. Entre outras coisas no necessrio passar do modo usurio para o modo ncleo, no se precisa de nenhum chaveamento de contexto, a cache da memria no tem que ser esvaziada e assim por diante. Isso tudo agiliza o escalonamento de threads;

IFTO-Palmas Prof. Helder

30

Threads no espao do usurio

Apesar dessas vantagens as threads implementadas no espao do usurio tambm tem seus problemas. O primeiro deles como implementar as chamadas de sistemas com bloqueio; Outro problema se refere a falta de pgina (page fault), caso onde o processo solicita acesso a uma pgina sua que no est na RAM. Quando isso acontece o sistema operacional bloqueia o processo e por tabela todas a threads presentes nesse processo; Outro problema com pacotes de threads de usurio que, se uma thread comea a executar, nenhuma outra thread naquele processo executar sequer uma vez, a menos que a primeira thread, voluntariamente, abra mo da CPU. Em um processo nico no h interrupes de relgio, o que torna impossvel escalonar threads pelo escalonamento circular (roundrobin). A mesmo que uma thread ceda voluntariamente a vez para outra, o escalonador nunca ter oportunidade de faz-lo;

IFTO-Palmas Prof. Helder

31

SISTEMAS OPERACIONAIS

Implementao de threads no ncleo

IFTO-Palmas Prof. Helder

32

Threads no ncleo

Nesse modo o ncleo sabe sobre as threads e os gerencia; Nesse cenrio no h mais a necessidade de uma tabela de threads para cada processo. Em vez disso, o ncleo tem uma tabela de threads que acompanha todas as threads do sistema. Quando uma thread quer criar uma nova thread ou destruir uma j existente, ela faz uma chamada ao ncleo, que realiza ento a criao, ou a destruio atualizando a tabela de threads do ncleo; A tabela de threads do ncleo contm os registradores, o estado e outras informaes de cada thread. Essas informaes constituem um subconjunto das informaes que ncleos tradicionais mantm sobre cada um dos seus processos. O ncleo tambm mantm a tradicional tabela de processos; Nesse cenrio tadas as chamadas que possam bloquear uma thread so implementadas como chamadas de sistemas. Quando uma thread bloqueada outra thread do mesmo processo (se algum estiver pronto) passa a tomar posse do processador;
IFTO-Palmas Prof. Helder 33

Threads no ncleo

H um custo maior que no espao do usurio em se criar e destruir threads gerenciadas via ncleo, por isso alguns sistemas operacionais adotam uma abordagem ambientalmente correta, reciclam as threads; Embora as threads de ncleo resolvam alguns problemas, eles no resolvem todos. Por exemplo, o que acontece quando um processo multithread bifurcado? O novo processo tem tantas threads como o anterior ou tem apenas um? Outra questo so os sinais. Lembramos que os sinais so enviados para processos, no para threads, pelo menos no modelo clssico. Quando um sinal chega, qual thread deveria control-lo? Embora threads de ncleo sejam melhores que threads de usurio em aspectos importantes, tambm so indiscutivelmente mais lentos. Para tentar combinar as vantagens de threads de usurio com as de ncleo, tem se falado em solues hbridas.
IFTO-Palmas Prof. Helder 34

SISTEMAS OPERACIONAIS

Threads pop-up

IFTO-Palmas Prof. Helder

35

Threads pop-up

Threads so bastante teis em sistemas distribudos. Um exemplo importante como as mensagens que chegam so tratadas. A abordagem tradicional bloquear um processo ou uma thread em uma chamada de sistema receive e aguardar que uma mensagem chegue; Contudo, um caminho completamente diferente tambm possvel, na qual a chegada de uma mensagem faz com que o sistema crie uma nova thread para lidar com a mensagem. Essa thread chamada tread pop-up; Um ponto fundamental das threas pop-up que como so novas, no tem qualquer histria registradores, pilha etc. - que deva ser restaurada. Cada thread recm-criada idntica a anterior. Isso possibilita que sejam criadas rapidamente; A vantagem do uso de threads pop-up que a latncia entre a chegada da mensagem e o incio do processamento pode ser muito pequena; Exemplo de programa: exec9
IFTO-Palmas Prof. Helder 36

Referncia Bibliogrfica
Sistemas Operacionais Modernos - Andrew S. Tanenbaum. 3 edio, 2009; www.google.com.br.

IFTO-Palmas Prof. Helder

37

Programa exemplo

Um exemplo de programa que pode ser feito em sala: Faa um programa que seja executado de forma sequencia: pede usurio e senha (6 caracteres cada) e depois conte de 1 at 100.0000 Agora refaa o mesmo programa com threads. A thread criada ir executar a parte que pede o usurio e a senha e a thread progenitora vai contar at 100.000. Quando voc terminar de digitar a senha capaz que a contagem j tenha sido termina. Isso demonstra a vantagem de uso de threads ou forks mesmo em uma mquina que tenha apenas um processador com um ncleo;

IFTO-Palmas Prof. Helder

38