Home 
 1. Introdução
 2. Histórico  

 3. Classificações da Virtualização
3.1 Quanto à arquitetura
      3.1.1 Tipo I
      3.1.2 Tipo II
      3.1.3 Arquitetura Híbrida
 3.2 Quanto à técnica
       3.2.1 Virtualização total
       3.2.2 Paravirtualização
       3.2.3 Recompilação Dinãmica
       3.2.4 Vantagens e Desvantagens
               de cada técnica
 3.3 Outras classificações
       3.3.1 Abstração do ISA
       3.3.2 Hardware Abstraction Layer
       3.3.3 OS Level
 5. Perspectivas Futuras
     5.1 Inovações em estudo
 
 

Trabalho de Redes de Computadores I
Professor Otto Duarte
Índice de figuras  

 

  2. Histórico

2.1 Conceitos-chave

    
        Para estudarmos a virtualização é necessário ter em mente alguns conceitos fundamentais. Ao se expor a técnica, diversos componentes são citados, e saber o funcionamento dos mesmos é essencial para entender todo o processo de virtualização


Sistema operacional (SO)

 

Considere uma planilha de dados, capaz de armazenar informações de forma organizada e executar complexos cálculos matemáticos. A utilização desse arquivo poderia ser feita manualmente, armazenando informações em arquivos de papel e realizando os cálculos sem auxílio de máquina nenhuma. Essa execução, porém, poderia levar muito tempo, o que inviabilizaria que a planilha pudesse ser complexa e eficiente.

Essa limitação na complexidade de tarefas forçou a tecnologia a avançar no sentido de criar componentes que auxiliassem nessas tarefas. Memórias são capazes de guardar informações, enquanto os processadores se encarregam de executar funções lógicas e matemáticas. Nasceram assim os sistemas computacionais, capazes de se utilizar desses componentes para realizar tarefas que, manualmente, seriam proibitivamente custosos e lentos.

Um sistema computacional pode ser entendido como um conjunto de hardware no qual uma série de funções (aplicações) podem ser executadas. Uma aplicação é um conjunto de funções que permite a realização de uma tarefa para um usuário. Essas funções podem ser executadas se o hardware subjacente for projetado para atendê-las.

Para que os sistemas computacionais fossem difundidos era necessário, então, a produção em larga escala de arquiteturas padronizadas que atendessem um conjunto básico de funções. As aplicações podem assim rodar em um sistema desde que suas funções possam ser traduzidas em funções básicas da máquina (hardware). Várias aplicações podem, por sua vez, serem executadas em uma mesma máquina. Os recursos de hardware, porém, terão que ser divididos entre os processos.

Essa divisão de recursos é feita por um software no nível abaixo das aplicações, os sistemas operacionais. Sistemas operacionais são camadas de software inseridas entre o hardware e as aplicações, capaz de orientar a utilização desses recursos físicos. O objetivo é otimizar essa utilização. Ele é responsável por organizar o uso da máquina criando abstrações como, por exemplo, um arquivo. Um arquivo não é algo real, e sim apenas uma abstração no nível do usuário que corresponde a um grupo específico de bits armazenados em um local físico determinado.

        Essa abstração de recursos para que o usuário possa usar a máquina através de uma interface amigável é chamada virtualização de recursos. Com a utilização dessa técnica, cada programa tem a confortável ilusão de estar sendo executado sozinho, enquanto na verdade está dividindo os recursos da máquina com outras aplicações simultâneas.
           Abaixo, Um exemplo de sistema computacional. O Assembler é o componente que traduz funções exigidas pelo software em uma linguagem que o sistema físico entenda:

    so1

Processo

