Baixe o app para aproveitar ainda mais
Prévia do material em texto
Universidade Federal de Ouro Preto - UFOP Departamento de Computação e Sistemas - DECSI CSI437 – Sistemas Operacionais Prof. Samuel Brito Threads Referência: Capítulo 4 do livro Sistemas Operacionais com Java (7ª edição) 2 Introdução • O modelo de processo apresentado nas aulas anteriores considerava que o processo era um programa em execução com uma única thread de controle. – Sistemas operacionais modernos fornecem recursos permitindo que um processo tenha diversas threads de controle. – Multithreading - multitarefa. • Multithreading pode ser suportada por um computador com uma única CPU? – Sim! – Threads executam de forma concorrente! 3 Visão Geral • Processo: – Programa em execução. – Espaço de endereçamento. – Recursos de sincronização e comunicação. – Recursos de mais alto nível. • Thread (Linha ou Encadeamento de execução): – Forma de um processo dividir a si mesmo em duas ou mais tarefas que podem ser executadas concorrentemente. – Fluxo de controle de instruções. – Compartilham recursos do processo. – Objetivo: • Maximizar o grau de execução concorrente. – Sobreposição de E/S e processamento. 4 Visão Geral • Uma thread é uma unidade básica de utilização de CPU. – ID de thread – Contador de programa – Conjunto de registradores – Pilha • Compartilha com outras threads pertencentes ao mesmo processo: – Seção de código – Seção de dados – Outros recursos (arquivos abertos, sinais, etc.) 5 Visão Geral • Um processo tradicional (ou pesado) possui uma única thread de controle. – Múltiplas threads de controle permitem realizar mais de uma tarefa ao mesmo tempo. Processo dotado de única thread Processo dotado de múltiplas threads 6 Motivação • Muitos pacotes de software executados nos computadores modernos são dotados de múltiplas threads. – Um processo, várias threads de controle. – Exemplos: • Navegador Web – Uma thread exibindo imagens ou texto. – Outra thread recebe dados da rede. • Processador de textos – Uma thread para exibir gráficos. – Outra thread para ler os toques de tecla do usuário. – Uma terceira thread para verificação ortográfica e gramatical. 7 Motivação • Criação de processos é demorada e exige muitos recursos. – Exemplo: • Servidor Web – Vários clientes fazendo requisições concorrentemente. – Um processo tradicional atenderia uma única requisição por vez. – Solução inicial: criar um processo para atender cada requisição. – Se o novo processo tiver de realizar as mesmas tarefas do processo existente, por que incorrer em um custo adicional? • Solução é a utilização de múltiplas threads. 8 Motivação • Threads também estão presentes no kernel dos sistemas operacionais modernos. – Realizam tarefas específicas: • Gerenciamento de dispositivos, gerenciamento de memória, tratamento de interrupções, etc. – Exemplos: • Solaris cria um conjunto de threads no kernel especificamente para o tratamento de interrupções. • Linux utiliza uma thread no kernel para gerenciar a memória livre. 9 Benefícios da Utilização de Threads 1. Capacidade de resposta: – Uso de threads em uma aplicação interativa pode permitir que um programa continue funcionando mesmo que parte dele esteja bloqueada ou realizando uma operação longa. • Exemplo: – Usuário clica em um botão que causa a execução de uma operação demorada. – Aplicação com uma única thread deixaria de responder ao usuário até que a operação fosse concluída. » Se a operação demorada for executada em uma thread separada, a aplicação continuará respondendo ao usuário. 10 Benefícios da Utilização de Threads 2. Compartilhamento de recursos: – Processos só podem compartilhar recursos por meio de técnicas como memória compartilhada e troca de mensagens. • Tarefa do programador. – Threads compartilham memória e outros recursos do processo ao qual pertencem. – Uma aplicação pode ter várias threads de atividades diferentes dentro do mesmo espaço de endereços. 11 Benefícios da Utilização de Threads 3. Economia: – Alocação de memória e recursos para a criação de processos é dispendiosa. – Mais econômico criar e trocar o contexto das threads. • No Solaris a criação de um processo é cerca de trinta vezes mais lenta do que a criação de uma thread. – Troca de contexto é 5 vezes mais lenta. 4. Utilização de arquiteturas multiprocessadas: – Benefícios do uso de threads em uma arquitetura multiprocessada pode ser muito maior. • Threads executadas em paralelo nos diferentes processadores. • Aumenta a concorrência. – Processo com uma única thread só pode ser executado em um processador, mesmo em um ambiente mulitprocessado. 12 Tipos de Paralelismo • Paralelismo de dados: – Distribuição de subconjuntos dos mesmos dados por múltiplos núcleos de computação. • Mesma operação em cada núcleo. – Exemplo: • Somar os conteúdos de um vetor de tamanho N. – Um processador: » Somar todos os elementos de 0 a N-1. – Dual-core: » Núcleo 0 executaria operações de 0 a N/2 -1. » Núcleo 1 executaria operações de N/2 a N - 1 13 Tipos de Paralelismo • Paralelismo de tarefas: – Distribuição de tarefas (threads) em vários núcleos de computação separados. • Diferentes threads podem estar operando sobre os mesmos dados ou sobre dados diferentes . – Exemplo: • Calcular a média aritmética e a mediana de um vetor de tamanho N. – Uma thread para calcular a média e outra para calcular a mediana. MODELOS DE MÚLTIPLAS THREADS Threads 15 Multithreading • Threads de usuário vs Threads de kernel: – Implementações com compromissos diferentes. • Threads de usuário: – Executa em modo usuário. – Uma biblioteca é responsável por gerenciar essas threads. • Criar, remover, escalonar, etc. – O núcleo do S.O. não interfere nas threads. – Exemplo: • Posix Pthreads, Java Threads, etc. 16 Multithreading • Threads de kernel: – O núcleo oferece suporte a threads. – Gerenciadas diretamente pelo S.O. • Chamadas de sistema. • Mais lentas que threads de usuário. – Exemplo: • Windows, Solaris, Linux, etc. 17 Multithreading Thread de usuário Threads de kernel 18 Multithreading • Threads em modo híbrido: – Combina as vantagens das threads de usuário e kernel. – Maior flexibilidade. – Mapeamento entre os dois níveis de threads varia entre sistemas e tem compromissos diferentes. • Veremos a seguir 3 formas comuns de estabelecer esse relacionamento. 19 Mapeamento Muitos para Um • Associa muitas threads do nível usuário a uma thread de kernel. • Gerenciamento de threads é feito pela biblioteca de threads no espaço do usuário. – Cada processo pode ter seu próprio algoritmo de escalonamento interno para suas threads. • O processo inteiro será bloqueado se uma thread fizer uma chamada de sistema bloqueante. • Somente uma thread pode acessar o kernel por vez. – Threads não podem ser executadas em paralelo em multiprocessadores. • Threads podem ser implementadas em sistemas que não reconhecem threads. • Exemplos: – Solaris Green Threads, GNU Portable Threads. 20 Mapeamento Muitos para Um 21 Mapeamento Um para Um • A cada thread de usuário é associado uma thread de kernel. • Maior concorrência do que o modelo muitos para um. – Permite que outra thread seja executada quando uma faz chamada de sistema bloqueante. – Várias threads executando em paralelo nos ambientes multiprocessados. • A criação de uma thread de usuário requer a criação de uma thread de kernel. – Custo adicional na criação. – Implementações desse modelo normalmente restringem o número de threads que podem ser criadas. • Linux e Windows implementam o mapeamento um para um. 22 Mapeamento Um para Um 23 Mapeamento Muitospara Muitos • Multiplexa muitas threads do nível do usuário para um número menor ou igual de threads de kernel. – Número de threads de kernel pode ser específico a determinada aplicação ou determinada máquina. • Desenvolvedores podem criar quantas threads forem necessárias. – Threads de kernel correspondentes podem ser executadas em paralelo em um sistema multiprocessado. – Quando uma thread realiza uma chamada de sistema bloqueante, o kernel pode escalonar outra thread. • Exemplos: – Solaris antes da versão 9. – Windows NT/2000: pacote ThreadFiber. – Linux: PThreads. 24 Mapeamento Muitos para Muitos 25 Mapeamento em Dois Níveis • Similar ao mapeamento muito para muitos, porém permite que uma thread do usuário seja associada a uma thread do núcleo. • Exemplos – IRIX, HP-UX, Tru64 UNIX, Solaris 8 e anteriores. 26 Mapeamento em Dois Níveis ASPECTOS DO USO DE THREADS Threads 28 Aspectos do uso de threads • Alguns aspectos devem ser considerados com programas dotados de múltiplas threads: – Chamadas de sistema fork e exec. – Cancelamento de threads. – Tratamento de sinais. – Bancos de threads. – Dados específicos da thread – Ativações do escalonador. 29 Chamadas de Sistemas fork e exec • A semântica das chamadas de sistema fork e exec muda em um programa dotado de múltiplas threads. • Se uma thread em um programa chamar fork, o novo processo duplica todas as threads ou o novo processo possui uma única thread? – Duas versões de fork. • Uma que duplica todas as threads. • Outra que duplica apenas a thread que invocou a chamada de sistema fork. 30 Chamadas de Sistemas fork e exec • A chamada de sistema exec continua com o mesmo funcionamento: – Se uma thread faz a chamada de exec, o programa especificado no parâmetro de exec substituirá o processo inteiro, incluindo todas as threads. • Análise deve ser feita para se saber quando usar cada chamada. 31 Cancelamento • O cancelamento da thread é a tarefa de terminar uma thread antes de ela ter sido concluída. – Exemplos: • Várias threads estiverem pesquisando em um banco de dados e uma retornar o resultado, as restantes poderão ser canceladas. • Usuário pressiona um botão em um navegador Web que interrompe a carga do restante da página. 32 Cancelamento • Thread-alvo (target thread): – Uma thread que precisa ser cancelada. • O cancelamento de uma thread-alvo pode ocorrer em dois cenários diferentes: – Cancelamento assíncrono: • Uma thread termina imediatamente a thread alvo. – Cancelamento adiado: • A thread-alvo pode verificar periodicamente se deve terminar, permitindo a oportunidade de terminar de forma controlada. • Cancelamento de forma assíncrona pode não liberar todos os recursos necessários no nível de sistema. 33 Tratamento de sinais • Sinais são utilizados em sistemas UNIX para notificar a um processo a ocorrência de um determinado evento. • Todos os sinais seguem o mesmo padrão: – São gerados por um evento particular. – São entregues a um processo. – São manipulados pelo processo. • Opções: – Entregar o sinal para a thread a qual ele se aplica. – Entregar o sinal para todas as threads do processo. – Entregar o sinal para certas threads do processo. – Escolher uma thread específica para receber todos os sinais do processo. 34 Bancos de Threads • Bancos de threads (pools de threads): – Criar uma série de threads e colocá-las em um banco, no qual fiquem esperando para executar. – Quantidade de threads pode ser definida heuristicamente. • Vantagens: – Geralmente é um pouco mais rápido requisitar uma thread já existente do que criar uma nova thread. – Permite que o número de threads na(s) aplicação(ões) seja limitado ao tamanho do banco. 35 Dados Específicos da Thread • Threads pertencentes a um mesmo processo compartilham os dados deste processo. – Cada thread pode precisar de sua própria cópia de certos dados. • Dados específicos. • Exemplo: – Em um sistema de processamento de transações, poderíamos atender a cada transação em uma thread separada. – Cada transação recebe um identificador exclusivo. » Dado específico da thread. • Bibliotecas de threads mais comuns disponibilizam meios de se armazenar dados específicos de uma thread. – Pthreads, Win32, Java Threads, etc. 36 Ativações do Escalonador • Os mapeamentos de threads muitos para muitos e de dois níveis exigem comunicação para manter o número apropriado de threads de kernel alocados à aplicação. • Ativações do escalonador oferece upcalls – um mecanismo de comunicação do kernel para a biblioteca de threads. – Essa comunicação permite que uma aplicação mantenha o número correto de threads do kernel. 37 Dúvidas? Slide 1 Introdução Visão Geral Visão Geral Visão Geral Motivação Motivação Motivação Benefícios da Utilização de Threads Benefícios da Utilização de Threads Benefícios da Utilização de Threads Tipos de Paralelismo Tipos de Paralelismo Modelos de múltiplas threads Multithreading Multithreading Multithreading Multithreading Mapeamento Muitos para Um Mapeamento Muitos para Um Mapeamento Um para Um Mapeamento Um para Um Mapeamento Muitos para Muitos Mapeamento Muitos para Muitos Mapeamento em Dois Níveis Mapeamento em Dois Níveis Aspectos do uso de threads Aspectos do uso de threads Chamadas de Sistemas fork e exec Chamadas de Sistemas fork e exec Cancelamento Cancelamento Tratamento de sinais Bancos de Threads Dados Específicos da Thread Ativações do Escalonador Dúvidas?
Compartilhar