Você está na página 1de 12

Arquitetura de Sistemas Operacionais

Francis Berenger Machado Luiz Paulo Maia

Captulo 6 Thread At o final da dcada de 1970, sistemas operacionais, como Unix (Bell Labs), suportavam apenas processos com um nico thread (monothread), ou seja, um processo com apenas um nico programa fazendo parte do seu contexto. Em 1979, durante o desenvolvimento do sistema operacional Toth, foi introduzido o conceito de processos lightweight (peso leve), onde o espao de endereamento de um processo era compartilhado por vrios programas. Apesar do conceito revolucionrio, a ideia no foi utilizada comercialmenle, e somente em meados de 1980, com o desenvolvimento do sistema operacional Mach na Universidade de Carnegie Mellon, ficou clara a separao entre o conceito de processo e thread. A partir do conceito de mltiplos threads (multithread) possvel projetar e implementar aplicaes concorrentes de forma eficiente, pois um processo pode ter partes diferentes do seu cdigo sendo executadas em paralelo, com um menor overhead do que utilizando mltiplos processos. Como os threads de um mesmo processo compartilham o mesmo espao de endereamento, a comunicao entre threads no envolve mecanismos lentos de intercomunicao entre processos, aumentando, conseqiientemente, o desempenho da aplicao. O desenvolvimento de programas que exploram os benefcios da programao multithread no simples. A presena do paralelismo introduz um novo conjunto de problemas como a comunicao e sincronizao de threads. Existem diferentes modelos para a implementao de threads em um sistema operacional, onde desempenho, flexibilidade e custo dcvern ser avaliados. Atualmente, o conceito de multithread pode ser encontrado em diversos sistemas operacionais, como no Sun Solaris e Microsoft Windows 2000. A utilizao comercial de sistemas operacionais multithread crescente em funo do aumento de popularidade dos sistemas com mltiplos processadores, do modelo cliente-servidor e dos sistemas distribudos.

Ambiente Monothread Um programa uma sequncia de instrues, composta por desvios, repeties e chamadas a procedimentos e funes. Em um ambiente monothread. um processo suporta apenas
um programa no seu espao de endereamento. Neste ambiente, aplicaes concorrentes so implementadas apenas com o uso de mltiplos processos independentes ou subprocessos. A utilizao de processos independentes e subprocessos permite dividir uma aplicao em partes que podem trabalhar de forma concorrente. Um exemplo do uso de concorrncia pode ser encontrado nas aplicaes com interface grfica, como em um Software de gerenciamento de e-mails. Neste ambiente, um usurio pode estar lendo suas mensagens antigas, ao mesmo tempo que pode estar enviando e-mails e recebendo novas mensagens. Com o uso de mltiplos processos, cada funcionalidade do software implicaria a criao de um novo processo para atend-la, aumentando o desempenho da aplicao (Fig. 6.1).

O problema neste tipo de implementao que o uso de processos no desenvolvimento de aplicaes concorrentes demanda consumo de diversos recursos do sistema. Sempre que um novo processo criado, o sistema deve alocar recursos para cada processo, consumindo tempo de processador neste trabalho. No caso do trmino do processo, o sistema dispensa tempo para desalocar recursos previamente alocados. Outro problema a ser considerado quanto ao compartilhamento do espao de endereamento. Como cada processo possui seu prprio espao de endereamento, a comunicao entre processos tornase difcil e lenta, pois utiliza mecanismos como pipes, sinais, semforos, memria compartilhada ou troca de mensagem.

Alm disto, o compartilhamento de recursos comuns aos processos concorrentes, como memria e arquivos abertos, no simples. Na Fig. 6.2 existem trs processos monothreads,cada um com seu prprio contexto de Hardware, contexto de software e espao de endereamento.

So exemplos de sistemas monothread o Microsoft MS-DOS e as primeiras verses do MSWindows. Mesmo em ambientes multiprogramveis e multiusurio, encontramos exemplos de implementaes monothread, como nas verses mais antigas dos sistemas Digital VAX/VMS e Unix. Ambiente Multithread Em um ambiente multithread, ou seja, com mltiplos threads, no existe a ideia de programas associados a processos, mas, sim, a threads. O processo, neste ambiente, tem pelo menos um thread de execuo, mas pode compartilhar o seu espao de endereamento com inmeros outros threads. Na Fig. 6.3 existe apenas um processo com trs threads de execuo compartilhando o mesmo espao de endereamento.

De forma simplificada, um thread pode ser definido como uma sub-rotina de uim programa que pode ser executada de forma assncrona, ou seja, executada paralelamente ao programa chamador. O