Um processo é a representação de um programa. Trata-se basicamente de uma abstração que reúna os dados a serem manipulados pelo programa e as funções usadas pelo programa. É implementado pela representação de um espaço de endereçamento lógico divididos em regiões que guardam informações específicas.

         A execução de um processo é feita através de dois registradores: PC (Program Counter - Contador de Programa), que indica a função a ser executada, e SP (Stack Pointer - Apontador de Pilha), que indica onde devem ser guardado, no processo, o dado de retorno dessa função, seus parâmetros e suas variáveis locais. O esquema abaixo mostra as funções de cada região de um processo e a atuação dos registradores.

            Abaixo, segue representação esquemática de um processo:

processos


Instrução


 

Todas as tarefas realizadas por um sistema computacional devem ser traduzidas em funções mais básicas, que os recursos físicos sejam capazes de executar. A essas funções mais básicas dá-se o nome de instruções.

As instruções são conjuntos de bits que representam comandos para a máquina. O protocolo que define como os bits são organizados para que tenham um significado é o que permite que a máquina reconheça a tarefa desejada. Os programas, ao serem criados em uma linguagem de programação, precisam que suas tarefas sejam traduzidas em instruções para a máquina, e isso é feito pela compilação.

Por outro lado, todo hardware corresponde a um conjunto de instruções (ISA) que pode utilizar todos os seus recursos. O conjunto de instruções pode ser entendido, portanto, como uma interface entre a camada de software e o hardware.

Há um conceito de divisão entre as instruções importante e essencial para o emprego da virtualização: instruções privilegiadas e instruções não privilegiadas. As instruções privilegiadas são aquelas que alteram recursos compartilhados entre vários processos, como registradores especiais e memória principal. As não-privilegiadas podem ser executadas sem que nenhum recurso usado por outro programa seja alterado.

A partir dessa divisão entre as instruções, cria-se uma divisão para o modo de uso de um computador entre modo de usuário e modo de supervisor. O modo de usuário, também chamado de espaço de aplicação, só pode gerar instruções não-privilegiadas, o que tira do usuário a responsabilidade de ter cuidado para não gerar instruções que prejudiquem o funcionamento do sistema. Já o modo de supervisor tem total controle sobre a CPU, podendo executar qualquer tipo de instrução.

A instrução a ser executada na CPU fica armazenada, em forma de bits, em um registrador especial, o PC. Esse registrador indica em última análise, portanto, o que a CPU deve fazer naquele momento, e trabalha em conjunto com outro registrador, o apontador de pilha (SP), que passa parâmetros para certa tarefa. Cada programa, entretanto, tem uma instrução a ser executada. Na verdade, um processo tem dois registros que comandam sua execução, o apontador de pilha e o contador de programa. Eles representam a CPU que o programa acredita estar usando, a CPU virtual. Para executar, o programa precisa que esses dois registros sejam passados à CPU real, da máquina.

Para resolver o problema de vários programas tentarem usar a CPU ao mesmo tempo, o sistema operacional utiliza uma técnica chamada escalonamento. Isso consiste em compartilhar o uso da CPU entre os processos, de forma que os processos tenham a ilusão de estarem usando sozinho a máquina. A figura abaixo ilustra essa solução.

instrução

Níveis de Abstração e Interface

A divisão de um sistema computacional em diversos níveis de abstração é um princípio importante. Cada nível de abstração troca informações com os níveis vizinhos sem precisar saber como essas informações são tratadas pelos outros níveis. Para que essa troca de informações seja feita, é necessária a interposição de uma interface entre os níveis.

Os níveis de abstração podem ser divididos em aplicação, bibliotecas, sistema operacional e processador.

O nível de aplicação é responsável por executar a aplicação desejada pelo usuário, possivelmente trocando informações com o mesmo. As bibliotecas são conjuntos de funções usadas pelo programador para fazer o programa acessar recursos protegidos da máquina. Isso permite que bibliotecas sejam criadas com o objetivo de fornecer aos programadores funções que gerem instruções privilegiadas. As instruções não-privilegiadas geradas pela aplicação atuam diretamente no processador, enquanto as privilegiadas são tratadas pelas bibliotecas. Ao tentar usar recursos protegidos do sistema, a aplicação se comunica com a biblioteca pela Interface Aplicativa de Programação (API).

