# Virtualização

Em computação, virtualização é o ato de criar uma versão virtual (ao invés de real) de algo, incluindo a simulação de uma plataforma de hardware, sistema operacional, dispositivo de armazenamento ou recursos de rede.
A virtualização começou na década de 1960, como um método de dividir logicamente os recursos do sistema fornecidos pelos computadores mainframe entre diferentes aplicações. Desde então, o significado do termo foi ampliado.
É a tecnologia central de datacenters e essencialmente transforma, obedecidas certas condições, um servidor físico em vários servidores virtuais. Os servidores virtuais criados com a virtualização oferecem um ambiente similar ao de um servidor físico e otimizam o uso de recursos, tornando as aplicações independentes do hardware. O principal motivo apontado pelas organizações para fazerem uso da virtualização tem sido a redução de custos de hardware, a melhoria da condição de recuperação a desastres e a economia de espaço para datacenters.

## História

Pode- se afirmar que o artigo “Time Sharing Processing in Large Fast Computers”, por Chrisopher Strachey, cientista da computação, na Conferência Internacional de Processamento de Informação realizada em Nova Iorque em 1959, deu início a ideia de virtualização, o qual tratou do uso de multiprocessamento em tempo compartilhado e estabeleceu um novo conceito de utilização de máquinas de grande porte.
Posteriormente a IBM introduziu o multiprocessamento nos mainframes, o que permitiu que várias unidades de processamento trabalhassem como uma só, antecipando o conceito de virtualização. Seguindo, a IBM lança então seu Sistema Operacional VM (Virtual Machine), baseado no conceito de hipervisor, que é a camada que permite que vários sistemas operacionais rodem de forma isolada em um único hardware.
Até o final da década de 1990 existia uma dificuldade tecnológica para a implementação da virtualização em servidores x86.
Em 1998 a criação da VMware é tida como marco dessa nova era, criada por Diana Greene e Mendel Rosenblum, que desenvolveram o primeiro hipervisor que permitia a virtualização de servidores em plataformas baixas x86. Já existia a empresa Connectix que desde 1996 tratava a virtualização em ambientes Mac, a qual foi adquirida pela Microsoft em 2003 vindo a lançar em 2004 seu primeiro produto com foco em virtualização o “Microsoft Virtual Server 2005”. A empresa VMware foi adquirida pela ECM em 2004.

## Conceito

Virtualização, basicamente, é a técnica de separar aplicação e sistema operacional dos componentes físicos. Por exemplo, uma máquina virtual possui aplicação e sistema operacional como um servidor físico, mas estes não estão vinculados ao software e pode ser disponibilizado onde for mais conveniente. Uma aplicação deve ser executada em um sistema operacional em um determinado software. Com virtualização de aplicação ou apresentação, estas aplicações podem rodar em um servidor ou ambiente centralizado e ser deportada para outros sistemas operacionais e hardwares.

## Workload e Throughput

Workload ou carga de trabalho constitui-se dos dados a serem processados e das instruções a serem executadas sobre esses dados e define a qualidade de serviço percebida pelo usuário na ponta. Logicamente, a workload varia de acordo com a aplicação a ser processada. Assim ela é definida pela demanda da aplicação e SGBD, combinando as diversas solicitações tais como transações online, bath Jobs, consultas analíticas e comandos dirigidos a aplicação.
O Throughput define a capacidade de hardware/software para processar os dados e é composto por velocidade I/O, velocidade de CPU, capacidade de paralelismo e eficiência do SO.

## Desafios da virtualização

Cada vez mais empresas estão buscando formas de reduzir os custos e complexidade com o ambiente de TI. A virtualização se tornou um componente chave para o desenvolvimento de uma estratégia eficiente na busca destes objetivos. Dentre os desafios enfrentados nos ambientes de data centers, e cuja solução pode ser encontrada na virtualização, podemos destacar:
* Servidores subutilizados: por meio da virtualização, pode-se fazer um uso mais eficiente do hardware disponível. Adotando a estratégia organizacional conhecida como consolidação de servidores, que advoga o uso de máquinas virtuais para abrigar os diversos servidores (de nomes, de arquivos, de e-mail, de Web) de um determinado domínio;
* Gerenciamento e segurança complexa dos servidores: também por meio da consolidação de servidores, a manutenção de um parque computacional torna-se mais simples em função da concentração/centralização de sistemas em uma quantidade menor de dispositivos físicos. A virtualização também tem como uma de suas principais características o isolamento: permite isolar entre si subsistemas independentes (exemplos: DNS, e-mail, web, aplicação, banco de dados, arquivos, impressão) que executam sobre o mesmo hardware;
* Problemas de compatibilidade entre interfaces: a presença de interfaces rígidas entre hardware, sistemas operacionais, bibliotecas e aplicações diminui a compatibilidade entre os componentes, por exemplo, não é possível executar diretamente aplicações Microsoft Windows em um sistema operacional Linux, ou também um sistema operacional Microsoft Windows sobre um hardware Sun SPARC. A virtualização provê uma camada abstrata construída em software para permitir a interoperabilidade entre componentes antes incompatíveis.
* Data centers atingiram a capacidade máxima.