programador deve especificar os threads, associando-os s sub-rotinas assncronas. Desta forma, um ambiente multithread possibilita a execuo concorrente de sub-rotinas dentro de um mesmo processo. Na Fg. 6.4 existe um programa principal que realiza a chamada de duas sub-rotinas assncronas (Sub_l e Sub_2). Inicialmente, o processo criado apenas com o Thread_1 para a execuo do programa principal. Quando o programa principal chama as sub-rotinas Sub_l e Sub_2, so criados os Thread_2 e Thread_3, respectivamente, e executados independentemente do programa principal. Neste processo, os trs threads so executados concorrentemente.

No ambiente multithread, cada processo pode responder a vrias solicitaes concorrentemente ou mesmo simultaneamente, caso haja mais de um processador. A grande vantagem no uso de threads a possibilidade de minimizar a alocao de recursos do sistema, alm de diminuir o overhead na criao, troca e eliminao de processos. Threads compartilham o processador da mesma maneira que processos e passam pelas mesmas mudanas de estado (execuo, espera e pronto). Por exemplo, enquanto um thread espera por uma operao de E/S, outro thread pode ser executado. Para permitir a troca de contexto entre os diversos threads, cada thread possui seu prprio contexto de hardware, com o contedo dos registradores gerais, PC e SP. Quando um thread est sendo executado, seu contexto de hardware est armazenado nos registradores do processador. No momento em que o thread perde a utilizao da UCP, as informaes so atualizadas no seu contexto de hardware.

Dentro de um mesmo processo, threads compartilham o mesmo contexto de software e espao de endereamento com os demais threads, porm cada thread possui seu contexto de hardware individual. Threads so implementados internamente atravs de uma estrutura de dados denominada bloco de controle do thread (Thread Control Block TCB). O TCB armazena, alm do contexto de hardware, mais algumas informaes relacionadas exclusivamente ao thread, como prioridade, estado de execuo e bits de estado. Em ambientes monothread, o processo ao mesmo tempo a unidade de alocao de recursos e a unidade de escalonamento. A independncia entre os conceitos de processo e thread permite separar a unidade de alocao de recursos da unidade de escalonamento, que em ambientes monothread esto fortemente relacionadas. Em um ambiente multithread, a unidade de alocao de recursos o processo, onde todos os seus threads compartilham o espao de endereamento, descritores de arquivos e dispositivos de E/S. Por outro lado, cada thread representa uma unidade de escalonamento independente. Neste caso, o sistema no seleciona um processo para a execuo, mas sim um de seus threads. A grande diferena entre aplicaes monothread e multithread est no uso do espao de endereamento. Processos independentes e subprocessos possuem espaos de endereamento individuais e protegidos, enquanto threads compartilham o espao dentro de um mesmo processo. Esta caracterstica permite que o compartilhamento de dados entre threads de um mesmo processo seja mais simples e rpido, se comparado a ambientes monothread. Como threads de um mesmo processo compartilham o mesmo espao de endereamento, no existe qualquer proteo no acesso memria, permitindo que um thread possa alterar facilmente dados de outros. Para que threads trabalhem de forma cooperativa, fundamental que a aplicao implemente mecanismos de comunicao e sincronizao entre threads, a fim de garantir o acesso seguro aos dados compartilhados na memria. O uso de multithreads proporciona uma srie de benefcios. Programas concorrentes com mltiplos threads so mais rpidos do que programas concorrentes implementados com mltiplos processos, pois operaes de criao, troca de contexto e eliminao dos threads geram menor overhead (Tabela 6.1). Como os threads dentro de um processo dividem o mesmo espao de endereamento, a comunicao entre eles pode ser realizada de forma rpida e eficiente. Alm disso, threads em um mesmo processo podem compartilhar facilmente outros recursos, como descritores de arquivos, temporizadores, sinais, atributos de segurana etc.

A utilizao do processador, dos discos e de outros perifricos pode ser feita de forma concorrente pelos diversos threads, significando melhor utilizao dos recursos computacionais disponveis. Em algumas aplicaes, a utilizao de threads pode melhorar o desempenho da aplicao apenas executando tarefas em background enquanto operaes E/S esto sendo processadas (Fig. 6.5). Aplicaes como editores de texto, planilhas, aplicativos grficos e processadores de imagens so especialmente beneficiados quando desenvolvidos com base em threads.

Em ambientes cliente-servidor. threads so essenciais para solicitaes de servios remotos. Em um ambiente monothread, se uma aplicao solicita um servio remoto, ela pode ficar esperando indefinidamente, enquanto aguarda pelo resultado. Em um ambiente multithread. um thread pode solicitar o servio remoto, enquanto a aplicao pode continuar realizando outras atividades. J para o processo que atende a solicitao, mltiplos threads permitem que diversos pedidos sejam atendidos simultaneamente (Fig. 6.6).

