TL;DR
物理的なコンピュータの機能を提供する、仮想化またはエミュレートされたコンピュータシステム。Popek と Goldberg は「実際のコンピュータの、効率的で隔離された複製」と定義した。
なぜ必要か
Wikipedia によると、仮想マシンはセキュリティのためにアプリケーションどうしを隔離する目的でよく使われる。1 台の物理マシンで複数の OS を動かしたり、サーバを集約したりすることもできる。
仕組み
仮想マシンには大きく 2 種類ある。
システム仮想マシンは実際のマシンの代わりになり、OS をまるごと動かせる。ハイパーバイザがハードウェアを共有・管理し、1 台の物理マシンの上で互いに隔離された複数の環境を動かす。VMware ESXi、Hyper-V、KVM、Xen、VirtualBox などがある。
プロセス仮想マシンは、ホスト OS の上で普通のアプリケーションとして動き、1 つのプロセスを支える。ハードウェアや OS の違いを隠し、プラットフォームに依存しない実行環境を提供する。Java の JVM や、.NET の Common Language Runtime がこれにあたる。
例
- Compute Engine のような IaaS は、システム仮想マシンをサービスとして提供する
- WebAssembly は、仮想マシンとその命令セットを定めた仮想命令セットアーキテクチャである