Processos (Threads,Virtualização e Migração de Código)
Roteiro Processos Threads Virtualização Migração de Código
O que é um processo?! Processos são programas em execução.
Processo
Processo Processo tem um problema: quando ocorre um bloqueio nele, todo o processo parará de funcionar; Ex. Você só pode fazer outra coisa no sistemas depois que terminar de imprimir todos os arquivos; O processo só volta ser liberado quando terminar o bloqueio; A solução para isso é utilizar Threads, mas...
O que é um Thread?!
Thread É o processo ser divido em diversas tarefas, cada Possibilitar que as atividades de um processo possam ser executadas de forma separada, sem que uma afete a outra;
Mas o que isso tem haver com Sistemas Distribuído?! TUDO! As threads podem ser usadas em sistemas distribuído para otimizar o sistemas, tanto no cliente quanto no servidor. \o/
Thread Sistemas Distribuído (Cliente) Sistemas distribuídos que operam em redes de longa distância escondem longos tempos de propagação de mensagens entre processos A maneira de ocultar latências de comunicação é iniciar a comunicação e imediatamente prosseguir com outra atividade A vantagem disso é que o usuário não precisa esperar por todos os arquivos para fazer outra atividade Exemplo: Os navegadores (da Internet) exibem a pagina mesmo que não tenham baixados todos os arquivos referenciados (ex. Imagens);
Thread Sistemas Distribuído (Cliente)
Thread Sistemas Distribuído (Cliente)
Thread Sistemas Distribuído (Servidor) Além da performance, através de Thread, é possível elaborar um paralelismo; De forma fácil e simplificado; Ainda mais quando computadores possui multiprocessadores; Assim, também evitamos que a CPU fica ociosa;
Thread Sistemas Distribuído (Servidor) Esperar Requisição Servidor sem Thread Só irá atender uma requisição por vez; Receber Requisição Tratar Requisição Processar Pode ocorrer na etapa Processar ficar presa por esperar pela liberação de um recurso (ex. Leitura de disco); Responder Assim a CPU fica ociosa, sem trabalhar, até quando o processo for liberado;
Thread Sistemas Distribuído (Servidor) Criar Thread Esperar Requisição Servidor com Thread Ao identificar que estabeleceram conexão, o servidor cria uma Thread para tratar a requisição e já volta ao estado anterior; Receber Requisição Tratar Requisição... Assim, cada requisição não irá influência na próxima; Processar Responder Caso ocorra um erro ou bloqueio de uma das threads, não impedirá que as demais trabalhem;
Thread Sistemas Distribuído (Servidor) Esperar Requisição Esperar Requisição Receber Requisição Criar Thread Tratar Requisição Receber Requisição Processar Tratar Requisição... Responder Processar Responder Servidor sem uso de Thread Servidor com uso de Thread
Mas há outra forma de fazer paralelismo sem usar Thread?! Existem sim. Mas você irá elaborar um sistema muito mais complexo. Ou seja, esqueça e use Thread.
Virtualização Processos e Threads podem ser vistos como um modo de fazer diversas tarefas ao mesmo tempo Fingindo que existem mais de uma CPU no mesmo computador Essa ideia de fingir pode ser estendida para outros recursos do computador, o que resulta na virtualização
Virtualização Estende ou substitui uma interface existente de modo a imitar o comportamento de um outro sistema; Essência da virtualização é imitar o comportamento das interfaces (instruções de máquina, chamadas de sistema) Muito utilizado na década de 70, nos mainframes da IBM, onde executava aplicativos e S.O. de vários fornecedores (através das máquinas virtuais)
Virtualização
Virtualização Existem vários modos pelos quais a virtualização pode ser realizada na prática Existem quatro tipos diferentes de interfaces em quatro níveis diferentes: Instruções Privilegiadas; Instruções Gerais; Chamadas de Sistemas; Funções de Biblioteca.
Virtualização
Virtualização A virtualização pode ocorrer de dois modos: Primeiro, fornecer um conjunto abstrato de instruções para executar uma aplicação; Segundo, uma camada que protege totalmente o hardware original, mas que oferece um conjunto de instruções completo, dele ou de outro, hardware;
Virtualização Primeiro Modo Instruções podem ser interpretadas ou emuladas; Java e PHP são exemplos de cenário de interpretação de instruções; Exemplo de emular instruções (ou cenário) quando aplicativos do Windows são executados no Linux (através do Wine); Essas emulação é denominada Máquina Virtual de Processo;
Virtualização Primeiro Modo
Virtualização Segundo Modo Quando oferecemos uma interface completa do hardware, possibilitamos que diversos Sistemas operacionais (e aplicações) executem nessa plataforma Em geral, essa camada é denominada Monitor de Máquina Virtual Ex. Vmware e Virtualbox
Virtualização Segundo Modo As vantagens são: Permite o isolamento completo do ambiente; Caso haja uma falha de segurança, não afeta o recurso de uma máquina toda; Maior portabilidade das aplicações; Desacoplamento entre hardware e software; Permitindo mover um ambiente completo de uma máquina a outra.
Virtualização Segundo Modo
Cliente A principal função da versão cliente de um sistema distribuído é disponibilizar uma maneira de interagir com servidor remoto; Existem duas maneiras: Utilizar protocolos específicos de comunicação (ex. Sincronização de agenda ou relógio); Cliente ser um terminal burro, onde todo o gerenciamento do sistema é feito no servidor remoto;
Cliente
Cliente X Window Exemplo de Interface em Rede: X Window É uma das mais antigas e utilizadas ainda hoje Possui dois componentes: Núcleo X: oferece uma interface de nível relativamente baixo para controlar a tela e também para capturar eventos do teclado e do mouse Xlib: Interface disponibilizada para as aplicações é definida pela biblioteca Xlib A comunicação entre esses dois componentes é feita através do protocolo X
Cliente X Window
Cliente X Window Núcleo X e as aplicações X não precisam necessariamente residir na mesma máquina O protocolo X é um protocolo de comunicação de camada de aplicação pelo qual uma instância de Xlib pode trocar dados e eventos com o núcleo X Ex.: Xlib pode enviar requisições ao núcleo X para criar ou encerrar uma janela, estabelecer cores e definir o tipo de cursor. O núcleo X reagirá a eventos locais como entrada de teclado e mouse devolvendo pacotes de eventos a Xlib
Cliente X Window Núcleo X recebe requisições para manipular o visor e que recebe essas requisições de aplicações O Núcleo X age como um servidor, enquanto as aplicações desempenham o papel de clientes
Cliente Transparência Além de fornece um modo de comunicação com o servidor, a versão cliente da aplicação pode tratar de algumas transparências de distribuição Essas transparências servem para o cliente não fique ciente que está trabalhando com processos remotos Existem diversos tipos de transparências, cada uma escondendo uma parte da distribuição
Cliente Transparência Transparência de: Acesso: esconde se o recurso é local ou remoto; Localização: o cliente não precisa saber onde está o servidor para poder se comunicar com ele; Replica: requisita a todas as replicas e escolhe apenas uma requisição (ex. a que chegar primeiro); Falha: quando houver uma falha na comunicação com algum servidor, a aplicação poderá tentar restabelecer a conexão com outros servidores;
Servidor Um servidor é um processo que implementa um serviço especifico; Cada servidor é organizado do mesmo modo: Espera por uma requisição Processa-a Depois, espera pela próxima requisição
Servidor Na elaboração de um servidor, temos que responder as seguintes perguntas: Como o cliente irá acessar o servidor? Como interromper a comunicação com o servidor? Servidor deve guardar o estado dos clientes?
Servidor 1 como os cliente irão acessar o servidor? 1 como os cliente irão acessar o servidor? Os servidores devem escolher um terminal (porta) do computador para receber as requisições; Algumas portas são conhecidas (tais como o HTTP 80 e o FTP 21); Existem duas maneiras de manipular portas: Utilizar um daemon, ou Supervisor
Servidor 1 como os cliente irão acessar o servidor? O servidor cadastra a sua porta no daemon; O Cliente, antes de acessar o servidor, pergunta qual porta está sendo disponibilizado; Depois, acessa o servidor;
Servidor 1 como os cliente irão acessar o servidor? Para evitar que tenha processos ociosos esperando por uma requisição; O supervisor monitora cada porta associada com um serviço específico; Ao receber um requisição em uma dessas portas, executa outro programa para continuar com o requisição, e quanto terminar de atender, finaliza-o Ex.: Daemon inetd no Unix
Servidor 2 como interromper a conexão com o servidor? Abordagem mais simples: usuário finaliza o processo da aplicação cliente servidor encerrará a conexão antiga Abordagem mais completa: dados urgentes (fora da banda) Pacotes TCP possuem no header o campo URG. Servidor ao receber um pacote com o campo URG setado é interrompido, através de um sinal.
Servidor 3 Servidor deve guardar o estado dos clientes? Existem três tipos de servidor: Sem estado Estado Flexível Com estado
Servidor 3 Servidor deve guardar o estado dos clientes? Sem Estado Não mantém informações sobre os estados dos clientes Pode mudar seu próprio estado sem ter de informar a nenhum cliente As requisições atuais não influenciaram as próximas requisições Vantagem: o serviço pode ser reiniciado e não afeta as requisições dos clientes ex. Calculadora e WEB
Servidor 3 Servidor deve guardar o estado dos clientes? Estado Flexível Armazena temporariamente o estado do Cliente Após o tempo limitado, o servidor descarta estas informações As requisições atuais não influenciaram as próximas requisições ex. Session de uma página WEB
Servidor 3 Servidor deve guardar o estado dos clientes? Com Estado O servidor irá armazenar o estado do Cliente; As informações sobre precisam ser explicitamente removidos pelo servidor; Problema: além de ter que armazenar o estado de cada cliente, caso o servidor caia e volte a funcionar, pode perder todos os estados de todos os clientes; ex. Servidor de arquivos que permite a um cliente manter cópia local de um arquivo. Servidor mantem uma tabela, com entradas (cliente, arquivo). Permite monitorar as permissões sobre um arquivo, etc.
Servidor Cluster Uma forma de tornar o serviço mais disponível é agrupar computadores e forma um Cluster Cluster é: Conjunto de máquinas conectadas por uma rede, no qual cada máquina executa um ou mais servidores. Estas máquinas estão conectadas por uma rede local, com alta largura de banda e baixa latência. Geralmente, é divido em 3 camadas;
Servidor Cluster
Servidor Cluster Forma o ponto de entrada para o cluster de servidores, oferecendo um único endereço de rede. Considerando TCP, o comutador aceita requisições e as transfere a um dos servidores Deve elaborar algum esquema de balanceamento de carga: identificando o melhor servidor a tratar a requisição ou sempre selecionado um servidor diferente
Servidor Cluster
Migração de Código Migração de código ocorre, tradicionalmente, na forma de migração de processo; Todo o processo migra de uma máquina à outra; Isso é uma tarefa custosa e complicada; O motivo para fazer isso é sempre a otimização (desempenho);
Migração de Código Ex. de um uso: Em um cluster, para melhorar o balanceamento de carga, pode migrar programas para máquinas ociosas, liberando as demais; Um cliente, antes de interagir com o servidor, necessita baixa um código;
Migração de Código Cliente Servidor 1. conectar com o servidor 2. pegar código! Problema: a segurança na lado do cliente! Tem como garantir que esse código migrado não está executando outra coisa? Ex. Pegando dados pessoais? Repositório de Código
A migração de código só serve para migrar um processo inteiro? Não, migração de código é algo muito mais amplo: podemos também migrar status de um programa ou outras partes do ambiente.
Migração de Código Processo consiste em três segmentos: Segmento de código: contém o conjunto de instruções que compõem o programa que está em execução Segmento de recursos: contém referências a recursos externos (arquivos, impressoras) Segmento de execução: armazenar o estado em execução de um processo no momento da migração (dados privados, pilha,contador de programa)
Migração de Código Mobilidade pode ser de dois tipos: Mobilidade Fraca: possível transferir somente o segmento de código, junto com alguns dados de inicialização. Requer somente que a máquina-alvo possa executar o código (portabilidade) Mobilidade Forte: segmento de execução também pode ser transferido. O processo em execução pode ser parado e movido para uma outra máquina e retomar a execução no ponto original
Migração de Código Em relação do ponto de início da migração: Iniciada pelo remetente: a migração é iniciada na máquina em que o código está em execução Ex.: enviar programa de busca pela Internet a um servidor de banco de dados para realização de pesquisas; Iniciada pelo destinatário: Iniciativa da migração de código é tomada pela máquina-alvo (cliente); Ex.: Applet do Java
Migração de Código
Migração de Código Recurso Três tipos de vinculações processo-recurso: Vinculação por identificador Processo requer exatamente o recurso referenciado (URL de um site) Vinculação por valor É necessário somente um valor Se outro recurso fornece o mesmo valor, execução não é afetada (bibliotecas padronizadas) Vinculação por tipo Processo requer um recurso de um tipo específico (monitores, impressoras)
Migração de Código Recurso Três tipos de vinculações recurso-máquina: Recursos não ligados: recursos podem ser movidos com facilidade entre maquinas diferentes(arquivos de dados) Recursos amarrados: recursos podem ser movidos ou copiados, mas só a custo relativamente alto ( banco de dados locais) Recurso fixos: recursos estão intimamente vinculados a uma máquina ou ambiente especifico e não podem ser movidos (porta)
Migração de Código Recurso Referência global Caso vários processos referenciem um recurso, uma alternativa é estabelecer uma referência global, que atravesse as fronteiras das máquinas URL (baixa complexidade) Memória compartilhada entre processos (referência global significa memória compartilhada)
Migração de Código Complexidade está ligada aos tipos de vínculo processo-recurso e recurso-máquina Recursos não ligados: Melhor solução é copiar ou mover o recurso para o novo destino Vinculações por tipo: A solução é vincular novamente o processo a um recurso do mesmo tipo disponível no local
Migração de Código heterogêneos Na realidade, sistemas distribuído é construído em ambientes heterogêneos (S.O. E arquitetura de máquina); A migração de código neste cenário requer que cada plataforma seja suportada pelo sistemas; Assegurando que cada segmento de código pode ser executado e representado em cada plataforma;
Migração de Código heterogêneos Existem duas alternativas: Utilizar linguagens de programação alta portabilidade (ex. Baseadas em interpretadores PHP ou compiladas - Java ); conseguimos executar segmento de processo em máquina diferentes Usar máquinas virtuais, virtualizando recursos da máquina, possibilitando uniformiza estes recursos; permite migra todo um sistema operacional de uma máquina a outra;