No apenas aplicaes tradicionais podem fazer uso dos benefcios do multithrea-ding. O ncleo do sistema operacional tambm pode ser implementado com o uso desta tcnica de forma vantajosa, como na arquitetura microkernel, apresentada no captulo Estrutura do Sistema Operacional.

Arquitetura e Implementao O conjunto de rotinas disponveis para que uma aplicao utilize as facilidades dos threads chamado de pacote de threads. Existem diferentes abordagens na implementao deste pacote em um sistema operacional, o que influenciar no desempenho, na concorrncia e na modularidade das aplicaes multithread. Threads podem ser oferecidos por uma biblioteca de rotinas fora do ncleo do sistema operacional (modo usurio), pelo prprio ncleo do sistema (modo kernel), por uma combinao de ambos (modo hbrido) ou por um modelo conhecido como scheduler activations(organizador de ativaes). A Tabela 6.2 resume as diversas arquiteturas para diferentes ambientes operacionais. Tabela 6.2 Arquitetura de threads para diversos ambientes operacionais Ambientes Arquitetura Distributed Computing Eimronment (DCE) Modo usurio Compaq OpcnVMS verso 6 Modo usurio Microsoft Windows, 2000 Modo kernel Compaq Unix Modo kernel Compaq OpenVMS verso 7 Modo kernel Sun Solaris verso 2 Modo hbrido University of washington FasThreadls Scheduleractivations Uma das grandes dificuldades para a utilizao de threads foi a ausncia de um padro. Em 1995, o padro POSIX P1003.1c foi aprovado e posteriormente atualizado para a verso POSIX 1003.4a. Com este padro, tambm conhecido como Plhreads, aplicaes comerciais multithreading tomaram-se mais simples e de fcil implementao. O padro Pthreads largamente utilizado em ambientes Unix. como o Sun Solaris Plhreads e o DECthreads para Digital OSF/1. THREADS EM MODO USURIO

Threads em modo usurio (TMU) so implementados pela aplicao e no pelo sistema operacional. Para isso, deve existir uma biblioteca de rotinas que possibilite aplicao realizar tarefas como criao/eliminao de threads, troca de mensagens entre threads e uma poltica de escalonamento.

Neste modo, o sistema operacional no sabe da existncia de mltiplos threads, sendo responsabilidade exclusiva da aplicao gerenciare sincronizares diversos threads existentes. A vantagem deste modelo a possibilidade de implementar aplicaes multithreads mesmo em sistemas operacionais que no suportam threads. Utilizando a biblioteca, mltiplos threads podem ser criados, compartilhando o mesmo espao de endereamento do processo, alm de outros recursos (Fig. 6.7). TMU so rpidos e eficientes por dispensarem acessos ao kemel do sistema operacional, evitando assim a mudana de modo de acesso (usurio-kemel-usurio). TMU possuem uma grande limitao, pois o sistema operacional gerncia cada processo como se existisse apenas um nico thread. No momento em que um thread chama uma rotina do sistema que o coloca em estado de espera (rotina bloqueante), todo o processo colocado no estado de espera, mesmo havendo outros threads prontos para execuo. Para contornar esta limitao, a biblioteca tem que possuir rotinas que substituam as rotinas bloqueantes por outras que no possam causar o bloqueio de um thread (rotinas no-bloqueantes). Todo este controle transparente para o usurio e para o sistema operacional. Talvez um dos maiores problemas na implementao de TMU seja o tratamento individual de sinais. Como o sistema reconhece apenas processos e no threads, os sinais enviados para um processo devem ser reconhecidos e encaminhados a cada thread para tratamento. No caso do recebimento de interrupes de clock, fundamental para a implementao do tempo compartilhado, esta limitao crtica. Neste caso, os sinais de temporizao devem ser interceptados, para que se possa interromper o thread em execuo e realizar a troca de contexto. Em relao ao escalonamento em ambientes com mltiplos processadores, no possvel que mltiplos threads de um processo possam ser executados em diferentes UCPs simultaneamente, pois o sistema seleciona apenas processos para execuo e no threads. Esta restrio limita drasticamente o grau de paralelismo da aplicao, j que os threads de um mesmo processo podem ser executados em somente um processador de cada vez.

THREADS EM MODO KERNEL

Threads em modo kernel (TMK) so implementados diretamente pelo ncleo do sistema operacional, atravs de chamadas a rotinas do sistema que oferecem todas as funes de gerenciamento e sincronizao. O sistema operacional sabe da existncia de cada thread e pode escalon-los individualmente. No caso de mltiplos processadores, os threads de um mesmo processo podem ser executados simultaneamente. O grande problema para pacotes em modo kernel o seu baixo desempenho. Enquanto nos pacotes em modo usurio todo tratamento feito sem a ajuda do sistema operacional, ou seja, sem a mudana do modo de acesso (usurio-kernel-usurio), pacotes em modo kernel utilizam chamadas a rotinas do sistema e, consequentemente, vrias mudanas no modo de acesso. A Tabela 6.3 compara o desempenho de duas operaes distintas envolvendo a criao, escalonamento, execuo e eliminao de um processo/thread. THREADS EM MODO HBRIDO

