Sistemas Operacionais Aula 9 Threads Prof.: Edilberto M. Silva http://www.edilms.eti.br Baseado no material disponibilizado por: SO - Prof. Edilberto Silva Prof. José Juan Espantoso Threads Uma thread (ou um processo leve) é uma unidade básica de utilização da CPU; ela consiste de: – Contador de programas – Conjunto de registradores – Espaço de pilha Uma thread compartilha com seus pares (outras threads vinculadas): – Seção de código – Seção de dados – Recursos do sistema operacional Coletivamente conhecida como uma tarefa (task). SO - Prof. Edilberto Silva 2 Threads Modelo de Threads (a) 3 processos, cada um com uma thread (b) 1 processo com 3 Threads SO - Prof. Edilberto Silva 3 Modelo de Threads Itens compartilhados por todos as threads em um processo Itens privados de cada thread SO - Prof. Edilberto Silva 4 Modelo de Threads Cada Thread possui sua própia pilha (stack) SO - Prof. Edilberto Silva 5 Uso de Threads Um editor de texto com três threads SO - Prof. Edilberto Silva 6 Uso de Threads Um servidor Web com Threads SO - Prof. Edilberto Silva 7 Uso de Threads Rough outline of code for previous slide (a) Thread para disparo (b) Thread trabalhadora SO - Prof. Edilberto Silva 8 Ambiente Multithread Aplicação multithread Pro ce sso E s p a ç o d e e n d e r e ç a m e n to V a riá v e is P r o g r a m a P r in c ip a l PC SP C a ll S u b _ 1 T h re a d _2 Su b _1 PC SP T h re a d _3 Su b _2 PC SP C o n te x t o d e H a rd w a re F im C o n te x t o d e H a rd w a re C a ll S u b _ 2 Ret Ret ... Neste processo os três threads são executados concorrentemente. T h re a d _1 C o n te x to d e H ardw are ... Na figura ao lado, existe um programa principal que realiza a chamada de duas sub-rotinas assíncronas (Sub_1 e Sub2). Inicialmente, o processo é criado apenas com o Thread_0 para execução do programa principal. Quando o programa principal chama as sub-rotinas, são criados os thread_1 e Thread_2. SO - Prof. Edilberto Silva 9 Ambiente Multithread Benefícios de programação com múltiplos threads: Capacidade de resposta – o multithreading de uma aplicação interativa pode permitir que um programa continue executando mesmo se parte dele estiver bloqueada ou executando uma operação demorada, aumentando assim, a capacidade de resposta ao usuário. Por exemplo, um navegador web com múltiplos threads poderia permitir a interação do usuário em um thread enquanto uma imagem está sendo carregada em outro thread Compartilhamento de recursos – os threads compartilham a memória e os recursos do processo aos quais pertencem. O Compartilhamento de código permite que uma aplicação tenha vários threads diferentes todos dentro do mesmo espaço de enderaçamento SO - Prof. Edilberto Silva 10 Ambiente Multithread Benefícios de programação com múltiplos threads: Economia – alocar memória e recursos para a criação de processo é caro. Como os threads compartilham recursos do processo, é mais econômico criar e realizar a troca de contexto de threads. No Solaris criar um processo é quase 30 vezes mais lento do que criar um thread, e a troca de contexto é cinco vezes mais lenta Utilização de arquiteturas de multiprocessador – os benefícios são expandidos em arquitetura multiprocessador, na qual cada thread pode estar executando em paralelo em um processador diferente SO - Prof. Edilberto Silva 11 Ambiente Multithread Aplicação multithread (a) T h r e a d d e e n tr a d a Bu ffe r T h r e a d d e e x ib iç ã o T h r e a d d e g ra v a çã o SO - Prof. Edilberto Silva 12 Ambiente Multithread Aplicação multithread (b) P r o c e s s o s e r v id o r S o lic ita ç õ e s T h re a d Th re a d Th re a d P r o c e s s o c lie n t e P r o c e s s o c lie n t e P r o c e s s o c lie n t e SO - Prof. Edilberto Silva 13 Arquitetura e Implementação Pode ser fornecido suporte a threads no nível do usuário, para threads de usuário, ou pelo kernel, para threads de kernel SO - Prof. Edilberto Silva 14 Arquitetura e Implementação Threads em modo usuário são suportados acima do kernel e são implementados por uma biblioteca no nível do usuário (criação, escalonamento e gerência de thread, sem suporte do kernel) todas as atividades são feitas no espaço de usuário, sem necessidade de intervenção do kernel. Portanto, os threads de usuário são rápidos de criar e gerenciar; no entanto, apresenta desvantagens. Por exemplo, se o kernel tiver um único thread, qualquer thread de usuário realizando uma chamada bloqueante ao sistema causará o bloqueio de todo o processo, mesmo se houver outros threads disponíveis na aplicação SO - Prof. Edilberto Silva 15 T h re a d 4 Th re a d 3 Th re a d 2 T h r e a d 1 Th re a d 0 Threads em modo usuário Arquitetura e Implementação M odo u s u á rio B ib lio t e c a K e rn e l SO - Prof. Edilberto Silva M odo k e rn e l 16 Threads em modo kernel Arquitetura e Implementação São suportados diretamente pelo sistema operacional (criação, escalonamento e a gerência são feitos pelo kernel no espaço do kernel) Como a gerência é feita pelo s.o., os threads de kernel são geralmente mais lentos na criação e gerência do que os threads de usuário. No entanto, se um thread realizar uma chamada bloqueante ao sistema, o kernel poderá escalonar outro thread na aplicação para execução. Além disso, em ambientes multiprocessados, o kernel pode escalonar threads em diferentes processadores SO - Prof. Edilberto Silva 17 K e rn e l T h r e a d 4 T h r e a d 3 T h r e a d 2 T h r e a d 1 T h r e a d 0 Threads em modo kernel Arquitetura e Implementação M odo u s u á rio M odo k e rn e l •Windows NT, Solaris e Digital unix são sistemas operacionais que suportam threads de kernel. SO - Prof. Edilberto Silva 18 T M U 5 T M U 4 T M U 3 T M U 2 T M U 1 T M U 0 Threads em modo híbrido Arquitetura e Implementação M odo u s u á rio B ib lio t e c a TM K 0 TM K 1 TM K 2 K e rn e l TM K 3 M odo k e rn e l •Muitos sistemas fornecem suporte a threads de usuário e de kernel, resultando em diferentes modelos de multithreading. SO - Prof. Edilberto Silva 19 Threads de Java Como visto o suporte para threads é fornecido pelo sistema operacional ou por uma biblioteca de threads. Por exemplo, a biblioteca win32 fornece um conjunto de APIs para efetuar multithreading em aplicações nativas do windows e Pthreads fornece uma biblioteca de funções de gerência de threads para sistemas compatíveis com POSIX Java fornece suporte no nível da linguagem para criação e geração de threads Todos os programas Java consistem em pelo menos um thread de controle. Um programa Java com apenas um método main() executa com um único thread na JVM Uma forma de criar um thread explicitamente é criar uma nova classe derivada da classe thread e redefinir o método run() SO - Prof. Edilberto Silva 20 Thread em Java Exemplo de criação de thread pela extensão da classe Thread class Worker1 extends Thread { public void run( ) { system.out.println(“I am a worker thread”); } } Public class First { public static void main)String args [ ]){ worker1 runner = new Worker1( ); runner.start( ); System.out.println(“I am The Main Thread”); } { SO - Prof. Edilberto Silva 21 Thread em Java Além de um programa Java que contém vários threads, existem threads executando assincronamente para a JVM que tratam de tarefas ao nível de nível A especificação JVM não indica como os threads serão mapeados no sistema operacional, isso depende de cada JVM em particular Em geral, um thread Java é considerado um thread de usuário, e a JVM é responsável pela gerência dos threads. O windows NT utiliza o modelo um-para-um, ou seja, cada thread Java para uma JVM executando no NT é mapeada em um thread de Kernel. O solaris 2 inicialmente implementou a JVM em muitos-para-um (threads verdes – Sun). Na versão 2.6, JVM 1, é utilizado o modelo muitos-para-muitos SO - Prof. Edilberto Silva 22