No325 仮想マシンって結局なんなの?
前回のクラウドのお話の中で「仮想マシン」というコトバが出てきました。
今回はこの仮想マシンというものについてお話をします。
なぜスマホのアプリはパソコンで動かないのか?
一般的にスマホのアプリはパソコンでは動きませんし、パソコンのアプリもスマホでは動きません。
「そりゃそうでしょ」という方に質問。
なぜ、iOSのソフトはAndroidで動作できないのでしょうか?
「そりゃアーキテクチャ(設計思想)が違うからだよ」という方、お見事です。そのまま3章まで飛ばしていただいて構いません。
さて、スマホとパソコンでアプリが共有できないのは、画面の大きさ、キーボードやマウスの有無といった見た目の違いだけではなく、それ自体の設計思想がまるで違うものだからです。
具体的には、実際の計算を行うパーツ(CPU)が種類毎にアーキテクチャ(設計思想)が違う点、各機器に載っているOSによって提供しているサービスが異なる点の二つです。
Androidスマホ: ARM社が設計したCPU +Google社が設計したOS
iPhone,iPad: Apple社が設計したCPU +Apple社が設計したOS
Windows: Intel社が設計したCPU +Microsoft社が設計したOS
MacOS: Intel社が設計したCPU +Apple社が設計したOS
このようにCPUとOSの設計が異なっていると共用化はできないのです。
さて、アプリ(プログラム)というのは、コンピュータに対する指示書です。
指示書にはそのプラットフォーム(Androidスマホ、Windowsパソコンなど)で理解できる言語で書いてある必要があります。
だから、Androidのプログラムをパソコンに渡したって、CPUも違えばOSも違いますから、全く話が通じません。
サンスクリットで書かれた指示書を日本人に渡すようなものです。理解できるはずがありません。
iOSで提供されているアプリをAndoridに持っていっても動かないし、パソコンのソフトをiOSに持っていっても動かないのはこういう理由です。
余談
ここで言う指示書は「機械語」というかなりやっかいな言葉で書かれています。
機械語はCPU毎にまるで違うものになっています。
ちなみに、プログラマはプログラム言語(Java、C、PHP、Pythonなど)を使います。
このプログラムはコンピュータ自身は直接理解できません。それぞれのCPUに合わせたコンパイラやインタープリタといった変換ソフトを使い、正しい機械語にする必要があります。
機械語に興味のある方は2022年8月に配信した号外をどうぞ
「号外 機械語は低レベル言語で激ムズ」
https://note.com/egao_it/n/na190bb3636c7
エミュレータ
この不便さを何とかしたいという動きは大昔からありました。
そもそも、1970年以前の昔はソフトウェアの互換性など皆無で、コンピュータを換えたらソフトウェアは全て書き直すのがあたり前だったようです。
ですので、全てを書き直すのはあんまりだということで旧機種のまねっこをするソフトウェアが作られたりしていたようです。
こういった、他の機械の動きをまねっこするプログラムのことをエミュレータと呼びます。
余談
同様の用語でシミュレータというものもあります。
こちらは、パイロットの訓練用のシミュレータなどが有名ですね。
エミュレータが実機と同じ動作をするのに対して、シミュレータは擬似的であっても(期待の結果が得られれば)良い点が違うようです。(諸説あります)
コンピュータでのエミュレータは、対象となるCPUアーキテクチャをソフトウェアでまるごとまねっこしようというものです。
実機がハードウェアで実現していることをソフトウェアで100%のマネをすれば、実機と同じことじゃないか、という理屈です。
理屈は良いのですが、これにはものすごい問題があります。
ソフトウェアってハードウェアに比べて遅い、それも激烈に遅いです。
例えば、「値が▽▽だったら、これは○○命令のはずだから、まず◇して次に△して...」という手順をソフトウェアで組むわけです。
仮にその手順が20個の命令で実現できたとしても、20倍遅いわけです。
要は、エミュレータというのはどうしてもハードウェアに比べれば遅くならざるを得ないのです。
実際、複数のCPUが利用されていた1980年代や1990年代には様々なエミュレータが登場しましたが、どれもこれも速度に問題があり、決してヒットすることはありませんでした。
それでも、高速なコンピュータを使ってエミュレータを動かす人はいましたが、好事家の道楽といったレベルでした。
CPUのマルチコア化
さて、いきなり話が変わります。
1990年代にはCPUの高速化競走が激化しました。
当時は1つのCPUには1つのコア(計算回路+制御回路)が当然でしたから、高速化のためには必然的に動作クロック向上が必要となりました。
ところが、2000年あたりでこの方式に限界が見えてきます。
高速化するには発熱が多すぎて、これ以上の高速化はムリ(商業的に成立しない)となったのです。
その結果、メーカはマルチコア、つまり1つのCPUの中に複数のコアを載せ、必要に応じて複数のコアが協調して動作させる方式に変えていきました。
マルチコアのメリットを享受するには、OSやソフトウェア側の対応も必要になりますので、移行期間には何年もかかりましたが、それでも2010年頃にはマルチコアへの対応がほぼ完了することとなりました。
仮想マシンの登場
-----------
さて、このマルチコア化は仮想マシンの登場に必須の機構でした。
2000年頃には、VMware社という会社からVMwareという製品が登場します。
この製品は、1つのパソコン上で2つ以上のOSを起動できるというもので、いわばハードウェアの実態を隠して、仮想的なハードウェアを提示するソフトウェアでした。
例えば2つ目のWindowsを起動したい場合には、ホストOS(普通に動いているWindows)の上でVMwareを動かし、さらにその上で2つ目のWindowsを起動します。
この2つ目のWindowsは起動する時に、メモリ容量やハードディスクなどのハードウェアの状態を確認します。
通常なら、そのコンピュータのデバイス(パーツ)にアクセスできますが、VMware上で動くWindowsにはその権限を与えず、VMwareが実際のハードウェアになり替わって答えを返すわけです。
例えば、Windowsがメモリ容量を確認しようとすると、WMwareは本当は16GB載っていても、4GBと答えたりするわけです。(VMwareの設定で変更できます)
2つ目のWindowsからすると、その答えを疑う理由がありませんから「そうなんだ」と思って起動してくれます。
結果、めでたくWindowsの上のVMware上で2つ目のWindowsが起動できるというわけです。
つまり、VMwareというソフトウェアは、実際には存在しない仮想的なコンピュータがいかにもあるかのように振る舞ってくれるわけです。
ですが、Windowsの上でWindowsを動かしたい人なんているのでしょうか?
こんな製品に商品価値があるのでしょうか?
実は筆者も含めて多くのシステム開発者がこれに飛び付いたのです。
なぜでしょうか?
システム開発をする人は、開発用と動作確認用の二つのコンピュータが必要です。
ある程度の動作は開発用でこなせますが、正確な動作確認には余計なもの(開発ツールとか)が入っていないコンピュータでのテストが欠かせません。
ですが、この確認用コンピュータの手配とメンテナンスが大変なんです。
動作確認用だからといって、開発が終わったら廃棄というわけにはいきません。
だって、何らかの不具合が出た時に、それが再現できる環境がなければ困るからです。
かくして、世のシステム開発会社の中にはちっとも使っていないコンピュータが溢れてきます。
下手に廃棄してしまうと、トラブル時に困ります。かといって置き場所ばかり取られるのも困ります。さらに機械が故障してしまうとやっぱり困ります。
そんな中で登場したVMwareの製品は非常に魅力的でした。
これなら、開発用コンピュータの中に検証用コンピュータが作れて、まるで実機のように動いてくれるわけです。マルチコアをうまく利用しますから速度も十分に実用的です。
さらに、開発が完了しても、そのコンピュータの中に設定を残しておきさえすれば、いつでも再起動してトラブル調査にも対応できる。
さらにさらに、コンピュータを買い替えても、その設定ごと移行しておけば新しいコンピュータ上でも以前と同様に使い続けられる。
実際、筆者は開発機としてWindows8を使いながら、Windows Server2012上の開発を行なったり、CentOS(Linux)上での開発を行ったりしていましたが、とても快適でした。
この仮想マシンが普及してからは、社内にあった保守用のコンピュータが次々となくなった(仮想マシン化していった)のを覚えています。
データセンターへの進出
さて、ここでようやく仮想マシンとクラウドがつながってきます。
仮想マシンが大いに受けたVMware社は、次にCPUを溢れんばかりに持っているデータセンターに目を付けます。
データセンターでは、たくさんのサーバ(コンピュータ)を保有しています。
データセンターの代表的な業務がレンタルサーバです。
こういったデータセンターでは、一台のコンピュータをお客さんに貸すわけですが、必ずしも24時間稼動しているわけではありません。
サーバが1000台あれば、1000人のお客さんには貸し出しできますが、逆にそれ以上のお客さんには提供できません。
ですが、今時のCPUなら上述のようにマルチコアがあたりまえです。
例えば、1つのCPUに4つのコア(実際にデータセンターで使うコンピュータにはもっとたくさんのコアが載ってます)だとしても1000台のサーバで、4000コアもあるのです。
これを1コアづつお客さんに提供できれば、4000人にサーバが提供できますし、単価も安く設定できます。
また、月締めや決算処理で一時的にパワーが欲しいお客さんには一時的に10コア貸し出しといったことができれば、データセンター側は稼動率が上げられますし、お客さんにも低価格でサービス提供できます。
こういった応用は仮想マシンならお手のものです。
現在のクラウド環境では「いつでも必要なだけコンピュータが利用できる」と言われますが、この裏方を支えているのは仮想マシンであり、それを実現するVMwareなどのソフトウェアなのです。
まとめ
仮想マシンというのはエミュレータの一種です。
エミュレータというのは、実機の動作をまねっこするソフトウェアのことを言いますが、仮想マシンというのはその進化形と言えます。
もともと、エミュレータには速度が十分に出ずらいという課題がありました。
その最大の理由はアーキテクチャ(設計思想)の違うCPUやハードウェアをエミュレートしようとしていたからです。
それに対して、VMware社は同じアーキテクチャ(具体的にはパソコンで使われるIntel社のCPU)上で別のOSを動作させるだけでも価値があるのではないか、違うアーキテクチャでの動作は必要ないのではないかと考えて商品開発を行い、それが大ヒットした事例です。
まさしくコロンブスの卵です。
現代のクラウドサービスが安価に提供されているのも、仮想マシンあればこその話です。
今回は、仮想マシンについてのお話をしました。
次回もお楽しみに。
(本稿は 2023年9月に作成しました)