## Soluções de virtualização

Abaixo, as formas mais comuns de virtualização:
* Virtualização de servidor: técnica de execução de um ou mais servidores virtuais sobre um servidor físico; permite maior densidade de utilização de recursos (hardware, espaço e etc.), enquanto permite que isolamento e segurança sejam mantidos;
* Virtualização de aplicação: a virtualização de aplicação permite executar aplicações em um ambiente virtualizado no desktop do usuário, isolando a aplicação do sistema operacional; isso é possível através do encapsulamento da aplicação no ambiente virtual — quando a solução completa de virtualização de aplicações é implantada, é possível distribuir aplicações de um servidor central. Um programa de computador em execução em um sistema operacional comum pode ver todos os recursos (dispositivos conectados, arquivos e pastas, compartilhamentos de rede, CPU, capacidade de hardware quantificável) desse computador. No entanto, programas em execução dentro de um contêiner só podem ver o conteúdo e os dispositivos do contêiner atribuídos ao contêiner;
* Virtualização de desktop: consiste na execução de múltiplos sistemas operacionais em uma única estação de trabalho, permitindo que uma aplicação de linha de negócio seja executada em um sistema operacional não compatível;
* Virtualização de apresentação: a virtualização de apresentação permite executar e manter o armazenamento das aplicações em servidores centralizados, enquanto provê uma interface familiar para o usuário em sua estação;
* Virtualização de dados: é uma abordagem para unificar dados de várias fontes em uma única camada para que aplicativos, ferramentas de relatórios e usuários finais possam acessar os dados sem precisar de detalhes sobre a origem original, a localização e as estruturas de dados;
* Virtualização de programa: Virtualização de aplicativos e virtualização de espaço de trabalho: isolando aplicativos individuais do sistema operacional subjacente e de outros aplicativos; intimamente associado com o conceito de aplicações portáteis;
* Virtualização de serviços: emulando o comportamento de componentes específicos em aplicativos heterogêneos baseados em componentes, como aplicativos orientados por API, aplicativos baseados em nuvem e arquiteturas orientadas a serviços;
* Virtualização de memória: agregando recursos de memória RAM de sistemas em rede em um único conjunto de memórias;
* Memória virtual: dando a um aplicativo a impressão de que ele possui uma memória de trabalho contígua, isolando-o da implementação da memória física subjacente;
* Virtualização de armazenamento: o processo de abstrair completamente o armazenamento lógico do armazenamento físico;
* Sistema de arquivos distribuídos: qualquer sistema de arquivos que permita o acesso a arquivos de vários hosts que compartilham através de uma rede de computadores;
* Sistema de arquivos virtual: uma camada de abstração sobre um sistema de arquivos mais concreto, permitindo que aplicativos clientes acessem tipos diferentes de sistemas de arquivos concretos de maneira uniforme;
* Hypervisor de armazenamento: o software que gerencia a virtualização de armazenamento e combina recursos de armazenamento físico em um ou mais conjuntos flexíveis de armazenamento lógico;
* Disco virtual: um programa de computador que emula uma unidade de disco, como uma unidade de disco rígido ou unidade de disco ótico (consulte a comparação do software de imagem de disco);
* Virtualização de perfil: com a virtualização de perfil, os usuários podem ter os documentos e perfil separados de uma máquina específica, o que permite a fácil movimentação do usuário para novas estações em caso de roubo ou quebra de equipamento. A virtualização de perfil também permite ter uma experiência de desktop única quando utilizando outras tecnologias de virtualização, como VDI (virtual desktop infrastructure);
* Virtualização de rede: criação de uma rede virtualizada endereçando o espaço dentro ou através de sub-redes de rede;
* Rede privada virtual (VPN): um protocolo de rede que substitui o fio real ou outra mídia física em uma rede com uma camada abstrata, permitindo que uma rede seja criada pela Internet;
Um dos componentes críticos para a implantação de um projeto de virtualização, independente da tecnologia utilizada, são as ferramentas de gerenciamento. As ferramentas que gerenciam o ambiente virtual devem gerenciar tanto o ambiente físico como o virtual, assim como sistema operacional e aplicações.
As instruções de virtualização são processadas em variáveis locais utilizando um modelo principal modelo de computação, usualmente cada stack machine, register machine, ou Random access machine são chamadas de máquina memória. A utilização destas três técnicas é motivada por técnicas de otimização de máquinas virtuais e máquinas físicas, como a facilidade utilização do interpretador, compilação e verificação para a segurança.
O gerenciamento de memória nestes sistemas portáveis de virtualização inicia-se num nível superior de abstração que num caso típico de máquina física. Alguns programas de virtualização, como a popular JVM, gerem os endereços de memória numa determinada maneira, que requerem um seguro gerenciamento automático da memória permitindo à maquina virtual manter registos de referências indicativas, e não permitir que o código fonte possa construir novas referências indicativas na memória. Outros tipos de software de virtualização como os LLVM, são mais parecidos como uma computador tradicional, permitindo o uso e manipulação de indicadores de memória. A CIL oferece uma solução híbrida entre as soluções apresentadas, oferecendo os dois tipos de controle da memória (como o JVM, que permite gestão de memória automática), e também um modo "inseguro" que permite manipulação de indicadores num modo que pode violar os constrangimento dos tipo e suas permissões.
Segurança do programa refere-se habilidade do software portável da virtualização executar código enquanto subscreve determinado conjunto de capacidades. Por exemplo, uma máquina virtual pode somente deixar aceder a um conjunto de instruções ou dados. Os mesmos controles sobre indicadores que tornam a gestão automática da memória possível e segurança do programa, asseguram que um fragmento de código só têm acesso a um determinado conjunto de elementos da memória e não pode subverter a própria máquina virtual. Outros mecanismos de segurança são aplicados no seguimento de técnicas de verificação do código, verificação de pilhas, e outros processos.
Um Interpretador permite aos programas compostos de instruções de virtualização serem preparados e executados imediatamente sem sofrerem um atraso potencialmente caro de compilação em código de máquina. Qualquer sistema de virtualização que pode ser executado pode ser interpretado, por isso a designação da coluna aqui, refere-se a questão da implementação inclui provisões para uma interpretação eficiente. (para usos comuns).
Compilador just-in-time ou JIT, refere-se ao método de compilação do código nativo diferindo para o último momento possível, de preferência mesmo antes ou durante a execução do programa. A dificuldade do JIT tem a ver mais com a implementação que arquitetura da máquina de virtualização, mesmo assim, novas teorias e implementações começaram a ter em conta a eficiência. A técnicas mais simples de JIT, simplesmente executam a compilação para um fragmento-código de maneira similar a um compilador tradicional. As técnicas mais utilizadas, têm em conta o tipo de código especializado aos parâmetros que só são conhecidos na altura da execução. (ver en:Adaptive optimization).
Pre-compilação refere-se a uma técnica mais clássica de utilização de um compilador offline para gerar o código nativo que não se altera durante a execução. Pelas razões que uma compilação agressiva e otimização podem demorar tempo, um programa pré-compilado pode iniciar a execução mais rápido que outro que dependo somente da técnica JIT. As implementações JVM reduziram esta diferença do custo de carregamento do programa, inicialmente utilizando interpretação, até que alguns fragmentos de código nativo possam ser gerados através do JIT.
Biblioteca compartilhada é uma técnica para reutilizar os segmentos de código nativo entre vários programas que estão em execução. Nos sistemas operativos modernos, isso geralmente significa que a memória virtual partilha páginas de memória que contem bibliotecas partilhadas de diferentes processos que estão protegidos de outros processos através da proteção de memória. É interessante que técnicas agressivas de JIT como a optimização adaptativa, usualmente produz fragmentos de código não reutilizável ou compartilhar com outros processos ou mesmo novas execução do programa, requerendo um compromisso entre eficiência do código pré-compilado e código partilhável e as vantagens do código especializado e adaptativo. Por exemplo, algumas provisões no desenho e estrutura do CIL estão presentes para permitir a partilha eficiente das bibliotecas, possivelmente com o custo de código JIT mais especializado. A implementação JVM no Mac OS X utiliza o Java Shared Archive (apple docs) para dar algum benefício da técnica de compartilha de biblioteca.

