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:

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:

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.

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:
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.

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.
|
Top
| Next