仮想機械

仮想機械（かそうきかい、仮想マシン、バーチャルマシン、、VM）とは、アプリの使用を最適化する方法であり、コンピュータの動作を再現するソフトウェアである。すなわち、エミュレートされた仮想のコンピュータそのものも仮想機械という。仮想機械によって、1つのコンピュータ上で複数のコンピュータやOSを動作させたり、別のアーキテクチャ用のソフトウェアを動作させることができ、アプリケーションが互いに干渉するのを防げる。
仮想機械によるアプローチは、企業や個人がレガシーアプリケーションに対処し、1台のコンピュータで処理できるさまざまな種類のアプリケーションを最大化することで、ハードウェアの使用を最適化するための一般的な方法である。
システム仮想機械.
システム仮想機械はシステム全体を再現し、その上でOSを動かすことを可能にする。動作させるOSにいくらかの変更を加えることが必要な場合(準仮想化)もある。
システム仮想機械では、複数の仮想機械に計算資源やメモリ資源、ディスク資源を効率的に配分(スケジュール)したり、ハードウェア割り込みなどを伝達する必要がある。これらを制御するプログラムをハイパーバイザと呼ぶ。
システム仮想機械は、ユーザーやプログラムから「別のコンピュータ」に見えるもの（OS環境を実現するもの）を指すが、コンピュータの初期には仮想記憶やマルチタスク、マルチユーザー、タイムシェアリングなど、現在ではOSの機能となった技術を含める場合がある。仮想機械の技術はメインフレームで使われていたが、現在でコンピュータによるサービス提供の分野で一般的な技術となりつつある。
クラウドコンピューティングにおいてハードウェアに依存しない仮想実行環境の構築は基盤技術(IaaS)として利用される。
メインフレーム.
ハードウェアによる仮想化.
1940年代-1950年代のコンピュータは、機種ごとにアーキテクチャが異なるのがあたりまえであったが、既存の設計を参考にすることで新規設計のリスクを避けたり、よそのコンピュータの既存のプログラム・ライブラリを流用するためなどの目的で、既存機と命令セットに互換性を持たせたり論理設計を共通にした、一種の互換機と言えるマシンも存在した。たとえばEDSACはよく参考にされた。
1958年 IBM 709は、既存のIBM 704の命令セットをマイクロコードでエミュレーションし、上位互換性を提供した。
1964年 IBM System/360は、同様に既存のIBM 1401やIBM 1620の命令セットをマイクロコードでエミュレーションした。また、コンピュータ・アーキテクチャを定義し標準化し、以後の互換性を提供した（通常は仮想化と呼ばれないが、プログラムから見れば一種の仮想機械と言える。この効果として、メインフレームではアセンブリ言語でもバイナリでも、40年以上経過した現在まで互換が続いている）。
1973年 IBM System/370モデル158およびモデル168により、物理分割（PPAR）をサポート。単一のコンピュータとしても、複数のコンピュータとしても使用可能。ただし細かいリソースの割り当てはできず、変更にはコンピュータ全体の再起動が必要。
1987年 IBM 3090 の PR/SMにより、多数の論理区画（LPAR）を作成し、コンピュータ全体の停止を伴わず、より柔軟なリソースの割り当てが可能となった。
IBMのPR/SMに相当する機能には、日立製作所 PRMFなどがある。
仮想化OSによる仮想化.
1964年 IBM System/360では、商用初の仮想化OSである CP-40、CP-67により、ひとつのコンピュータで複数の仮想コンピュータを作成し、それぞれでゲストOS （MVSやCMSなど）を稼動させる事ができた。この仮想化OSは VM/CMS となり、現在も z/VM として、多数のゲストOS（Linuxなど）を同時稼動させる用途でも使われている。
IBMのz/VMに相当する製品には、富士通 AVM、日立製作所 VMS などがある。
OSによるリソースの仮想化.
OSの機能による各種リソースの仮想化には、仮想記憶やマルチタスク、マルチユーザー、タイムシェアリングなどがある。
主記憶装置の仮想化である仮想記憶は、商用では1961年のバロース B5000で登場し、1970年のIBM System/370で広く普及した。
マルチタスク（アプリケーションによるマルチプログラミングではなく、OSの機能によるマルチタスク）は商用では、OS/360のバリエーションのひとつであるMVTと、後継のMVSで登場し、広く普及した。入出力待ちなどにCPUが他の処理を行えるため、処理の応答時間短縮と全体のスループット向上がもたらされた。
なお、メインフレームにおけるこれらの「マルチタスク」は、単に複数のプログラムが同時に動かせるというだけではなく、複数の独立したアドレス空間（リージョン）を作成し、ハードウェアの機能も使用して完全に分離し、同時稼働するプログラム同士は直接見えない（バグや悪意あるプログラムでも相互に干渉できない）ものである。この点では、後の各種UNIXやWindowsなどの「マルチタスク」と比較すると、「仮想機械」に近いレベルのもので、可用性やセキュリティも向上した。同様の仕組みは2009年現在、MVSの後継のz/OSの他、IBM z/VSE、富士通 MSP/XSP、日立製作所 VOS3 などでも採用している。
タイムシェアリング（時分割多重）による並列処理（マルチユーザー）は、アプリケーションプログラムやユーザーに、複数のコンピュータを同時使用するイメージをもたらし、オンライン・リアルタイム処理の普及をもたらした。なお、マルチタスクとタイムシェアリングは別の技術であるが、現在では組み合わせて使用されている。（上記のMVSなどでは、マルチタスク環境の一部で、タイムシェアリング環境を稼働させ、それによりマルチユーザーを実現している。またマルチタスク自体も、初期には入出力待ちによる割り込みが基本であったが、現在ではタイムシェリングによる割り込みを併用している。）
ミッドレンジ.
1979年 IBM System/38は、TIMI（Technology Independent Machine Interface、技術に依存しないマシンインターフェイス）を採用した。TIMIは、メインフレームで採用されたマイクロコードによる互換性確保を更に進めたもので、主に水平型レベル・マイクロコードにより実現され、ハードウェア・アーキテクチャ(CPU命令セット等)とプログラムを分離している。プログラムの配布は中間コードであるバイトコードで行われ、インストール時にハードウェアの命令セットに展開される。このためソースプログラムを配布すること無く、実行時の性能を犠牲にすることもなく、別のアーキテクチャのハードウェアへの移行も容易である。実際、CPUアーキテクチャの移行(独自CISC→POWER)も容易に行えたとされる。
TIMIはSystem/38後継のAS/400、iSeries、System i、Power Systems i Edition に、現在でも使用されている。また現在はLPARなどと併用できる（後述のPowerVMを参照）。
各社の商用ミッドレンジコンピュータ（オフィスコンピュータ、ミニコンピュータ）では、TIMIと同等の機能を持ったシリーズは、過去も現在も存在しない。
商用UNIX.
商用UNIXベンダーによる仮想化技術には以下がある。現在の仮想化技術は各種のハードウェアとソフトウェアが密接に連携しており、またベンダーにより各技術の範囲が異なるため、ベンダー単位に記載する。
UNIX/Linux/Windowsなど.
UnixやLinux、Windows上で動作する仮想マシンには、VMwareやXen、Oracle VM（ベースはXen）、Hyper-Vなどがある。物理的資源を区分けして特定のワークロードがシステム全体を独占させない機構(仮想マシンモニタ)を持つ。
一台のコンピュータを複数のコンピュータとして使うことができる。オペレーティングシステムの変更なしに複数のゲストオペレーティングシステムを稼働できる。稼働させる複数のゲストオペレーティングシステムは、全く別の種類のオペレーティングシステムであることも可能である。
元々仮想マシンモニタはメインフレームにおいてその資源を各ワークロードの負荷に応じて動的に分割し、システム全体の利用効率を上げるために用いられた。計算機が高性能化した現在では、小規模なWebホスティングのような処理であっても、それらを仮想マシンモニタを用いて並列に実行することが行われている。
CPUの機能による仮想化.
1985年 インテルの80386で採用された仮想86モードは、保護モード導入以前のx86のアーキテクチャに則ったタスクを保護モード上で実行する仮想機械を提供する。 OS/2 2.0 や Windows 3.0などのDOS互換環境（仮想DOSマシン）で使用された。
現在のCPUアーキテクチャ(SPARC, POWER, IA-64など)では、それぞれ仮想マシンソフトウェアとOSによる仮想化を支援する命令セットを持っている。
プロセス仮想機械.
いくつかのアプリケーション・プログラムを動作させるための仮想機械。いくつかのプログラミング言語やその実装では理論上の機械によって実行されることを想定しているので、その機械をエミュレートする場合が多い。
実装.
ソフトウェアによる仮想CPUにバイトコードを実行させる形式が一般的である。バイトコードの実行方法にはインタプリタ方式、実行前に全バイトコードをネイティブに変換する事前コンパイル方式、実行時コンパイル方式がある。現在では、性能の観点から実行時コンパイル方式が主流である。
アーキテクチャ.
ハードウェアの制約がないのが特徴である。
型つきの演算をサポートしている仮想機械もある。
仮想機械のハードウェア化.
これらの仮想機械は理論的に設計されたものであるが、実行を最適化するために対応するハードウェアが製造される場合もある。