## Virtualização de Hardware

Virtualização de hardware ou virtualização de plataforma refere-se à criação de uma máquina virtual que funciona como um computador real com um sistema operacional. O software executado nessas máquinas virtuais é separado dos recursos de hardware subjacentes. Por exemplo, um computador que esteja executando o Microsoft Windows pode hospedar uma máquina virtual, que se parece com um computador, com o sistema operacional Ubuntu Linux; Os softwares baseados no Ubuntu podem ser executados na máquina virtual de acordo com a lei n° 1034165/4154206416.
A virtualização aninhada torna-se mais necessária à medida que os sistemas operacionais difundidos ganham a funcionalidade integrada do hypervisor, que em um ambiente virtualizado pode ser usado somente se o hypervisor circundante oferecer suporte à virtualização aninhada. Por exemplo, o Windows 7 pode executar aplicativos do Windows XP dentro de uma máquina virtual integrada. Além disso, mover ambientes virtualizados existentes para uma nuvem, seguindo a abordagem de infraestrutura como serviço (IaaS), é muito mais complicado se a plataforma IaaS de destino não suportar virtualização aninhada.
A forma como a virtualização aninhada pode ser implementada em uma arquitetura de computador específica depende dos recursos de virtualização assistida por hardware suportados. Se uma arquitetura específica não fornecer suporte de hardware necessário para virtualização aninhada, várias técnicas de software são empregadas para ativá-la. Com o tempo, mais arquiteturas ganham suporte de hardware necessário. Por exemplo, desde a microarquitetura Haswell (anunciada em 2013), a Intel começou a incluir o VMCS shadowing como uma tecnologia que acelera a virtualização aninhada.

