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:
    1. P envia uma mensagem ELEIÇÃO a todos os processos de números mais altos.
    2. Se nenhum responder, P vence a eleição e se torna o novo coordenador.
    3. Se um dos processos de números mais alto responder, ele toma o poder e o trabalho de P está concluído.
    A qualquer momento, um processo pode receber uma mensagem ELEIÇÃO de um de seus colegas de números mais baixos. Quando tal mensagem chega, o receptor envia uma mensagem OK de volta ao remetente para indicar que está vivo e tomará o poder. Então, o receptor convoca uma eleição, a menos que já tenha convocado uma. A certa altura, todos os processos desistem, exceto um; este é o novo coordenador. Ele anuncia sua vitória enviando a todos os processos uma mensagem informando que a partir daquele instante ele é o novo coordenador.
  • 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.
    Espaços de nomes oferecem um mecanismo para armazenar e recuperar informações sobre entidades por meio de nomes. Resolução de nomes: DNS.
  • 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.
  • 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.

Entradas relacionadas: