Baixe o app para aproveitar ainda mais
Prévia do material em texto
Unidade IV: Threads INSTITUTO DE CIÊNCIAS EXATAS E NATURAIS FACULDADE DE COMPUTAÇÃO BACHARELADO EM CIÊNCIA DA COMPUTAÇÃO SISTEMAS OPERACIONAIS Profª. Fabíola Araújo fpoliveira@ufpa.br Objetivos desta Unidade... ▪ Introduzir o conceito de thread – uma unidade básica de utilização da CPU que forma a base dos sistemas de computação multithread; ▪ Discutir as APIs das bibliotecas de threads: Pthreads, Win32 e Java; ▪ Examinar questões relacionadas à programação multithreaded; ▪ No final da década de 70, os S.O. suportavam apenas processos com um único thread (monothread), ou seja, um processo com apenas um único programa fazendo parte do seu contexto. ▪ Em 1979, é introduzido o conceito de lightweight (processo leve) – Espaço de endereçamento de processo era compartilhado por vários programas. ▪ Em 1980, ficou clara a divisão entre o conceito de processo e thread, com o desenvolvimento do sistema Mach; • Conceito de multithread → Possibilidade de projetar e implementar aplicações concorrentes mais eficientes. • Threads de um mesmo processo → compartilham o mesmo espaço de endereçamento. Introdução • Exemplos de programas multithreads ○ O usuário edita o arquivo enquanto ele está sendo carregado do disco. ○ Processamento assíncrono através do salvamento periódico. Introdução ▪ Exemplos de programas multithreads • Navegador (browser) ○ Faz o download de vários arquivos simultâneos, gerenciando as diferentes velocidades de cada servidor, permitindo que o usuário continue interagindo, mudando de página enquanto os arquivos estão sendo carregados. • Programas numéricos (ex: multiplicação de matrizes) ○ Cada elemento da matriz produto pode ser calculado independentemente dos outros, podendo ser facilmente calculados por threads diferentes. Introdução ▪ Um processo suporta apenas um programa no seu espaço de endereçamento. ▪ Permite dividir uma aplicação em partes que podem trabalhar de forma concorrente. ▪ A concorrência é implementada apenas com o uso de múltiplos processos independentes ou subprocessos. ▪ Compartilham o mesmo espaço de endereçamento e com isso a comunicação é mais rápida, não envolvendo mecanismos lentos de intercomunicação entre processos. ▪ O processo é ao mesmo tempo a unidade de alocação de recursos e a unidade de escalonamento. Ambientes Monothreads Software de Gerenciamento de e-mails subprocessos Processo independente Enviar Receber Armazenar Mensagens Antigas Aplicação Concorrente Ambientes Monothreads ▪ Desvantagens: • Consumo de diversos recursos do sistema: ✔ Tempo de processador: Alocar e desalocar recursos para criação/término de cada processo. ✔ Comunicação: Cada processo possui seu próprio espaço de endereçamento. Ex.: MS-DOS, Windows (primeiras versões) Ambientes Monothreads ▪ Um Thread é uma unidade básica de utilização da CPU; É uma sub-rotina de um programa que pode ser executada de forma assíncrona, ou seja, executada paralelamente/concorrentemente ao programa chamador. ▪ É composta por um ID de Thread, um contador de programa, um conjunto de registradores e uma pilha; ▪ Ele compartilha com outras Threads pertencentes ao mesmo processo, sua seção de código, a seção de dados e outros recursos do Sistema Operacional; Ambientes Multithreads ❑ Conceito Básico: ▪ Dependendo da implementação de thread para determinada plataforma, os threads podem ser gerenciados pelo sistema operacional ou pela aplicação do usuário que o cria. ▪ Embora muitos sistemas operacionais suportem threads, as implementações variam consideravelmente. Ambientes Multithreads ❑ Conceito Básico: ▪ Não existe a ideia de programas associados a processos, mas, sim, a threads. Contexto de Software Espaço de Endereçamento Contexto de Hardware Contexto de Hardware Contexto de Hardware Thread 1 Thread 2 Thread 3 Ambientes Multithreads ❑ Motivação na Criação de Thread ▪ Projeto de software: Devido à modularidade e ao projeto de compiladores, possibilidade de executar segmentos de códigos independentemente do restante da aplicação. ▪ Desempenho: Execução paralela pode reduzir significativamente o tempo requerido para uma aplicação multithread concluir sua tarefa. ▪ Cooperação: Os threads de processos podem se comunicar usando seu espaço de endereçamento compartilhado. Ambientes Multithreads ▪ Capacidade de Resposta: Permite que um programa continue a ser executado mesmo se parte dele estiver bloqueada ou estiver executando uma operação demorada, aumentando a capacidade de resposta para o usuário; ▪ Compartilhamento de Recursos: Threads compartilham a memória e os recursos do processo ao qual pertencem; ▪ Economia: Diminuição do overhead na criação, troca, eliminação e gerência de processos. ▪ Escalabilidade: Possibilidade de resposta de várias solicitações paralelamente em uma arquitetura com vários processadores (núcleos); Ambientes Multithreads ❑ Benefícios no uso de Threads Ambientes Multithreads Execução em um Ambiente com um único núcleo Execução em um Ambiente com vários núcleos ❑ Escalabilidade (Arquiteturas Multicore) ▪ Implementação interna de Threads: utiliza o TCB (Bloco de Controle de Threads) → Contexto de hardware e informações exclusivas de cada thread. ▪ Permite separar a unidade de alocação de recursos da unidade de escalonamento. Ambientes Multithreads ❑ Vantagens do uso de Threads Unidade de alocação de recursos C.S. E.E. C.H. C.H. C.H. Thread 1 Thread 2 Thread 3 Unidade de escalonamento Thread 1 Thread 2 Thread 3 SO seleciona um dos threads e não um processo. Ambientes Multithreads ▪ Não existe qualquer proteção no acesso à memória → um thread pode alterar facilmente dados de outro. ▪ Ambientes cliente-servidor: Threads são essenciais para solicitação de serviços remotos. E.E. C.H. C.H. C.H. Thread 1 Thread 2 Thread 3 solicitação Thread 1 Thread 2 Thread 3 Ambientes Multithreads ❑ Compartilham o mesmo espaço de endereçamento: Ambientes Multithreads ▪ É vantagem um servidor criar um novo thread a cada nova solicitação que chegar? 1. Tempo necessário para a criação da thread antes do atendimento da solicitação; 2. Qual o limite para a quantidade de threads ativas concorrentes no sistema? (quantidades muito grandes podem exaurir os recursos do sistema); ❑ Ambientes Cliente-Servidor: Ambientes Multithreads ▪ Uma solução para esse problema é usar um pool de threads; 1. O atendimento de uma solicitação com um thread existente é mais rápido do que esperar a criação de uma nova thread; 2. Um pool de threads limita a quantidade de threads existentes em qualquer ponto do sistema; ▪ A quantidade de threads pode ser configurada heuristicamente com base em fatores como: • Quantidade de CPUs; • Quantidade de memória física; • Quantidade de solicitações de clients concorrentes esperada; ❑ Ambientes Cliente-Servidor: Ambientes Multithreads ❑ Ambientes Cliente-Servidor (pool de threads) Ambientes Multithreads ❑ Ciclo de vida de um Thread: Ambientes Multithreads ❑ Ciclo de vida de um Thread em Java: Arquitetura de Implementação ▪ As implementações de threads variam entre SO, mas quase todos os sistemas suportam algum sistema primário de funcionamento de threads; ▪ Essas implementações de pacotes de threads influenciará no desempenho, na concorrência e na modularidade das aplicações multithread; ▪ Os pacotes podem ser oferecidos por uma biblioteca de rotinas fora do núcleo do SO, pelo próprio núcleo do sistema, uma combinação de ambos ou por um modelo diferente dos anteriores: 1. Modo Usuário; 2. Modo Kernel; 3. Modo Híbrido; 4. Scheduler Activations; 1. Theads – MODO USUÁRIO (TMU) ▪ São implementados pela aplicação e não pelo S.O.; ▪ Utiliza biblioteca de rotinas; ▪ S.O. não sabe da existência de multithreads ⇒ responsabilidade exclusiva da aplicação gerenciar e sincronizar. BIBLIOTECA KERNEL Th re ad 1 Th re ad2 Th re ad 3 Th re ad 4 Th re ad 5 Th re ad 6 Modo Usuário Modo Kernel Arquitetura de Implementação Vantagens: ▪ Possibilidade de implementar aplicações multithreads mesmo em S.O. que não suportam threads; ▪ São rápidos e eficientes por dispensarem acesso ao kernel do S.O. ⇒ Evita a mudança de modo de acesso (usuário-kernel-usuário) Desvantagens: ▪ S.O. gerencia cada processo como se existisse um único thread; ✔ Thread chama rotina que coloca em estado de espera (bloqueante), todo o processo é colocado em espera; ✔ Sinais enviados para um processo devem ser reconhecidos e enviados para cada thread; ✔ Ambiente multiprocessado não é possível que múltiplos threads sejam executados em diferentes CPUs. 1. Theads – MODO USUÁRIO (TMU) Arquitetura de Implementação ▪ São implementados diretamente pelo núcleo do sistema operacional; ▪ O S.O. sabe da existência dos threads e pode escaloná-los individualmente, ou seja, o sistema operacional pode executar os threads prontos de um processo mesmo que um de seus threads esteja bloqueado; ▪ Múltiplos processadores: threads de um mesmo processo podem ser executados simultaneamente. 2. Theads – MODO KERNEL (TMK) Arquitetura de Implementação Desvantagens: ▪ Baixo Desempenho ⇒ Mudanças de modo de acesso (usuário-kernel-usuário). ▪ Softwares que empregam threads de núcleo são menos portáveis: Adaptar o programa para cada API de thread para cada sistema operacional em que executar. 2. Theads – MODO KERNEL (TMK) Arquitetura de Implementação Modo Usuário KERNEL Modo Kernel TMK 0 TMK 1 TMK 2 TMK 3 TMK 4 TMU 0 TMU 1 TMU 2 TMU 3 TMU 4 ▪ Combina as vantagens de threads implementados em modo usuário e threads em modo kernel. KERNEL TM U 1 TM U 2 TM U 3 TM U 4 TM U 5 TM U 6 Modo Usuário Modo Kernel BIBLIOTECA TMK 0 TMK 1 TMK 2 TMK 3 TMK 4 ▪ Núcleo do SO reconhece os TMKs e pode escaloná-los individualmente. 3. Theads – MODO HÍBRIDO (TMH) Arquitetura de Implementação ▪ Um TMU pode ser executado em um TMK, em um determinado momento, e ser executado em outro em um instante seguinte; ▪ Desenvolvimento da aplicação baseado em TMUs e especifica quantos TMKs estão associados a cada processo; ▪ Problemas herdados de ambas implementações; ▪ Quando um TMK realiza uma chamada bloqueante, todos os TMUs relacionados a ele são colocados em estado de espera; ▪ TMUs que desejem utilizar vários processadores (ambiente multiprocessado) devem utilizar diferentes TMKs pois impacta no desempenho; 3. Theads – MODO HÍBRIDO (TMH) Arquitetura de Implementação Desvantagem: ▪ Implementa o melhor das duas arquiteturas (TMU e TMK). ▪ O núcleo do sistema troca informações com a biblioteca de threads utilizando uma estrutura de dados chamada Scheduler Activations. ▪ Evita a mudança de modo de acesso. ▪ A biblioteca de modo usuário e o kernel se comunicam e trabalham de forma cooperativa. ▪ Cada chamada implementa o seu escalonamento de forma independente, porém trocando informações quando necessário. 4. Theads – SCHEDULER ACTIVATIONS Arquitetura de Implementação KERNEL Modo Usuário BIBLIOTECA Th re ad 1 Th re ad 2 Th re ad 3 Th re ad 4 Th re ad 5 Th re ad 6 Modo kernel 4. Theads – SCHEDULER ACTIVATIONS Arquitetura de Implementação Modelos de Geração de Multithreads ▪ O suporte aos threads pode ser fornecido no nível de usuário, para threads de usuário; ou pelo kernel, para threads de kernel; ▪ Deve existir um relacionamento entre os threads de usuário e os threads de kernel; ▪ Existem três maneiras comuns de se estabelecer esse relacionamento: A. Modelo Muitos-para-um C. Modelo Muitos-para-muitos B. Modelo Um-para-Um Modelos de Geração de Multithreads A. Modelo Muitos-para-Um ▪ Mapeia muitos threads de nível de usuário para um thread de kernel; ▪ O gerenciamento de threads é feito pela biblioteca de threads no espaço do usuário; ▪ O processo inteiro será bloqueado se um thread fizer uma chamada de sistema bloqueadora; ▪ Somente um thread pode acessar o kernel de cada vez, muitos threads ficarão sem ser executados em paralelo nos vários processadores; ✔ Green Threads (Biblioteca de Threads - Solaris); ✔ GNU Portable Threads; Modelos de Geração de Multithreads B. Modelo Um-para-Um ▪ Mapeia um thread de nível de usuário para um thread de kernel; ▪ Permite que outro thread seja executado, se um thread fizer uma chamada de sistema bloqueadora; ▪ Permite que vários threads sejam executados em paralelo em vários processadores; ▪ Desvantagem: A criação de um thread de usuário requer a criação do thread de kernel correspondente; • O overhead de criação de thread de kernel pode sobrecarregar o desempenho de uma aplicação; • A maioria das implementações desse modelo restringe a quantidade de threads suportados pelo sistema; Modelos de Geração de Multithreads C. Modelo Muitos-para-Muitos ▪ Conecta muitos threads de nível de usuário a uma quantidade menor ou igual de threads de kernel; ▪ A quantidade de threads de kernel pode ser específica de uma determinada aplicação ou máquina; ▪ Os desenvolvedores podem criar quantas threads de usuários forem necessárias e as threads de kernel correspondentes podem ser executadas em paralelo em um ambiente multiprocessador; ▪ Quando uma thread executa uma chamada de sistema bloqueadora, o kernel pode agendar outro thread para execução; Modelos de Geração de Multithreads C. 1. Modelo de Dois Níveis ▪ Conecta muitos threads de nível de usuário a uma quantidade menor ou igual de threads de kernel; ▪ Também permite que um thread de nível de usuário seja limitada a um thread de kernel; ▪ Tem suporte em SO como o IRIX, o HP-UX e o Tru64 UNIX; Bibliotecas de Threads ▪ Uma biblioteca de threads fornece ao programador uma API para a criação e gerenciamento de threads; ▪ Como citado anteriormente, há duas maneiras de se implementar uma biblioteca de threads: no modo usuário e no modo kernel; ▪ Três bibliotecas de threads são as mais usadas atualmente: I. Pthreads do POSIX (padrão da IEEE); II. Win32 III. Java Bibliotecas de Threads I. Pthreads ▪ É o padrão POSIX (IEEE 1003.1c) que define uma API para a criação e sincronização de threads; ▪ Pode ser fornecida como uma biblioteca de nível de usuário ou de kernel; ▪ É uma especificação para o comportamento de threads, e não uma implementação (os projetistas de SO podem implementar a especificação como quiserem); ▪ Ex.: Solaris, o Linux, Mac OS X e o Tru64 UNIX; Bibliotecas de Threads II. Win32 ▪ É uma biblioteca de nível de kernel disponível em sistemas Windows; III. Java ▪ Permite que threads sejam criados e gerenciados diretamente em programas Java; ▪ Na maioria dos casos a JVM é executada acima de um SO hospedeiro, geralmente a API de threads Java é implementada no sistema hospedeiro; ▪ Em sistemas Windows, usa-se o Win32, e em sistemas UNIX e Linux costuma-se usar a biblioteca Pthreads; ▪ São interrupções geradas por softwares ou pelo sistema operacional, ou pelos processos usuários que notificam ao processo que um evento ocorreu. ✔ Sinal Síncrono: Ocorre como resultado direto de uma instrução executada pelo processo ou thread. ✔ Sinal Assíncrono: Ocorre devido a um evento não relacionado com a instrução corrente; esses sinais devem especificar um identificador (ID) de processo para indicar o receptor do sinal. Implementação de Threads ❑ Sinal de Thread: ▪ O desenvolvimento de aplicações multithreads não é simples, pois exige que a comunicação e o compartilhamento de recursos entre os diversos threads seja feito de forma sincronizada. ▪ Para obter os benefícios do uso de threads, uma aplicação deve permitir que partes diferentes do seu código sejam executadas em paralelo de forma independente. ▪ Os benefícios da criação de vários threads incluem o aumento da capacidade de resposta ao usuário, o compartilhamento de recursos dentro do processo, economiae questões relacionadas à escalabilidade com o uso eficiente de vários núcleos; Conclusão ▪ Questões sobre Threads ▪ Entrega pelo SIGAA. ❑ EXERCÍCIO Atividade 04
Compartilhar