O terceiro nível, o sistema operacional, se encarrega de executar as instruções não privilegiadas de forma a otimizar a utilização de recursos da máquina. A biblioteca, encarregada de fazer o primeiro tratamento desse tipo de tarefa, usa as “chamadas de sistema” para pedir auxílio ao sistema operacional e usar recursos de hardware. As chamadas de sistema são, assim, a interface entre Bibliotecas e Sistema Operacional.

O nível de processador é o principal, onde o computador realmente “pensa”. Tudo o que acontece nos outros níveis serve para simplificar o uso do sistema através de instruções, que o processador entende. O conjunto de instruções não-privilegiadas pode ser usado diretamente por todos os níveis acima. O conjunto de instruções privilegiadas, porém, só pode ser usado pelo sistema operacional. Esses dois conjuntos são as interfaces entre o processador e os outros níveis.

            A figura abaixo ilustra esse modelo -  um sistema computacional dividido em níveis de abstração (em azul) e interfaces entre eles (coloridas). Repare que as aplicações só chamam o sistema operacional quando querem executar instruções privilegiadas:

abstração

Máquina Real, Emuladores e Máquinas Virtuais

Uma máquina real é um conjunto de componentes físicos que fornecem operações para os níveis de abstração acima. Seu núcleo é o processador e o chip-set da placa-mãe, e inclui todos os recursos como o áudio, o vídeo, a memória, as portas, etc.

Um emulador é um programa que funciona para enganar uma aplicação. Seja uma aplicação que funciona em certa máquina real. Caso ela tenha que funcionar em outra máquina que não oferece os mesmos recursos, um emulador pode ser usado. Ele será capaz de traduzir instruções definidas para a máquina de origem em instruções para a máquina emulada, de forma a obter os mesmos resultados que obteria se executasse na original. O esquema abaixo ilustra a emulação de um sistema operacional, técnica que permite rodar uma aplicação projetada para um sistema operacional em outro incompatível.

emulador

Uma máquina virtual é a imitação, por software, de uma máquina real. Sendo assim, sistemas operacionais podem rodar em máquinas virtuais, e terão a ilusão de rodarem em uma máquina real. Essas imitações podem ser criadas no nível de aplicação ou no nível de sistema operacional.

Quando criadas no nível de aplicação, uma máquina virtual é executada em cima de um sistema operacional, chamado anfitrião. Como o nível acima vai acreditar que abaixo dele há uma máquina real, pode-se executar outro sistema operacional possivelmente diferente do que está abaixo da imitação. Isso é extremamente útil quando se deseja rodar uma aplicação projetada para um sistema operacional em outro incompatível.

Quando criadas no nível de sistema operacional, um Monitor de Máquina Virtual ( MMV ou Virtual Machine Monitor – VMM) é implementado. Ele controla o hardware e cria várias máquinas virtuais, ou seja, várias imitações do mesmo. Em cada “imitação” pode-se rodar um sistema operacional, que acreditará estar usando uma máquina real e não uma imitação. O resultado vantajoso é poder rodar diversos sistemas operacionais, cada um com suas aplicações específicas, em uma mesma máquina.

É função do monitor de máquinas virtuais gerenciar o uso dos dispositivos, multiplexando no tempo as tentativas dos diversos programas em usar a máquina real. Outros recursos como uso de memória e de dispositivos de entrada e saída também devem ser administrados uma vez que a virtualização não resolve o problema de um hardware não poder ser duplicado fisicamente. Dessa forma, a virtualização faz com que todos os recursos da máquina sejam compartilhados entre os usuários sem que eles saibam disso. Continuarão acreditando estar rodando direto em uma máquina real.

A figura abaixo ilustra os dois tipos de máquina virtual e a comparação com um sistema não virtualizado.

maquina virtual


 

| Top | Next