# Máquina virtual

Na ciência da computação, máquina virtual consiste em um software de ambiente computacional que executa programas como um computador real, também chamado de processo de virtualização.
Uma máquina virtual (Virtual Machine – VM) pode ser definida como “uma duplicata eficiente e isolada de uma máquina real”. A IBM define uma máquina virtual como uma cópia isolada de um sistema físico, e esta cópia está totalmente protegida.
Máquinas virtuais são extremamente úteis no dia a dia, pois permitem ao usuário rodar outros sistemas operacionais dentro de uma única máquina física, tendo acesso a outros software existentes que podem ser instalados dentro da própria máquina virtual.

## História

VM ou VM/CMS, do inglês Virtual Machine/Conversational Monitor System é um sistema operativo que permite a vários utilizadores trabalharem ao mesmo tempo como se estivessem a utilizar sozinhos o computador. O sistema foi empregue na IBM mainframes System/360, donde VM/360, em 1964 - História do Mainframe.
O sistema VM é usado nos mainframes - computadores de grande capacidade capazes de oferecer serviços de processamento a milhares de usuários através de milhares de terminais conectados diretamente ou através de uma rede. O sistema operava unicamente em modo batch (arquivo de lote).
O programa de controle (CP) gerencia o computador e efetua todas as operações necessárias de tal forma que cada máquina virtual reaja e trabalhe como um computador pessoal. O utilizador tinha em frente de si unicamente: um écran, um teclado, e a caixa de ligação com mainframe.

## Definição

O termo máquina virtual foi descrito na década de 1960 utilizando um termo de sistema operacional: uma abstração de software que enxerga um sistema físico (máquina real). Com o passar dos anos, o termo englobou um grande número de abstrações – por exemplo, Java Virtual Machine – JVM que não virtualiza um sistema real.
Ao invés de ser uma máquina real, isto é, um computador real feito de hardware e executando um sistema operacional específico, uma máquina virtual é um computador fictício criado por um programa de simulação. Sua memória, processador e outros recursos são virtualizados. A virtualização é a interposição do software (máquina virtual) em várias camadas do sistema. É uma forma de dividir os recursos de um computador em múltiplos ambientes de execução.
Ultimamente, é muito simples e fácil criar uma máquina virtual: basta apenas instalar um programa específico dentro da máquina real, onde dentro desse programa poderá ser criado um disco rígido virtual e a partir disso, será possível executar um sistema operacional inteiro por meio dele.
Entre os programas que simulam essas máquinas, são bastante conhecidos os emuladores de vídeo games antigos e os emuladores de microcomputadores, como o VMware Player e o Bochs.
Apesar de alguns desses programas serem pagos, existem também softwares livre de fácil acesso, que é o caso do VM VirtualBox (software livre da Oracle).

## Funcionamento

Após a instalação do programa para criação da máquina virtual, é possível criar um disco rígido virtual, e a partir disso, é possível executar um sistema operacional inteiro.
A máquina virtual irá alocar, durante a execução de sistemas operacionais, uma quantidade definida de memória RAM. Ela normalmente emula um ambiente de computação física, mas requisições de CPU, memória, disco rígido, rede e outros recursos de hardware serão todos geridos por uma "camada de virtualização" que traduz essas solicitações para o hardware presente na máquina.
A partir disso, é possível a instalação de outros softwares dentro do presente software, fazendo simulações em geral sem a necessidade um hardware específico.

## Uso para teste

O conceito de VM também pode ser utilizado como máquinas virtuais a efeito de testes, ou seja, quando empresas de desenvolvimento desejam testar seus produtos ou até mesmos administradores de redes, sistemas pretendem montar protótipos e projetos futuros.
Caso se trate de uma pequena e média empresa onde os recursos são reduzidos, podemos utilizar o Conceito de VM, para que um servidor de arquivos além de armazenar dados, também possua uma outra tarefa como por exemplo instalação de um (Servidor Jabber "comunicação", servidor CUPS "impressão" e até mesmo um Postfix "correio eletrônico").

## Tipos