### Licenciamento

Máquinas virtuais que executam sistemas operacionais proprietários exigem licenciamento, independentemente do sistema operacional da máquina host. Por exemplo, a instalação do Microsoft Windows em uma instalação VM (guest) requer que seus requisitos de licenciamento sejam atendidos.

## Virtualização de Desktop

A virtualização de desktops é o conceito de separar o desktop lógico da máquina física.
Uma forma de virtualização de desktops, a infraestrutura de desktop virtual (VDI), pode ser considerada uma forma mais avançada de virtualização de hardware. Em vez de interagir diretamente com um computador host por meio de teclado, mouse e monitor, o usuário interage com o computador host usando outro computador ou dispositivo móvel por meio de uma conexão de rede, como LAN, LAN Wireless ou até mesmo a Internet. Além disso, o computador host nesse cenário se torna um computador servidor capaz de hospedar várias máquinas virtuais ao mesmo tempo para vários usuários.
À medida que as organizações continuam a virtualizar e a convergir seu ambiente para data centers, as arquiteturas de clientes também continuam a evoluir para aproveitar a previsibilidade, a continuidade e a qualidade do serviço oferecido por sua infraestrutura convergente. Por exemplo, empresas como a HP e a IBM fornecem um modelo VDI híbrido com uma variedade de modelos de software e entrega de virtualização para melhorar as limitações da computação distribuída do cliente.
Ambientes de clientes selecionados movem cargas de trabalho de PCs e outros dispositivos para servidores de data center, criando clientes virtuais bem gerenciados, com aplicativos e ambientes operacionais de clientes hospedados em servidores de armazenamento no data center. Para os usuários, isso significa que eles podem acessar sua área de trabalho de qualquer local, sem estarem vinculados a um único dispositivo cliente. Como os recursos são centralizados, os usuários que se deslocam entre locais de trabalho ainda podem acessar o mesmo ambiente de cliente com seus aplicativos e dados. Para os administradores de TI, isso significa um ambiente de cliente mais centralizado e eficiente, mais fácil de manter e capaz de responder mais rapidamente às novas necessidades do usuário e da empresa.
Outra forma, a virtualização de sessão, permite múltiplos usuários se conectarem e acessarem, pela rede, a um computador compartilhado, mas poderoso, e o usem simultaneamente. Cada um recebe uma área de trabalho e uma pasta pessoal na qual armazenam seus arquivos. Com a configuração multi-terminal, a virtualização de sessão pode ser realizada usando um único PC com vários monitores, teclados e mouses conectados.
Cliente Thin, que são vistos na virtualização de desktops, são computadores simples e/ou baratos, projetados principalmente para conectar-se à rede. Elas podem não ter espaço de armazenamento em disco rígido, RAM ou até mesmo poder de processamento, mas muitas organizações estão começando a considerar os benefícios de eliminar desktops robustos que estão cheios de software (e exigem taxas de licenciamento) e fazer investimentos mais estratégicos. A virtualização de desktops simplifica o controle de versão de software e o gerenciamento de patches, onde a nova imagem é simplesmente atualizada no servidor e a área de trabalho obtém a versão atualizada quando é reinicializada. Ele também permite o controle centralizado sobre quais aplicativos o usuário pode acessar na estação de trabalho. A migração de desktops virtualizados para a nuvem cria HVDs (Hosted Virtual Desktops), nos quais as imagens da área de trabalho são gerenciadas e mantidas centralmente por uma empresa especializada em hospedagem. Os benefícios incluem a escalabilidade e a redução do gasto de capital, que é substituído por um custo operacional mensal.

