Baixe o app para aproveitar ainda mais
Prévia do material em texto
CCT0011 – Sistemas Operacionais Aula 04 – Threads Sistemas Operacionais Revisão Um programa por si só não é um processo, é uma entidade passiva, enquanto o processo é uma entidade ativa. Processos são programas em execução, constituídos por: • código executável; • pilha de execução; • estado do processo; • prioridade do processo; • valor do contador de programa (PC); • valor do apontador de pilha (SP); • valores de demais registradores . Sistemas Operacionais Revisão Um programa é carregado para a memória onde aloca determinada área para código e dados. Sistemas Operacionais Revisão Um processo é formado por três partes, conhecidas como contexto de hardware, contexto de software e espaço de endereçamento. Juntas elas mantêm todas as informações necessárias à execução de um programa. Sistemas Operacionais Threads - Introdução Até a década de 70 os sistemas operacionais suportavam apenas processos com um único thread, ou seja, um processo com apenas um único fluxo de execução em seu contexto. Em meados de 1980 foi introduzido o conceito onde o espaço de endereçamento de um processo era compartilhado por vários programas. A partir do conceito de múltiplos threads é possível projetar e implementar aplicações concorrentes de forma eficiente, pois um processo pode ter partes diferentes do seu código sendo executadas em paralelo. Com menor overhead do que utilizando múltiplos processos. Sistemas Operacionais Threads - Introdução Um thread é uma unidade básica de utilização de CPU e compreende: • ID de thread; • contador de programa; • conjunto de registradores; • uma pilha. Um processo tradicional tem um único fluxo de controle. Sistemas Operacionais Threads - Introdução O modelo de processos é baseado em dois conceitos independentes: Agrupamento de recursos: • Espaço de endereçamento, arquivos abertos, etc. • Aglutinar estes recursos na forma de um processo facilita o gerenciamento destes recursos. Execução do processo: • Um contador de programa que aponta para a próxima instrução a ser executada. • Registradores, que contém as variáveis de trabalho atuais. • A pilha que traz a história da execução, com uma estrutura para cada rotina chamada mas ainda não terminada; Sistemas Operacionais Threads - Introdução O modelo de processos estudado supõe o uso de apenas um thread por processo com espaço de endereçamento único e um thread de controle. Exceto pelo espaço de endereçamento compartilhado. Intuitivamente, threads são como processos dentro de outro processo (são linhas/fluxo de execução). Thread é uma forma de um processo dividir a si mesmo em duas ou mais tarefas. Apesar de threads serem executadas em processos, ambos são conceitos diferentes e podem ser tratados separadamente. • Processos são usados para agrupar recursos. • Threads são as entidades escalonadas para usar a CPU. Sistemas Operacionais Benefícios dos Threads Podem ser divididos em quatro categorias básicas: Capacidade de resposta Pode permitir que um programa continue executando, mesmo se parte dele estiver bloqueada ou em uma operação demorada, aumentando a capacidade de resposta para o usuário. Compartilhamento de recursos Por default, os threads compartilham a memória e os recursos do processo aos quais pertencem, permitindo que uma aplicação tenha vários threads dentro do mesmo espaço de endereçamento. Sistemas Operacionais Benefícios dos Threads Economia Como threads compartilham recursos do processo é mais econômico criar e realizar a troca de contexto de threads. Criar e manter um processo, em vez de um thread, é mais demorado. Utilização de arquiteturas multiprocessador Os benefícios podem ser aumentados em uma arquitetura multiprocessador, na qual cada thread pode ser executado em paralelo em um núcleo/processador diferente. Em uma arquitetura mono processada, a CPU alterna entre cada thread tão rápido que existe a ilusão de paralelismo. Sistemas Operacionais Threads O modelo de threads permite que múltiplas execuções ocorram no mesmo ambiente de processo, com um grande grau de independência uma da outra. Threads são linhas de execução, e compreendem: • Id: identificador da thread • Endereço da próxima instrução a ser executada • Conjunto de registradores em uso • Uma pilha de execução Threads compartilham com outras threads recursos, como: • Trecho de código • Dados • Arquivos abertos Sistemas Operacionais Threads Um thread pode ser definido como uma sub-rotina de um programa que pode ser executada de forma assíncrona, ou seja, executada paralelamente ao programa chamador. O programador deve especificar os threads, associando-os às sub-rotinas assíncronas. Um ambiente multithread possibilita a execução concorrente de sub-rotinas dentro de um mesmo processo. Mas, quando é desejável utilizar mais de uma thread? Sistemas Operacionais Unidade de Alocação Ambientes Monothread O processo é ao mesmo tempo a unidade de alocação de recursos e a unidade de escalonamento. 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. Neste caso o sistema não seleciona um processo para a execução, mas um de seus threads. Sistemas Operacionais 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. Thread ThreadThread Sistemas Operacionais Ambiente Monothread A utilização de processos independentes e subprocessos permite dividir uma aplicação em partes que podem trabalhar de forma concorrente. Exemplo: aplicações gráfica, software de gerenciamento de e-mails. Um usuário pode ler suas mensagens antigas, e ao mesmo tempo enviar e receber novas mensagens. Subprocessos Processos Independentes Sistemas Operacionais Problemas com Ambientes Monothreads A utilização de processos no desenvolvimento de aplicações concorrentes demanda consumo de diversos recursos do sistema. Sempre que um processo é criado, o sistema deve alocar recursos para cada processo, consumindo tempo de processador neste trabalho. No caso do término do processo, o sistema dispensa tempo para desalocar recursos previamente alocados. Cada um possui contextos de hardware, software e de endereçamento próprios. Subprocessos Processos Independentes Como cada processo possui seu próprio espaço de endereçamento, a comunicação entre eles torna-se difícil e lenta, pois necessitaram utilizar mecanismos como pipes, semáforos, memória ou compartilhamento de mensagem. Sistemas Operacionais Ambiente Multithread Em um ambiente multithread, não existe a ideia de programas associados a processos, mas, sim a threads. O processo tem pelo menos um thread de execução, mas pode compartilhar o seu espaço de endereçamento com inúmeros outros threads. A utilização do processador, dos discos e de outros periféricos pode ser feita de forma concorrente pelos diversos threads, significando melhor utilização dos recursos computacionais disponíveis. Em algumas aplicações, a utilização de threads pode melhorar o desempenho da aplicação apenas executando tarefas em background enquanto operações de E/S estão sendo processadas. Sistemas Operacionais Ambiente Multithread Na figura ao ladoexiste apenas um processo com três threads de execução compartilhando o mesmo espaço de endereçamento e contexto de software. Desta forma o ambiente multithread possibilita a execução concorrente de sub- rotinas dentro de um mesmo processo. Sistemas Operacionais Ambiente Multithread Inicialmente, o processo é criado apenas com o thread1 para a execução do programa principal. Quando o programa principal chama as sub-rotinas Sub_1 e Sub_2, são criados os Thread_2 e Thread_3, e executados independentemente do programa principal. Espaço de endereçamento Processo Programa Principal C o n te x to d e H a rd w a re C o n te x to d e H a rd w a re C o n te x to d e H a rd w a re Call Sub_1 Call Sub_2 Thread_1 Thread_2 Thread_3 PC SP PC SP PC SP Fim Sub_2 Variáveis Ret Sub_1 Ret .. . .. . Sistemas Operacionais Ambiente Multithread Em ambiente cliente-servidor, threads são essenciais para solicitações de serviços remotos. Em ambiente monothread, uma solicitação a serviço remoto, pode ficar esperando indefinidamente, enquanto aguarda o resultado. Em ambiente multithread, um thread pode solicitar serviço remoto, enquanto a aplicação pode continuar realizando outras atividades. Para o processo que atende a solicitação, múltiplos threads permitem que diversos pedidos sejam atendidos simultaneamente. Sistemas Operacionais Ambiente Multithreads • Threads são implementados internamente através de uma estrutura denominada bloco de controle do thread (TCB). • O TCB armazena, além do contexto de hardware, mais algumas informações relacionadas exclusivamente ao thread, como, prioridade, estado de execução e bits de estado. • Em ambientes multithread, a unidade de alocação de recursos é o processo, e todos os seus threads compartilham espaço de endereçamento, descritores de arquivos e dispositivos de E/S. Por outro lado cada thread representa uma unidade de alocação independente que o SO seleciona para a execução Sistemas Operacionais Ambiente Multithreads - Características Cada processo pode responder a várias solicitações concorrentemente ou mesmo simultaneamente, caso haja mais de um núcleo/processador. Programas concorrentes implementando múltiplos threads são mais rápidos que programas concorrentes que implementam múltiplos processos. A grande vantagem no uso de threads é a possibilidade de minimizar a alocação de recursos do sistemas, além de diminuir o overhead na criação, troca e eliminação de processos. Threads compartilham o processador da mesma maneira que processos e passam pelas mesmas mudanças de estado (execução, espera e pronto). Sistemas Operacionais Ambiente Multithreads - Características Enquanto um thread espera por uma operação de E/S, outro pode ser executado. Para permitir a troca de contexto entre diversos threads, cada umpossui seu próprio contexto de hardware, com o conteúdo dos registrados gerais, PC (Program Counter) e SP (Stack Point). Quando um thread está sendo executado, seu contexto de hardware está carregado nos registradores do processador. No momento em que o thread perde a utilização da CPU, as informações são atualizadas e salvas no seu TCB. Sistemas Operacionais Ambiente Multithreads - Características Como não existe proteção no acesso a memória, por threads de um mesmo processo, é fundamental que a aplicação implemente mecanismos de comunicação e sincronização entre threads a fim de garantir o acesso seguro aos dados compartilhados. Implementação Tempo de Criação (µS) Tempo de Sincronização (µS) Processo 1700 200 Processo Lightweight 350 390 Thread 52 66 Latência de Processos e Threads Sistemas Operacionais Threads - Vantagens Tempo de resposta Uma aplicação interativa pode continuar sendo executada se parte dela está bloqueada, ou executando uma operação lenta. Compartilhamento de recursos Por padrão os threads compartilham: memória e qualquer recurso alocado pelo processo ao qual estão subordinadas. Não é necessária a alocação de mais recursos no sistema. Economia É mais econômico criar e trocar o contexto dos threads. Utilização de arquiteturas multiprocessadas Cada thread pode ser executada de forma paralela, em processadores distintos. Sistemas Operacionais Multithreads Sistemas Operacionais Arquitetura e Implementação Threads podem ser oferecidos em: • Modo Usuário Biblioteca de rotinas fora do núcleo do sistema operacional. • Modo Kernel Implementado pelo núcleo do sistema operacional • Modo Híbrido Por uma combinação de vantagens de ambos. Sistemas Operacionais Threads em Modo Usuário (TMU) TMU são implementados pela aplicação, acima do sistema operacional. Existe uma biblioteca de rotinas que possibilita à aplicação realizar tarefas como criação, gerência, troca de mensagens entre threads e uma política de escalonamento, sem suporte do kernel. É responsabilidade exclusiva da aplicação gerenciar e sincronizar os diversos threads existentes. SO não sabe da existência de múltiplos threads. Modo usuário Modo kernel Kernel Biblioteca Thr ead 0 Thr ead 4 Thr ead 3 Thr ead 2 Thr ead 1 Sistemas Operacionais Threads em Modo Usuário (TMU) A vantagem deste modelo é a possibilidade de implementar aplicações multithreads mesmo em sistemas operacionais que não suportam threads. Esta implementação é mais rápida e eficientes por dispensarem acessos ao kernel do sistema operacional, evitando assim a mudança de modo de acesso (usuário-kernel-usuário). Modo usuário Modo kernel Kernel Biblioteca Thr ead 0 Thr ead 4 Thr ead 3 Thr ead 2 Thr ead 1 Sistemas Operacionais Threads em Modo Usuário - Limitações Threads em modo usuário possuem uma grande limitação, pois o SO gerencia 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, todo o processo é colocado no estado de espera, mesmo havendo outros threads para execução. Para contornar esta limitação, a biblioteca tem que possuir rotinas que substituam as rotinas bloqueantes por outras que não possam causar o bloqueio de um thread. Sistemas Operacionais Threads em Modo Usuário - Limitações Todo este controle é transparente para o usuário e o sistema operacional. Um dos maiores problemas na implementação de threads em modo usuário, é o tratamento individual de sinais. No caso de interrupção de clock, fundamental para a implementação de tempo compartilhado, se torna uma limitação crítica. Neste caso, os sinais de temporização devem ser interceptados, para que se possa interromper o thread em execução e realizar a troca de contexto. Sistemas Operacionais Threads em Modo Usuário - Limitações Escalonamento em ambientes com múltiplos processadores não é possível para TMU de um mesmo processo. Não podem ser executados em CPUs diferentes simultaneamente. Esta restrição limita drasticamente o grau de paralelismo da aplicação, já que os threads de um mesmo processo podem ser executados em somente um processador de cada vez. Modo usuário Modo kernel Kernel Biblioteca Thr ead 0 Thr ead 4 Thr ead 3 Thr ead 2 Thr ead 1 Sistemas Operacionais Threads em Modo Usuário • As threads de usuário facilitam aspectos de portabilidade e são criadas e gerenciadas por uma biblioteca no nível do usuário. • O kernel não enxerga esses threads e, por esse motivo, não pode gerenciar individualmente. • Exemplos de bibliotecas de threads: POSIX Pthreads, Win32 threads, Java threads Sistemas Operacionais Threads em Modo Kernel TMK são implementados diretamente pelo núcleo do sistema operacional, através de chamadas a rotinas do sistema, que oferecem todas as funções de gerenciamento e sincronização. Enquanto nos pacotes em TMU todo tratamento é feito sem a ajuda do SO, ou seja sem a mudança do modo de acesso (usuário-kernel-usuário), pacotes em modo kernel utilizam chamadas a rotinas do sistema e consequentemente, várias mudanças de modo de acesso. SO pode escalonar cada thread individualmente. O grande problema para pacotes em modo kernel é o seu baixo desempenho. Modo usuário Modo kernelKernel Threa d 0 Threa d 4 Threa d 3 Threa d 2 Threa d 1 Sistemas Operacionais Threads em Modo Kernel Os threads em modo kernel são criados e gerenciados pelo núcleo do SO e não podem ser diretamente utilizadas pelo usuário. TMU não bloqueiam o processo quando entram em estado de espera. O suporte a múltiplos threads é uma característica do sistema operacional.P Implementação Operação 1 (µS) Operação 2 (µS) Subprocesso 11.300 1.840 Thread em Modo Kernel 948 441 Thread em Modo Usuário 34 37 Sistemas Operacionais Threads em Modo Híbrido A arquitetura de TMH combina as vantagens de threads implementados em modo usuário (TMU) e threads em modo kernel (TMK). Um processo pode ter vários TMKs e, por sua vez, um TKH pode ter vários TMUs. O modo híbrido apesar de maior flexibilidade, apresenta problemas herdados de ambas as implementações. Por exemplo, quando um TMK realiza uma chamada bloqueante, todos os seus TMUs são colocados no estado de espera. Modo usuário Modo kernel Kernel TMK 0 TMK 3TMK 2TMK 1 Biblioteca TM U 0 TM U 4 TM U 5 TM U 3 TM U 2 TM U 1 Sistemas Operacionais Threads em Modo Híbrido A associação entre threads de usuário e de kernel depende do sistema operacional. TMU: rápida criação e chaveamento entre threads. TMK: o processo todo não é bloqueado pelo bloqueio de uma thread. A ideia é utilizar algumas threads de núcleo e multiplexar threads de usuários sobre elas. O usuário decide quantas threads utilizar, tendo uma maior flexibilidade. Esta é a solução mais utilizada nos sistemas modernos. Sistemas Operacionais Processo Independentes, Subprocessos e Threads Processos independentes, subprocessos e threads são maneiras diferentes de implementar a concorrência dentro de uma aplicação. Nesse caso, busca-se subdividir o código em partes para trabalharem de forma cooperativa. Considere um banco de dados com produtos de uma grande loja, onde vendedores fazem frequentemente consultas. Neste caso, a concorrência na aplicação proporciona um tempo de espera menor entre as consultas, melhorando o desempenho da aplicação e beneficiando os usuários. Sistemas Operacionais Processo Independentes O uso de processos independentes é a maneira mais simples de implementar a concorrência em sistema multiprogramáveis. Neste caso, não existe vínculo do processo criado com o seu criador. A criação de um processo independente exige a alocação de um PCB, possuindo contextos de hardware, contextos de software e espaço de endereçamento próprios Sistemas Operacionais Subprocessos Subprocessos são processos criados dentro de uma estrutura hierárquica. Nesse modo o processo criador é denominado processo-pai, enquanto o novo processo é chamado de subprocesso ou processo-filho. O subprocesso, por sua vez, pode criar outras estruturas de subprocessos. Uma característica desta implementação é a dependência existente entre o processo criador e o subprocesso. Caso um processo pai deixe de existir, os subprocessos subordinados são automaticamente eliminados. Sistemas Operacionais Subprocessos De modo semelhante aos processos independentes, subprocessos possuem seu próprio PCB. Além da dependência hierárquica entre processos e subprocessos, uma outra característica neste tipo de implementação é que subprocessos podem compartilhar quotas com o processo pai. Neste caso, quando um subprocesso é criado o processo-pai cede parte de suas quotas ao processo-filho. Sistemas Operacionais Threads O conceito de thread foi introduzido na tentativa de reduzir o tempo gasto em criação, eliminação e troca de contexto de processos nas aplicações concorrentes, bem como economizar recursos do sistema como um todo. Em um ambiente multithread, um único processo pode suportar múltiplos threads, cada qual associado a uma parte do código da aplicação. Neste caso, não é necessário haver diversos processos para a implementação da concorrência. Sistemas Operacionais Threads Threads compartilham o processador da mesma maneira que um processo, ou seja, enquanto um thread espera por uma operação de E/S, outro thread pode ser executado. Cada thread possui seu próprio contexto de hardware, porém compartilha o mesmo contexto de software e espaço de endereçamento com os demais threads do processo. O compartilhamento do espaço de endereçamento permite que a comunicação de threads dentro do mesmo processo seja realizada de forma simples e rápida. A Pilha é uma área reservada para uso exclusivo. Não é permitido o compartilhamento da pilha entre as threads. Sistemas Operacionais Dúvidas
Compartilhar