As máquinas virtuais podem ser divididas em três tipos:
* Tipo 1: Sistema em que o monitor é implementado entre o hardware e os sistemas convidados (guest system), onde o monitor tem controle sobre o hardware e abre sessões (convidados) para criação de máquinas virtuais semelhantes ao sistema operacional tradicional.
* Tipo 2: Nele o monitor é implementado como um processo de um sistema operacional real, denominado sistema anfitrião (host system), onde o monitor é executado como um Processo por um Sistema Anfitrião, ou seja, um sistema gerencia o acesso do hardware ao monitor, que por sua vez cria máquinas virtuais assim como descrito no Tipo 1.
* Tipo 3: Utiliza os 2 conceitos do Tipo 1 e Tipo 2 ao mesmo tempo. Em resumo é a capacidade da máquina virtual (sistema convidado) de acessar diretamente o hardware, sem ter que passar todas informações ao monitor toda vez que desejar acessar algum dispositivo/hardware.
* Tipos Híbridos: Os monitores de tipo 1 e 2 raramente são usados em sua forma conceitual em implementações reais. Na prática, várias otimizações são inseridas nas arquiteturas apresentadas, com o objetivo principal de melhorar o desempenho das aplicações nos sistemas convidados. Como os pontos cruciais do desempenho dos sistemas de máquinas virtuais são as operações de E/S, as principais otimizações utilizadas em sistemas de produção dizem respeito a essas operações.
Outra importante categoria de máquinas virtuais são as máquinas virtuais para computadores fictícios projetados para uma finalidade específica. Atualmente a mais importante máquina virtual desta família é a JVM (máquina virtual Java). Existem simuladores para ela em quase todos os computadores atuais, desde computadores de grande porte até telefones celulares, o que torna as aplicações Java extremamente portáveis.
Uma importante vantagem sem duvida de se escrever código para uma máquina virtual é a de se poder compilar o código sem que seja perdida a portabilidade, melhorando-se a velocidade em relação à programação interpretada, que também é portátil, porém mais lenta, já que neste caso cada linha será traduzida e executada em tempo de execução, e no caso da máquina virtual cada mnemônico da máquina virtual é convertido no equivalente em linguagem de máquina (ou assembly) da máquina real.

## Vantagens

* Facilita o aperfeiçoamento e testes de novos sistemas operacionais.
* Possibilita a comparação de vários sistemas operacionais utilizando o mesmo equipamento.
* Executa diferentes sistemas operacionais sobre o mesmo hardware, simultaneamente.
* Simula alterações e falhas no hardware para testes ou reconfiguração de um sistema operacional, provendo confiabilidade e escalabilidade para as aplicações.
* Diminuição de custos com hardware.
* Facilidades no gerenciamento, migração e replicação de computadores, aplicações ou sistemas operacionais.
* Confiança e disponibilidade: A falha de um software não prejudica os demais serviços.
* O isolamento da máquina virtual assegura que as aplicações e serviços que serão executados dentro de uma máquina virtual não poderão interferir no sistema operacional original e nem em outras máquinas virtuais.
* Pode ser facilmente deslocadas, copiadas e transferidas entre computadores, possibilitando aperfeiçoar os recurso do hardware.
* Teste de diversos sistemas operacionais sem precisar particionar o HD, podendo instalar versões antigas do Windows, Linux, ou qualquer outro sistema sem fazer alterações no disco rígido.

## Desvantagens

* Gerenciamento: Os ambientes virtuais necessitam ser, monitorados, configurados e salvos . Existem produtos que fornecem essas soluções, mas esse é o campo no qual estão os maiores investimentos na área de virtualização, justamente por se tratar de um dos maiores contratempos na implementação da virtualização.
* Desempenho: Atualmente, não existem métodos consolidados para medir o desempenho de ambientes virtualizados. No entanto, a introdução de uma camada extra de software entre o sistema operacional e o hardware, o VMM ou hypervisor, gera um custo de processamento superior ao que se teria sem a virtualização. Outro ponto importante de ressaltar é que não se sabe exatamente quantas máquinas virtuais podem ser executadas por processador, sem que haja o prejuízo da qualidade de serviço.
* Enorme uso da memória da maquina real, depois de uma grande tempo de estar em modo ligada. Isso ocasiona lentidão para o usuário que está utilizando.

## Segurança

Embora a máquina necessite do sistema real para sua inicialização, trabalha de maneira independente como se fosse outro computador, isto requer também um sistema de segurança independente, ou seja, a ocorrência de infecção por vírus na máquina virtual não afeta a máquina real.
Em geral o conceito sobre máquinas virtuais vem crescendo, não só pela performance apresentada nos resultados, mas pelo custo reduzido de hardware e manutenção, o que facilita muito o uso desses softwares.