## Lista de implementações de máquinas virtuais

Em soma aos métodos de virtualização portável descritas acima, as máquinas virtuais são usualmente utilizadas como modelo de execução para linguagens individuais de script. Esta tabela descreve as implementações de máquinas virtuais, ambos da categoria de máquinas virtuais portáveis e máquinas virtuais de linguagens de script.
| Máquina virtual | Linguagens | Comentários | Interpretador | Compilação Just in Time | Linguagem de implementação | Linhas de código fonte |
| Adobe Flash Player (aka Tamarin) | ActionScript, SWF (formato ficheiro) | Ferramenta de autoria web interativa. bytecode é chamado de "ActionScript Byte Code (.abc)" | Sim | Sim | C++ | 135k (lançado inicialmente) |
| BEAM | Erlang, Reia, Lisp Flavoured Erlang, Elixir | Existe um compilador de código nativo, HiPE. | Sim | Não | C | 247k |
| Clipper p-code | Clipper, Harbour | plankton, HVM | Sim | Não | C | |
| Dis (Inferno) | Limbo | Dis Virtual Machine Specification | Sim | Sim | C | 15k + 2850 por JIT arch + 500 por host OS |
| DotGNU/Portable.NET | Linguagens de programação CLI incluindo: C# | Clone do Common Language Runtime | Não | Sim | C, C# | |
| Forth | Forth | Funções estão simplificadas, normalmente contêm assembler, compilador, interpretadores de nível-textos e nível-binários, algumas vezes com editor, depurador e sistema operacional. Velocidade de compilação é >20 SKLOC/S e comporta-se como JIT. | Sim | Não | Forth, Forth Assembler | 2.8K to 5.6K; avançado, implementações profisionais são menores. |
| Icon | Icon | | | | | |
| JVM | Java, Jython, Groovy, JRuby, C, C++, Clojure, Scala e outros | Implementação de Referência por Sun; OpenJDK: código sob GPL; IcedTea: código e ferramentas sob GPL | Sim | Sim | JDK, OpenJDK & IcedTea com JIT regular: Java, C, ASM; IcedTea com o "Zero" JIT: Java, C | JVM contêm cerca de 6500k linhas; TCK é 80k de testes e têm cerca de 1000k linhas |
| LLVM | C, C++, Objective-C, Ada, e Fortran | MSIL, C and C++ output are supported. ActionScript Byte Code output is supported by Adobe Alchemy. bytecode is named "LLVM Bytecode (.bc)". assembly is named "LLVM Assembly Language (*.ll)". | Sim | Sim | C++ | 811k |
| MMIX | MMIXAL | | | | | |
| Mono | Linguagens CLI incluindo: C#, VB.NET, IronPython, IronRuby e outros | Clone do Common Language Runtime. | Sim | Sim | C#, C | 2332k |
| Oz | Oz, Alice | | | | | |
| NekoVM | Atualmente Neko e haXe | | Sim | x86 apenas | C | 46k |
| O-code machine | BCPL | | | | | |
| UCSD p-System | Pascal | UCSD Pascal, muito utilizado no final da década de 1970 incluindo o Apple II | | | | |
| Parrot | Perl (6 & 5), PASM, PBC, BASIC, bc, C, ECMAScript, Lisp, m4, Tcl, WMLScript, XML, e outros | | Sim | Sim | C, Perl | 111k C, 240k Perl |
| Perl virtual machine | Perl | andador de ávore de op-code | Sim | Não | C, Perl | 175k C, 9k Perl |
| CPython | Python | |