Baixe o app para aproveitar ainda mais
Prévia do material em texto
Sistemas DistribuídosSistemas Distribuídos ComputaçãoComputação Aula 21-22: Suporte de Sistema OperacionalAula 21-22: Suporte de Sistema Operacional 2o. Semestre / 2014 Prof. Jesus I Suporte do sistema operacionalSuporte do sistema operacional ● Como middleware é auxiliado pelo sistema operacional ● Fornecer acesso a recursos de forma eficiente e robusta ● Oferecer flexibilidade com relação ao gerenciamento de recursos I Dois tipos de sistemas operacionaisDois tipos de sistemas operacionais ● Sistema operacional de rede – Windows, Linux e suas versões ● Possuem recursos para acessar rede em busca de recursos remotos ● Fornecem autonomia para gerenciar seus próprios recursos ● Múltiplas imagens de sistema I Dois tipos de sistemas operacionaisDois tipos de sistemas operacionais ● Sistema operacional distribuído ● Usuários rodam seus programas sem se preocupar com sua localização e como os recursos são obtidos e utilizados ● Sistema operacional possui controle sobre todos os nós do sistema ● Única imagem de sistema SO Distribuído vs. SO de RedeSO Distribuído vs. SO de Rede ● SO Distribuído – Sistema homogêneo – Imagem de sistema único – Gerenciamento de recursos global ● SO de Rede – Sistema heterogêneo – Computadores autônomos – Cada computador gerencia seus próprios recursos – Maioria dos SOs existentes hoje I SO Distribuído vs. SO de RedeSO Distribuído vs. SO de Rede ● Predominância dos SOs de rede ocorre principalmente por duas razões: – Usuários preferem SOs que dão suporte aos programas que atendem suas necessidades – Usuários preferem SOs que fornecem maior autonomia para suas máquinas ● A combinação de SOs de rede e middlewares oferece um melhor equilíbrio entre autonomia e compartilhamento de recursos I Camadas de sistemaCamadas de sistema ● Camada de SO: responsável por gerenciar recursos e fornecer uma interface para sua utilização. – Encapsulamento: fornece um conjunto de operações e oculta detalhes de gerenciamento e implementação de recursos – Proteção: contra acessos inválidos. Ex: usuários não autenticados – Concorrência: permitir que mais de um cliente tenha acesso aos recursos de forma transparente I Camadas do sistemaCamadas do sistema Applications, services Computer & Platform Middleware OS: kernel, libraries & servers network hardware OS1 Computer & network hardware Node 1 Node 2 Processes, threads, communication, ... OS2 Processes, threads, communication, ... I Mecanismo de invocaçãoMecanismo de invocação ● Clientes requisitam recursos localmente ou remotamente ● Necessária uma combinação de bibliotecas, kernel e processos servidores para atender as seguintes relacionadas com invocação: – Comunicação: parâmetros e resultados passados entre clientes e gerenciadores de recursos – Escalonamento: quando uma operação é requisitada, a mesma deve ser escalonada dentro do kernel ou processo servidor I Funcionalidade do SOFuncionalidade do SO Gerente de processos Gerente de Threads Gerente de memória Gerente de Comunicação Supervisor I Funcionalidade do SOFuncionalidade do SO ● Gerente de processos: cuida da criação e gerenciamento de processos ● Gerente de threads: criação, sincronização e escalonamento de threads ● Gerente de comunicação: cuida da comunicação de threads pertencentes a diferentes processos ● Gerente de memória: responsável pela memória física e virtual I Funcionalidade do SOFuncionalidade do SO ● Supervisor – Emite interrupções, chamadas de sistema e outras exceções – Controle de gerenciamento de memória e caches de hardware – Manipulação de registradores – No Windows é chamada de Camada de Abstração de Hardware I ProteçãoProteção ● Cada processo: um espaço de endereçamento separado – ambiente de execução com recursos (memória, sockets, arquivos abertos etc) de acesso restrito ao processo ● Proteção garantida pelo kernel ● Níveis de proteção típicos (Unix) – nível de kernel: acesso irrestrito – nível de usuário ● Um mesmo processo pode passar de um nível para outro através de interrupções (ou chamadas ao sistema) I Processos e Processos e threadsthreads ● Processo: ambiente de execução – Espaço de endereçamento – Recursos para sincronização e comunicação entre threads – Recursos de alto nível (arquivos abertos, janelas) ● Thread: atividade (“linha” de execução) – Uma ou múltiplas threads em um processo – Compartilham o espaço de endereçamento de um processo ● Sem proteção entre threads I Processos - Espaço de endereçamentoProcessos - Espaço de endereçamento ● Gerenciar memória virtual de um processo ● Constituída por regiões que são áreas da memória virtual acessíveis somente pelas threads do processo ● Regiões possuem as seguintes características: – Extensão (endereço mais baixo e tamanho) – Permissões de escrita/leitura/execução para threads – Se podem expandir para cima ou para baixo – Não se sobrepõem I Processos - Espaço de endereçamentoProcessos - Espaço de endereçamento Stack Text Heap Auxiliary regions 0 2N I Criação de processosCriação de processos ● Criação de um novo ambiente de execução – A partir de uma definição estática – A partir de uma cópia do espaço de endereçamento do processo pai (no caso de fork) I Criação de processosCriação de processos ● Cópia otimizada: uso da técnica de copy-on- write ● Memória virtual é copiada mas a memória física não ● Memória física só é copiada quando um dos processos (pai ou filho) tenta modificá-la. I Copy-on-writeCopy-on-write a) Before write b) After write Shared frame A's page table B's page table Process A’s address space Process B’s address space Kernel RA RB RB copied from RA I ProcessosProcessos ● Contexto: – estruturas de dados (variáveis em memória) – descritores de arquivos e sockets ● Atividade: – fluxo de execução – registradores, pilha de execução – outros recursos exclusivos para execução ● Alternar processos = trocar contextos ● Alternar threads = trocar atividades I ProcessosProcessos ● A troca de contexto é uma operação cara (+/- 10% do tempo de CPU) ● Para trocar de atividade, precisamos sempre trocar de contexto ? – Aplicações com concorrência interna ● Solução → threads: múltiplas atividades em um mesmo contexto I Processos com uma ou várias threadsProcessos com uma ou várias threads I ThreadsThreads ● Importantes na arquitetura dos componentes de software de sistemas distribuídos ● No Cliente: – Permitem que outras ações ocorram simultanea- mente com chamadas remotas bloqueantes ● No Servidor: – Permitem servir várias requisições (de vários ou do mesmo cliente) simultaneamente I Clientes e servidores com Clientes e servidores com threadsthreads Server N threads Input-output Client Thread 2 makes T1 Thread 1 requests to server generates results Requests Receipt & queuing I Arquiteturas para servidores com Arquiteturas para servidores com threadsthreads a. Thread-per-request b. Thread-per-connection c. Thread-per-object remote workers I/O remoteremote I/O per-connection threads per-object threads objects objects objects I Thread por requisiçãoThread por requisição ● Uma thread é criada para cada requisição ● Depois a thread é destruída quando a requisição é completada ● Não precisam disputar um espaço na fila e throughput otimizado ● Aumento na carga de processamento (overhead) I Thread por conexão e por objetoThread por conexão e por objeto ● Thread por conexão: – Uma thread é criada para cadaconexão – Depois a thread é destruída quando a conexão é encerrada ● Thread por objeto: – Uma thread para cada objeto remoto – Cada objeto remoto possui sua própria fila I Thread por conexão e por objetoThread por conexão e por objeto ● Baixo overhead em comparação à arquitetura thread por requisição ● Algumas threads podem estar sobrecarregadas enquanto outras threads ociosas I Estado associado com ambientes de Estado associado com ambientes de execução e execução e threadsthreads Ambiente de execução Thread Tabelas dos espaços de endereçamento Valores gravados no registradores Interfaces de comunicação, arquivos abertos Prioridade e estado de execução (tais como BLOCKED) Semáforos, outros mecanismos de sincronização Informações com relação tratamento de interrupções do software Lista de identificadores das threads Identificador do ambiente de execução Páginas do espaço de endereçamento residente na memória; Entradas de cache de hardware I Threads – Nível de ImplementaçãoThreads – Nível de Implementação ● Nível do usuário – gerenciamento das threads é feito pela aplicação – o núcleo desconhece a existência de threads – chaveamento entre threads não requer privilégio de modo núcleo; isso elimina o gasto de dois chaveamentos de modo – escalonamento é feito pela aplicação – Maior portabilidade pois pode ser implementada através de bibliotecas I Threads – Nível de ImplementaçãoThreads – Nível de Implementação ● Nível do usuário – chamada ao sistema bloqueia todas as threads de um processo – não aproveita os benefícios do multiprocessamento pois estão dentro de algum processo! I Threads – Nível de ImplementaçãoThreads – Nível de Implementação ● Nível do kernel – gerenciamento das threads é feito pelo núcleo – núcleo mantém a informação de contexto para processo e threads – escalonamento e chaveamento das threads é feito pelo núcleo – bloqueio de uma thread não bloqueia as outras I Threads – Nível de ImplementaçãoThreads – Nível de Implementação ● Nível do kernel – threads podem aproveitar a capacidade de multiprocessamento – usuário enxerga uma API para threads do núcleo ● A transferência de controle entre threads de um mesmo processo requer chaveamento para modo núcleo I Threads - VantagensThreads - Vantagens ● É mais rápido criar um thread que um processo ● É mais rápido terminar um thread que um processo ● É mais rápido chavear entre threads de um mesmo processo ● Threads podem se comunicar sem invocar o núcleo já que compartilham memória e arquivos ● IPC : troca de mensagens memória compartilhada I Threads - VantagensThreads - Vantagens ● Maior facilidade para construir aplicações com múltiplas atividades (Pseudo-paralelismo) – Mais adequado para implementar diversas atividades que compartilham recursos comuns – Ex.: Editor de texto → manipulando um arquivo I Threads - DesvantagensThreads - Desvantagens ● Nem todos os sistemas as suportam ● Falta de padronização ● Exigem maior controle de concorrência no acesso aos recursos comuns – Risco de dados inconsistentes ● Aplicações menos robustas – Se um thread travar, a aplicação pode travar I Programação com threadsProgramação com threads ● Programação concorrente – Condições de corrida, seções (ou regiões) críticas – Monitores, variáveis de condição, semáforos ● Duas alternativas – Bibliotecas em linguagens convencionais ● pthreads em C – Construções nativas da linguagem ● Ada95, Modula-3, Java I Caso de Estudo: ThreadsCaso de Estudo: Threads em Java em Java ● Vantagens – Portabilidade (Máquina Virtual) – API nativa que fornece suporte para threads ● Pode ser implementada de duas maneiras – Herdando da classe Thread ou – Implementando a interface Runnable I Herdando da classe ThreadHerdando da classe Thread I Implementando a interface RunnableImplementando a interface Runnable I Implementando a interface RunnableImplementando a interface Runnable I Caso de Estudo: ThreadsCaso de Estudo: Threads em Java em Java ● A execução do programa pode ser definida através do diagrama abaixo: I Mapeamento de threads em JavaMapeamento de threads em Java ● A The green-thread model : threads são escalonados pela JVM – Usado pelos sistemas UNIX (Linux) ● The native-thread model : threads são escalonados pelo sistema operacional que hospeda a JVM – Usados pelos sistemas Windows (Vista, 7, 8) I Caso de Estudo: ThreadsCaso de Estudo: Threads em Java em Java Thread() Creates a new thread in the SUSPENDED state, setPriority(int newPriority), getPriority() Set and return the thread’s priority. run() A thread executes the run() method of its target object, if it has one, and otherwise its own run() method (Thread implements Runnable). start() Change the state of the thread from SUSPENDED to RUNNABLE. sleep(int millisecs) Cause the thread to enter the SUSPENDED state for the specified time. yield() Enter the READY state and invoke the scheduler. destroy() Destroy the thread. I Estado das Threads em JavaEstado das Threads em Java I Iniciando threads em Java Iniciando threads em Java ● Depois que start() retorna, o thread esté no estado "Runnable" ● O thread está "pronto para rodar" ● Se a máquina tiver um único processador, só se pode rodar de fato uma thread de cada vez ● O sistema Java (JVM) deve implementar um esquema de escalonamento que compartilhe a CPU entre todos os threads que estão no estado "Runnable" ● Portanto, um thread que está no estado "Runnable" pode, de fato, estar esperando a CPU I Estado Estado dede não-executando não-executando de uma Thread de uma Thread ● Pode ser : bloqueado, esperando, adormecido ou morto ● Um thread deixa de executar quando um dos seguintes eventos ocorre: – O método sleep() é chamado (adormecido) – O thread chama o método wait() que espera por uma condição (esperando) – O thread faz um system call "lento" tal como um system call que causa I/O (bloqueado) – O método run() termina a sua execução (morto) ● I Testando o estado de uma Thread em Java Testando o estado de uma Thread em Java ● A partir do Java 5, pode-se usar o método Thread.getState que retorna: – NEW – RUNNABLE – BLOCKED – WAITING – TIMED_WAITING – TERMINATED ● Pode-se também chamar o método isAlive() – TRUE significa que o thread está no estado Runnable ou no estado Non-Runnable I Sincronização de Threads Sincronização de Threads ● Existem situações em que threads devem compartilhar dados e são obrigados a se preocupar com o que os outros estão fazendo ● Um exemplo disso é o caso Produtor/Consumidor em que um Produtor produz um fluxo de dados consumidos pelo consumidor ● Por exemplo, um thread (o produtor) poderia estar gravando dados num arquivo enquanto outra thread (o consumidor) lê os dados do mesmo arquivo I Sincronização de Threads Sincronização de Threads ● Outro exemplo: enquanto você digita no teclado, o produtor coloca eventos de mouse numa fila de eventos e o consumidor lê os eventos da mesma fila ● Em ambos os casos, temos threads que compartilham um recurso comum ● Com tal compartilhamento, as threads devem se sincronizar para acessar o recurso I Exemplo Produtor/Consumidor Exemplo Produtor/Consumidor ● Um produtor gera um número entre 0 e 9 e o armazena num objeto chamado Resources (os recursos são os números) ● Neste exemplo o produtor dorme durante um intervalo aleatório entre 0 e 100 milisegundos antes de gerar mais números ● O consumidor consome os inteiros do mesmo Resources asssim que se tornam disponíveis ● O produtor e o consumidor compartilham dados através de um objeto ResourcesI Exemplo Produtor/Consumidor Exemplo Produtor/Consumidor ● Vamos supor que não houvesse sincronização entre os threads. Que problemas poderiam ocorrer? ● Um problema ocorre quando o produtor é mais rápido do que o consumidor e gera dois números antes de o consumidor ter chance de consumir o primeiro ● Nessa situação, o consumidor perde um número: I Exemplo Produtor/Consumidor Exemplo Produtor/Consumidor ● Um outro problema ocorre quando o consumidor é mais rápido do que o produtor ● Um número pode ser consumido duas (ou mais)vezes: I Exemplo Produtor/Consumidor Exemplo Produtor/Consumidor ● Um problema desse tipo se chama uma condição de corrida ● Condições de corrida levam a resultados imprevisíveis e a bugs sutis, difíceis de achar ● Sincronização dentro da classe Resources para: – O produtor ter uma forma de dizer ao consumidor que um novo número está disponível para consumo – O consumidor ter uma forma de dizer ao produtor que o número foi consumido, liberando a produção de outro número – A classe Object do Java provê métodos (wait, notify, notifyAll) para permitir que threads esperem por uma condição e notificar outros threads quando uma condição ocorre I Exemplo Produtor/Consumidor Exemplo Produtor/Consumidor ● As threads não devem acessar o Resources simultaneamente ● Utilizamos a palavra-chave synchronized nos métodos get e put ● Seções críticas – public synchronized int get(int id) { ... } – public synchronized void put(int id, int value) { ... } I Exemplo Produtor/Consumidor Exemplo Produtor/Consumidor ● Devemos implementar uma maneira para que uma thread sinalize a outra quando pode continuar ● Isso é feito com os métodos wait e notifyAll: ● O método wait faz a thread que o chamou esperar pelo recurso ● O método notifyAll “avisa” para a(s) thread(s) em espera que o recurso está disponível I Exemplo Produtor/Consumidor Exemplo Produtor/Consumidor ● Desta forma o programa gera a saída correta: Producer #1 put: 0 Consumer #1 got: 0 Producer #1 put: 1 Consumer #1 got: 1 Producer #1 put: 2 Consumer #1 got: 2 … Producer #1 put: 9 Consumer #1 got: 9 Slide 1 Slide 2 Slide 3 Slide 4 Slide 5 Slide 6 Slide 7 Figure 6.1 System layers Slide 9 Figure 6.2 Core OS functionality Slide 11 Slide 12 Slide 13 Slide 14 Slide 15 Figure 6.3 Address space Slide 17 Slide 18 Figure 6.4 Copy-on-write Slide 20 Slide 21 Slide 22 Slide 23 Figure 6.5 Client and server with threads Figure 6.6 Alternative server threading architectures (see also Figure 6.5) Slide 26 Slide 27 Slide 28 Figure 6.7 State associated with execution environments and threads Slide 30 Slide 31 Slide 32 Slide 33 Slide 34 Slide 35 Slide 36 Slide 37 Figure 6.8 Java thread constructor and management methods Slide 39 Slide 40 Slide 41 Slide 42 Slide 43 Slide 44 Slide 45 Slide 46 Slide 47 Slide 48 Slide 49
Compartilhar