Processos, Threads, Virtualização e Segurança
Classificado em Computação
Escrito em em português com um tamanho de 17,44 KB
Processos e Threads
Processos: programa em execução.
Threads: unidade de execução de um programa com contexto próprio, subprocesso permite a criação de fluxos de execução distintos que podem ser executados concorrentemente.
Vantagens das Threads:
- Paralelismo
- Exploração de processadores com vários núcleos
- Rapidez na execução de programas (mais rápido criar uma thread do que um processo)
- Ocultação de latência em comunicações via rede (a aplicação principal não “trava” enquanto é realizada uma solicitação na rede)
Processos vs Threads:
- Custo da criação e utilização: as informações de contexto armazenadas pelas threads são menores do que as dos processos.
- Compartilhamento de dados: threads compartilham dados facilmente, pois estão na mesma aplicação.
Utilização de Threads:
- Clientes:
- Paralelismo: pseudo ou real
- Ocultação de latência da rede: RPC
- Clareza e facilidade de programação
- Servidores:
- Paralelismo: pseudo ou real
- Processamento de múltiplas requisições
- Servidores Web
- Modelos de atendimento eficazes
Implementação de Threads:
Java: public class MinhaClasse extends Thread { ... }
Tipos de Threads:
- Usuário: o sistema não sabe da existência de threads, conhecidas como Lightweight Process – LWP, cada processo tem a sua própria tabela de threads.
- Sistema: o núcleo conhece as threads e as gerencia, o núcleo tem tabela de threads e tabela de processos, bloqueio de threads, necessitam de chamadas ao sistema.
Clientes de Sistemas Distribuídos:
- Cliente multithread: execução de múltiplas threads, exemplo: programas de mensagens instantâneas.
- Servidores multithread: executam e processam múltiplas threads e suas respectivas requisições. Exemplo: servidores Web, servidores de Email, etc.
Virtualização
Utilizado desde a década de 70 nas máquinas IBM, principal razão para a utilização é a portabilidade, promove o desacoplamento entre hardware e software.
Tipos de Virtualização:
- Máquina virtual de processos
- Máquina virtual Java
- Emulação de aplicações Windows em Linux
- Monitor de máquina virtual
- VMWare, Virtual Box, Virtual PC, etc.
Sincronização
É importante que vários processos não acessem simultaneamente um recurso compartilhado como uma impressora, mas ao contrário, cooperem para garantir um ao outro acesso temporário exclusivo.
Sincronização de Relógios:
Em um sistema centralizado, quando um processo quer saber a hora ele faz uma chamada de sistema, e o núcleo responde. Se o processo A perguntar a hora e, um pouco mais tarde, o processo B também perguntar a hora, o valor que B obtém será mais alto que o valor que A obteve. Porém, por certo não será mais baixo.
Relógios Físicos:
Os temporizadores possuem um cristal de quartzo lapidado e usinado. Quando mantidos sob tensão oscilam a uma frequência bem definida. Desse modo, é possível programar um temporizador para gerar uma interrupção 60 vezes por segundo ou a qualquer frequência. Cada interrupção é denominada ciclo de relógio. Os computadores possuem uma RAM CMOS especial suportada por bateria para armazenar as informações de data e hora do sistema. A cada ciclo de relógio, o procedimento de serviço de interrupção soma uma unidade à hora armazenada na memória.
Algoritmos de Sincronização
- NTP – Network Time Protocol: relógios dos computadores trocam mensagens para acertar seus relógios baseados em uma fonte confiável de tempo, exemplo: relógios atômicos de césio.
- Algoritmo de Berkeley: são adequados quando não é possível realizar sincronização externa dos relógios. Possui um daemon que consulta todas as máquinas de tempos em tempos para perguntar qual é a hora que cada uma está marcando. Com base nas respostas, ele calcula um horário médio e diz a todas as outras máquinas que adiantem seus relógios até o novo horário, ou atrasem seus relógios até que tenham obtido alguma redução especificada.
Exclusão Mútua
Para evitar que tais acessos concorrentes corrompam o recurso ou o tornem inconsistente, são necessárias soluções que garantam acesso mutuamente exclusivo pelos processos. Algoritmos distribuídos de exclusão mútua podem ser classificados em duas categorias:
- Soluções Baseadas em Fichas: é conseguida através da passagem de uma mensagem especial entre os processos, conhecida como ficha. Há somente uma ficha disponível, e quem quer que a tenha pode acessar o recurso compartilhado. Ao terminar, a ficha é passada adiante para o processo seguinte. Se um processo que tenha a ficha não estiver interessado em acessar o recurso, ele apenas a passa adiante. Um problema grave ocorre com a abordagem baseada em fichas: quando a ficha se perde, por exemplo, porque o processo que a detém falhou, é preciso iniciar um complicado procedimento para assegurar a criação de uma nova e única ficha.
- Soluções Baseadas em Permissão: um processo que quiser acessar o recurso em primeiro lugar solicita a permissão de outros processos.
Algoritmos de Exclusão Mútua
- Algoritmo Centralizado: um processo é eleito como o coordenador. Sempre que um processo quiser acessar um recurso compartilhado, envia uma mensagem de requisição ao coordenador declarando qual recurso quer acessar e solicitando permissão. Se nenhum outro processo estiver acessando aquele recurso naquele momento, o coordenador devolve uma resposta concedendo a permissão.
- Algoritmo Descentralizado: o algoritmo centralizado tem como principal deficiência a possibilidade de falhas do único coordenador. Para minimizar este problema, a abordagem descentralizada amplia o número de coordenadores. Assim, sempre que um processo quiser acessar o recurso, ele vai precisar da aprovação de m > n/2. Quando um coordenador não der permissão para acessar um recurso, ele informará ao requisitante. Esse esquema torna a solução centralizada menos vulnerável a falha de um único coordenador.
- Algoritmo Distribuído: quando um processo quer acessar um recurso compartilhado, monta uma mensagem que contém o nome do recurso, seu número de processo e a hora corrente. Depois, envia a mensagem a todos os outros processos, fato que, conceitualmente, inclui ele mesmo. Adotamos como premissa que o envio de mensagens é confiável, ou seja, nenhuma mensagem se perde.
- Algoritmo Token Ring: rede de barramento sem nenhuma ordenação inerente dos processos. Um anel lógico é construído em software e a cada processo é designada uma posição no anel. Quando o anel é inicializado, o processo 0 recebe uma ficha. A ficha circula ao redor do anel. Ela é passada do processo k para o processo k+1. Quando um processo adquire a ficha de seu vizinho, ele verifica se precisa acessar o recurso compartilhado. Caso necessite, o processo realiza todo trabalho que precisa ser feito, e em seguida libera o recurso. Após concluir, passa a ficha para o próximo nó do anel. Não é permitido acessar o recurso novamente, de imediato, utilizando a mesma ficha. Se um processo receber a ficha de seu vizinho e não estiver interessado no recurso, ele apenas passa a ficha adiante. Em consequência, quando nenhum processo precisar do recurso, a ficha apenas circula a grande velocidade pelo anel.
Algoritmos de Eleição
Tentam localizar o processo que tenha o número de processo mais alto e designá-lo como coordenador. A meta de um algoritmo de eleição é garantir que, quando uma eleição começar, ele a concluirá com todos os processos concordando com o novo coordenador escolhido.
- Algoritmo do Valentão: quando um processo nota que o coordenador não está mais respondendo às requisições, ele inicia uma eleição. Um processo, P, convoca uma eleição como se segue:
- P envia uma mensagem ELEIÇÃO a todos os processos de números mais altos.
- Se nenhum responder, P vence a eleição e se torna o novo coordenador.
- Se um dos processos de números mais alto responder, ele toma o poder e o trabalho de P está concluído.
- Algoritmo de Anel: considere que todos os processos estão ordenados de modo que cada processo sabe quem é seu sucessor. Quando qualquer processo nota que o coordenador não está funcionando, monta uma mensagem ELEIÇÃO que contém seu próprio número de processo e envia a mensagem a seu sucessor. Se o processo tiver caído, o remetente pula o sucessor e vai até o próximo membro ao longo do anel, ou até o próximo depois deste, até localizar um processo em funcionamento. A cada etapa ao longo do caminho, o remetente adiciona seu próprio número de processo à lista na mensagem, o que o torna efetivamente um candidato a ser eleito como coordenador. A certa altura, a mensagem volta ao processo que começou tudo. Esse processo reconhece esse evento quando recebe uma mensagem de entrada que contém seu próprio número de processo. Nesse ponto, o tipo de mensagem é mudado para COORDENADOR e circulado novamente para informar quem é o novo coordenador e quem são os membros do anel.
Nomeação
Nomes têm um papel muito importante em como recursos são compartilhados e localizados em sistemas distribuídos. A implementação de um sistema de várias máquinas aumenta a eficiência e escalabilidade. Exemplo: DNS.
Entidades:
Máquinas, impressoras, discos, processos, usuários, páginas Web, janelas, etc. São acessadas por meio de um ponto de acesso, ou simplesmente, endereço. Exemplo: servidor e seu número IP. Portanto, um endereço pode ser utilizado como uma maneira de nomear e identificar uma entidade. Problema: a entidade pode mudar facilmente de ponto de acesso (exemplo: DHCP).
Identificadores:
São cadeias aleatórias de bits, com as seguintes propriedades:
- Um identificador referencia, no máximo, UMA entidade.
- Cada entidade é referenciada, por, no máximo, um identificador.
- Um identificador sempre referencia a mesma entidade, isto é, nunca é reutilizado.
Nomes Amigáveis:
Cadeia de caracteres, domínios na internet, números de processos, etc. Exemplo: www.meusite.com.br.
Sistemas de Nomeação
Mantêm uma vinculação nome-endereço, uma tabela contendo um par (nome, endereço). Três classes:
- Nomeação Simples: aplicada a identificadores (cadeia aleatória de bits). Nomes simples não contêm informação sobre como localizar o ponto de acesso de uma entidade associada. Problema: dado um identificador, como localizar o ponto de acesso? Solução simples: broadcasting.
- Nomeação Estruturada: nomes são organizados em um espaço de nomes. Espaços de nomes podem ser representados como um grafo dirigido, com dois tipos de nós:
- Nó folha: entidade.
- Nó de diretório: entidade que se refere a outros nós, possui uma tabela de diretório.
- Nomeação Baseada em Atributo: fornece uma descrição da entidade que está sendo procurada. Descreve uma entidade em termos de pares atributo-valor. Serviços de diretório retornam uma ou mais entidades que atendam à descrição do usuário.
Tolerância a Falhas
- Falha de um Sistema: o sistema não consegue realizar corretamente as tarefas. Pode ser desencadeada por falha de um componente (hardware, software). Sequência possível: componente -> situação de erro -> falha do sistema (component fault -> system error -> system failure). Sequência desejável: falha -> erro -> tratamento -> reparação.
- Falhas em Sistemas Distribuídos:
- Sistemas Clássicos: falhas totais.
- Sistemas Distribuídos: falhas parciais.
- Sistemas Confiáveis:
- Fiabilidade (reliability): o sistema está em funcionamento contínuo.
- Disponibilidade (availability): o sistema pode ser utilizado.
- Tolerância a falhas (fault tolerance): mantém as características anteriores mesmo na presença de falhas.
- Segurança (security): sistema guarda as informações de maneira confiável.
- Classificação de Falhas:
- Componentes:
- Periodicidade: transitórias, intermitentes, permanentes.
- Classe: hardware, software.
- Falha de Sistemas (Comportamento Global):
- Silenciosa ou abruptas (fail-stop): sistema deixa de funcionar.
- Fornecendo resultados incorretos.
- Características:
- Omissão: ação não executada, por exemplo, perder uma mensagem.
- Resposta: falha de valor (value failure), por exemplo, comunicação com ruído.
- Desempenho: em regime normal, em presença de outras falhas.
- Sistema (Resposta):
- Síncronos: resposta em intervalo de tempo garantido.
- Assíncronos: respostas não têm atraso garantido.
- Componentes:
- Combate a Falhas:
- Redundância de informação: replicar dados.
- Redundância temporal: repetição de eventos.
- Redundância física: replicar equipamentos.
Segurança em Sistemas Distribuídos
Dividida em duas partes:
- Canais Seguros: comunicação entre usuários ou processos em máquinas diferentes.
- Controle de Acesso: assegurar que um processo receba somente os direitos de acesso a recursos aos quais está habilitado (autorização).
Confiabilidade e Integridade do Sistema:
Proteger os serviços e dados que o SD oferece contra ameaças à segurança.
Tipos de Ameaças:
- Interceptação: parte não autorizada consegue acesso a um serviço ou a dados, por exemplo, quando a comunicação entre duas partes é “ouvida” por mais alguém. A interceptação ocorre quando os dados são copiados ilegalmente.
- Interrupção: quando um arquivo é corrompido ou perdido, por exemplo, quando um serviço está indisponível. Ataques de recusa de serviço (DoS) são classificados como ameaças do tipo interrupção.
- Modificações: alteração não autorizada de dados ou interferência em um serviço de modo que ele não siga suas especificações originais. Por exemplo: key logger.
- Invenção: situação na qual são gerados dados ou atividades adicionais que normalmente não existem. Por exemplo: adicionar uma entrada em um arquivo de senhas ou a um banco de dados.
Mecanismos de Segurança
Criptografia:
Transformação de dados em algo que não se possa entender. Implementar confidencialidade de dados e identificar caso eles sejam alterados.
Notações:
- C = Ek(P) → texto cifrado obtido pela criptografia do texto aberto P usando a chave K.
- P = Dk(C) → decifração do texto C usando a chave K e resultando no texto aberto P.
Intruso Passivo:
Intercepta a mensagem sem que o remetente e o receptor percebam, no entanto, o conteúdo da mensagem está ilegível.
Tipos de Criptografia:
- Simétrico: em que a mesma chave é usada para cifrar e decifrar a mensagem. P = Dk(Ek(P)). Exemplos: DES – Data Encryption Standard.
- Assimétrico: as chaves de criptografia e decifração são diferentes, assim, há uma chave separada Ke para criptografia e uma para decifração Kd, tal que: P = Dkd(EKe(P)). Uma das chaves é privada e outra pública. Sistemas baseados nesse modelo são conhecidos como Sistemas de Chaves Públicas. Exemplo: RSA.
- Funções Hash: uma mensagem m de comprimento arbitrário como entrada e produz uma sequência de bits h de comprimento fixo como saída. h = H(m). Exemplo: MD5.
Autenticação:
Verificar a identidade declarada por um usuário, cliente, servidor, hospedeiro ou outra entidade.
Autorização:
Depois de autenticado, é necessário verificar se uma entidade está autorizada a executar a ação requisitada.
Auditoria:
Rastrear as informações que foram acessadas e de que modo elas foram acessadas.