A arquitetura de rhreads em modo hbrido combina as vantagens de threads implementados em modo usurio (TMU) e threads em modo kemel (TMK). Um processo pode ter vrios TMK e, por sua vez, um TMK pode ter vrios TMU. O ncleo do sistema reconhece os TMK e pode escalon-los individualmente. Um TMU pode ser executado em um TMK, em um determinado momento, e no instante seguinte ser executado em outro. O programador desenvolve a aplicao em termos de TMU e especifica quantos TMK esto associados ao processo. Os TMU so mapeados em TMK enquanto o processo est sendo executado. O programador pode utilizar apenas TMK, TMU ou uma combinao de ambos O modo hbrido, apesar da maior flexibilidade, apresenta problemas herdados de ambas as implementaes. Por exemplo, quando um TMK realiza uma chamada bloqueante, todos os TMU so colocados no estado de espera. TMU que desejam utilizar vrios processadores devem utilizar diferentes TMK, o que influenciar no desempenho.

SCHEDULER ACTiVATIONS(organizador ativaes)

Os problemas apresentados no pacote de threads em modo hbrido existem devido falta de comunicao entre os threads em modo usurio e em modo kernel. O modelo ideal deveria utilizar as facilidades do pacote em modo kernel com o desempenho e flexibilidade do modo usurio. Introduzido no incio da dcada de 1990 na Universidade de Washington, este pacote combina o melhor das duas arquiteturas, mas em vez de dividir os threads em modo usurio entre os de modo kernel, o ncleo do sistema troca informaes com a biblioteca de threads utilizando uma estrutura de dados chamada scheduler activations (organizador de ativao) A maneira de alcanar um melhor desempenho evitar as mudanas de modos de acesso desnecessrias (usurio-kernel-usurio). Caso um thread utilize uma chamada ao sistema que o coloque no estado de espera, no necessrio que o kernel seja ativado, bastando que a prpria biblioteca em modo usurio escalone outro thread. Isto possvel porque a biblioteca em modo usurio e o kemel se comunicam e trabalham de forma cooperativa. Cada camada implementa seu escalonamento de forma independente, porm trocando informaes quando necessrio. Modelos de Programao O desenvolvimento de aplicaes multithread no simples, pois exige que a comunicao e o compartilhamento de recursos entre os diversos threads seja feto de forma sincronizada para evitar problemas de inconsistncias e deadlock. Alem das dificuldades naturais no desenvolvimento de aplicaes concorrentes, o procedimento de depurao bastante complexo. Um fator importante em aplicaes multithread o nmero total de threads e a forma como so criados e eliminados. Se uma aplicao cria um nmero excessivo de threads, poder ocorrer um overhead no sistema, ocasionando uma queda de desempenho. Dependendo da implementao, a definio do nmero de threads pode ser dinmica ou esttica. Quando a criao/eliminao dinmica, os threads so criados/eliminados conforme a demanda da aplicao, oferecendo grande flexibilidade. J em ambientes estticos, o nmero de threads definido na criao do processo onde a aplicao ser executada. Para obter os benefcios do uso de threads, uma aplicao deve permitir que partes diferentes do seu cdigo sejam executadas em paralelo de forma independente. Se um aplicativo realiza vrias operaes de E/S e trata eventos assncronos, a programao multithread aumenta seu desempenho at mesmo em ambientes com um nico processador. Sistemas gerenciadores de banco de dados (SGBDs), servidores de arquivos ou impresso so exemplos onde o uso de mltiplos threads proporciona grandes vantagens e benefcios.

Questionario:
1. Como uma aplicao pode implementar concorrncia em um ambiente mono-thread? 2. Quais os problemas de aplicaes concorrentes desenvolvidas em ambientes monothread? 3. O que um thread e quais as vantagens em sua utilizao? 4. Explique a diferena entre unidade de alocao de recursos e unidade de escalonamento. 5. Quais as vantagens e desvantagens do compartilhamento do espao de endereamento entre threads de um mesmo processo? 6. Compare os pacotes de threads cm modo usurio e modo kernel. 7. Qual a vantagem do scheduler activations comparado ao pacote hbrido? 8. D exemplos do uso de threads no desenvolvimento de aplicativos como editores de textos e planilhas eletrnicas. 9. Como o uso de threads pode melhorar o desempenho de aplicaes paralelas em ambientes com mltiplos processadores? 10. Quais os benefcios do uso de threads em ambientes cliente-servidor? 11. Como o uso de threads pode ser til em arquteturas microkemel?