Sistemas Operacionais Prof. Esp. André Luís Belini Bacharel em Sistemas de Informações MBA em Gestão Estratégica de Negócios Capítulo 6 - Threads • Com o conceito de múltiplos threads (multithread) é possível projetar e implementar aplicações concorrentes de forma eficiente, pois um processo pode ter partes diferentes do seu código sendo executadas concorrentemente, com um menor overhead do que utilizando múltiplos processos. • Como os threads de um mesmo processo compartilham o mesmo espaço de endereçamento, a comunicação entre threads não envolve mecanismos lentos de intercomunicação entre processos, aumentando, consequentemente o desempenho da aplicação. 2 1 • O desenvolvimento de programas que exploram os benefícios da programação multithread não é simples. • A presença do paralelismo introduz um novo conjunto de problemas, como a comunicação e sincronização de threads. • Existem diferentes modelos para a implementação de threads em um sistema operacional, onde desempenho, flexibilidade e custo devem ser avaliados. 3 Ambiente Monothread • Um programa é uma sequência de instruções, composta por desvios, repetições e chamadas a procedimentos e funções. • Em um ambiente monothread, um processo suporta apenas um programa no seu espaço de endereçamento. • Neste ambiente, aplicações concorrentes são implementadas apenas com o uso de múltiplos processos independentes ou subprocessos. 4 2 • A utilização de processos independentes e subprocessos permiti dividir uma aplicação em partes que podem trabalhar de forma concorrente. • Exemplo: software gerenciador de e-mails, pois ao mesmo tempo que você está lendo uma mensagens, outras podem estar chegando ou sendo enviadas ao mesmo tempo. • Com o uso de múltiplos processos, cada funcionalidade do software implicaria a criação de um novo processo para atendê-la, aumentando o desempenho da aplicação. 5 Concorrência com subprocessos e processos independentes Subprocessos Processos Independentes 6 3 • Problemas desse tipo de implementação: sempre que um novo processo é criado, o sistema operacional deve alocar recursos para ele, consumindo tempo do processador nesse trabalho. • Ao término do processo, o sistema dispensa tempo para desalocar recursos previamente alocados. • Outro problema é o compartilhamento de espaço de endereçamento. Cada processo tem seu espaço de endereçamento e, portanto, a comunicação entre eles torna-se difícil e lenta. 7 Ambiente Multithread • Em um ambiente multithread, ou seja, com múltiplos threads, não existe a ideia de programas associados a processos, mas, sim, a threads. • O processo, neste ambiente, tem pelo menos um thread de execução, mas pode compartilhar o seu espaço de endereçamento com inúmeros outros threads. • Um thread pode ser definido como uma sub-rotina de um programa que pode ser executada de forma assíncrona, ou seja, executada concorrentemente ao programa chamador. 8 4 Ambiente Multithread Contexto de hardware Contexto de hardware Thread 1 Thread 2 Thread 3 Contexto de software Contexto de hardware Espaço de endereçamento 9 • No ambiente multithread, cada processo pode responder a várias solicitações concorrentemente ou mesmo simultaneamente, caso haja mais de um processador. • A grande vantagem do uso de threads é a possibilidade de minimizar a alocação de recursos do sistema, além de diminuir o overhead na criação, troca e eliminação de processos. 10 5 Aplicação multithread Processo Variáveis Programa Principal Thread_1 PC SP Contexto de Hardware ... Espaço de endereçamento Call Sub_1 Thread_2 PC SP Ret Thread_3 PC SP Sub_2 Contexto de Hardware Fim Sub_1 Contexto de Hardware Call Sub_2 ... Ret 11 • Threads compartilham o processador da mesma maneira que processos e passam pelas mesmas mudanças de estado (execução, espera e pronto). • Dentro de um mesmo processo, threads compartilham o mesmo contexto de software e espaço de endereçamento com os demais threads, porém cada thread possui seu contexto de hardware individual. • Threads são implementados internamente através de uma estrutura de dados denominada bloco de controle do thread (Thread Control Block – TCB). • O TCB armazena, além do contexto do hardware, mais algumas informações relacionadas exclusivamente ao thread, como prioridade, estado de execução e bits de estado. 12 6 • Em ambientes monothread, o processo é ao mesmo tempo a unidade de alocação de recursos e a unidade de escalonamento. • Em um ambiente multithread, a unidade de alocação de recursos é o processo onde todos os seus threads compartilham o espaço de endereçamento, descritores de arquivos e dispositivos de E/S. • Cada thread representa uma unidade de escalonamento independente e, neste caso, o sistema não seleciona um processo para a execução, mas sim um de seus threads. 13 • A grande diferença entre aplicações monothread e multithread está no uso do espaço de endereçamento. • Processos independentes e subprocessos possuem espaços de endereçamento individuais e protegidos, enquanto threads compartilham o espaço dentro de um mesmo processo. • Esta característica permite que o compartilhamento de dados entre threads de um mesmo processo seja mais simples e rápida, se comparado ao ambiente monothread. • Programas concorrentes com múltiplos threads são mais rápidos do que implementados com múltiplos processos, pois operações de criação, troca de contexto e eliminação de threads geram menor overhead 14 7 Latência de processos e threads (Vahalia, 1996) Implementação Tempo de criação Tempo de sincronização Processo 1700 200 Processo lightweight 350 390 Thread 52 66 15 Aplicação multithread Thread de entr ada Buffer Thread de exi bi ção Thread de gravação 16 8 • A utilização do processador, discos e outros periféricos pode ser feita de forma concorrente pelos diversos threads, significando uma melhor utilização dos recursos computacionais disponíveis. • Aplicações como editores de texto, planilhas, aplicativos gráficos e processadores de imagem são especialmente beneficiados quando desenvolvidas com base em threads. • Em ambientes cliente-servidor, threads são essenciais para solicitações de serviços remotos. Em um ambiente monothread, se uma aplicação solicita um serviço remoto ela pode ficar esperando indefinidamente, enquando aguarda pelo resultado. 17 • Em um ambiente multithread, um thread pode solicitar o serviço remoto, enquanto a aplicação pode continuar realizando outras atividades. • Já para o processo que atende a solicitação, múltiplos threads permitem que diversos pedidos sejam atendidos simultaneamente. • O núcleo do sistema operacional também pode ser implementado com o uso desta técnica de forma vantajosa, como na arquitetura microkernel. 18 9 Aplicação multithread Processo servidor Solicitações Thread Thread Thread Processo cliente Processo cliente Processo cliente 19 Programação multithread • O conjunto de rotinas disponíveis para que uma aplicação utilize as facilidades dos threads é chamado de pacote de threads. • Um exemplo é a API CreateThread, no sistema Windows. • O desenvolvimento de aplicações multithread não é simples, pois exige que a comunicação e o compartilhamento de recursos entre os diversos threads sejam feitos de forma sincronizada para evitar problemas de inconsistências e deadlock. • Se uma aplicação criar um número execessivo de threads, poderá ocorrer um overhead no sistema, ocasionando uma queda de desempenho. 20 10 • Para obter os benefícios do uso de threads, uma aplicação deve permitir que partes diferentes do seu código sejam executadas concorrentemente de forma independente. • Se um aplicativo realiza várias operações de E/S e trata eventos assíncronos, a programação multithread aumenta o desempenho até mesmo em ambientes com um único processador. • Sistemas gerenciadores de banco de dados, servidores de arquivos ou impressão, servidores web e de correio são exemplos onde o uso de múltiplos threads proporciona grandes vantagens e benefícios. 21 Arquitetura e implementação • Existem duas formas de implementar threads em um sistema operacional: 1. Threads podem ser oferecidos por uma biblioteca de rotinas fora do núcleo do S.O. (modo usuário), pelo próprio núcleo do S.O. (modo kernel), uma combinação de ambos (modo híbrido). 2. Outra forma seriam os scheduler activations 22 11 Threads em modo usuário • Threads em modo usuário (TMU) são implementados pela aplicação e não pelo S.O. • A vantagem deste modelo é a possibilidade de implementar aplicações multithreads mesmo em S.O. que não suportam threads. • TMU possuem uma grande limitação, pois o S.O. gerencia cada processo como se existisse apenas um único thread. • No momento em que um thread entra numa rotina de espera, todo o processo é colocado em modo de espera, mesmo havendo outros threads prontos para execução. 23 Thread 4 Thread 3 Thread 2 Thread 1 Thread 0 Threads em modo usuário Modo usuário Biblioteca Kernel Modo kernel 24 12 Threads em modo kernel • Threads em modo kernel (TMK) são implementados diretamente pelo núcleo do S.O., através de chamadas de rotinas do S.O. • O S.O. sabe da existência de cada thread e pode escaloná-los individualmente. No caso de múltiplos processadores, os threads de um mesmo processo podem ser executados simultaneamente. • O grande problema do TMK é o seu baixo desempenho. • Pacotes em modo kernel utilizam chamadas a rotinas do sistema e, consequentemente, várias mudanças no modo de acesso. 25 Kernel Thread 4 Thread 3 Thread 2 Thread 1 Thread 0 Threads em modo kernel Modo usuário Modo kernel 26 13 Threads em modo híbrido • Threads em modo híbrido combinam as vantagens da TMU e TMK. • Um processo pode ter vários TMKs e, por sua vez, um TMK pode ter vários TMUs. • O núcleo do sistema reconhece os TMKs 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. • Apresenta os problemas herdados de ambas as implementações. 27 TMU 5 TMU 4 TMU 3 TMU 2 TMU 1 TMU 0 Threads em modo híbrido Modo usuário Biblioteca TMK 0 TMK 1 TMK 2 TMK 3 Modo kernel Kernel 28 14 Scheduler Activations • Os problemas apresentados no pacote de threads em modo híbrido existem devido à falta de comunicação entre os threads em modo usuário e modo kernel. • O modelo ideal deveria utilizar as facilidades do pacote em modo kernel com o desempenho e a flexibilidade do modo usuário. • O sheduler activations combina o melhor das duas arquiteturas, mas ao contrário de dividir os threads em modo usuário e kernel, o núcleo do S.O. troca informações com as bibliotecas de threads utilizando uma estrutura de dados. 29 Thread 4 Thread 3 Thread 2 Thread 1 Thread 0 Scheduler Activations Modo usuário Biblioteca Kernel Modo kernel 30 15 Prof. André Luís Belini E-mail: [email protected] Blog: http://profandreluisbelini.wordpress.com/ 16