仮想マシン

ウィキペディアから、無料の百科事典
ナビゲーションにジャンプ 検索にジャンプ

コンピューティングでは、仮想マシンVM)はコンピューターシステムの仮想化/エミュレーションです仮想マシンはコンピューターアーキテクチャに基づいており、物理コンピューターの機能を提供します。それらの実装には、特殊なハードウェア、ソフトウェア、またはそれらの組み合わせが含まれる場合があります。

仮想マシンは異なり、機能ごとに編成されています。次に示します。

QEMUビデオゲームコンソールエミュレータなどの一部の仮想マシンエミュレータは、さまざまなシステムアーキテクチャをエミュレート(または「仮想的に模倣」)するように設計されているため、別のCPUまたはアーキテクチャ用に作成されたソフトウェアアプリケーションやオペレーティングシステムを実行できます。オペレーティングシステムレベルの仮想化により、コンピューターのリソースをカーネルを介して分割できます。用語は普遍的に交換可能ではありません。

定義

システム仮想マシン

「仮想マシン」は、もともとPopekとGoldbergによって、「実際のコンピューターマシンの効率的で分離された複製」として定義されていました。[1]現在の使用には、実際のハードウェアに直接対応していない仮想マシンが含まれます。[2] VMを実行する物理的な「実世界」のハードウェアは一般に「ホスト」と呼ばれ、そのマシンでエミュレートされる仮想マシンは一般に「ゲスト」と呼ばれます。ホストは複数のゲストをエミュレートでき、各ゲストは異なるオペレーティングシステムとハードウェアプラットフォームをエミュレートできます。

複数のオペレーティングシステムを実行したいという願望は、複数のシングルタスクオペレーティングシステム間でタイムシェアリングを可能にするために、仮想マシンの最初の動機でした。いくつかの点で、システム仮想マシンは、歴史的に先行していた仮想メモリの概念の一般化と見なすことができます。完全仮想化を可能にした最初のシステムであるIBMのCP / CMSは、各ユーザーにシングルユーザーオペレーティングシステムであるConversational Monitor Systemを提供することにより、タイムシェアリングを実装しました。(CMS)。仮想メモリとは異なり、システム仮想マシンは、ユーザーが自分のコードに特権命令を書き込むことを許可されています。このアプローチには、標準システムでは許可されていない入力/出力デバイスを追加するなど、特定の利点がありました。[2]

テクノロジーが仮想化の目的で仮想メモリを進化させるにつれて、メモリオーバーコミットメントの新しいシステムを適用して、1台のコンピュータオペレーティングシステム上の複数の仮想マシン間のメモリ共有を管理することができます。同じ物理マシン上で実行される複数の仮想マシン間で同じ内容のメモリページを共有できる場合があります。その結果、カーネルの同じページのマージと呼ばれる手法によって、同じ物理ページにそれらがマッピングされる可能性があります。(KSM)。これは、同じまたは類似のソフトウェア、ソフトウェアライブラリ、Webサーバー、ミドルウェアコンポーネントなどを実行する複数の仮想マシンの場合のように、コードセグメントを保持するページなど、読み取り専用ページで特に役立ちます。ゲストオペレーティングシステムは必要ありません。ホストハードウェアに準拠するため、同じコンピューター上で異なるオペレーティングシステム(WindowsLinux、または以前のバージョンのオペレーティングシステムなど)を実行して、将来のソフトウェアをサポートできるようにします。[3]

組み込みシステムに関しては、個別のゲストオペレーティングシステムをサポートするための仮想マシンの使用が一般的です一般的な使用法は、LinuxやWindowsなどの推奨される複雑なオペレーティングシステムと同時にリアルタイムオペレーティングシステムを実行することです。もう1つの用途は、まだ開発段階にある新規で実証されていないソフトウェアであるため、サンドボックス内で実行されます。仮想マシンには、オペレーティングシステムの開発に他の利点があり、デバッグアクセスの改善や再起動の高速化が含まれる場合があります。[4]

独自のゲストオペレーティングシステムを実行している複数のVMは、サーバーの統合に頻繁に関与しています。[5]

仮想マシンの処理

プロセスVMは、アプリケーション仮想マシンまたはマネージドランタイム環境(MRE)と呼ばれることもあり、ホストOS内で通常のアプリケーションとして実行され、単一のプロセスをサポートします。プロセスが開始されると作成され、終了すると破棄されます。その目的は、基盤となるハードウェアまたはオペレーティングシステムの詳細を抽象化し、プログラムをどのプラットフォームでも同じように実行できるよう にする、プラットフォームに依存しないプログラミング環境を提供することです。

プロセスVMは、高レベルの抽象化を提供します。これは、高レベルのプログラミング言語の抽象化です(システムVMの低レベルのISA抽象化​​と比較して)。プロセスVMは、インタープリターを使用して実装されます。コンパイルされたプログラミング言語に匹敵するパフォーマンスは、ジャストインタイムコンパイルを使用することで実現できます。[要出典]

このタイプのVMは、 Java仮想マシンを使用して実装されるJavaプログラミング言語で普及していますその他の例としては、Parrot仮想マシンCommon LanguageRuntimeと呼ばれるVMで実行される.NETFrameworkなどがありますそれらはすべて、任意のコンピューター言語 の抽象化レイヤーとして機能します。

プロセスVMの特殊なケースは、(異種の可能性がある)コンピュータークラスターの通信メカニズムを抽象化するシステムです。このようなVMは、単一のプロセスではなく、クラスター内の物理マシンごとに1つのプロセスで構成されます。これらは、相互接続とOSによって提供される通信メカニズムではなく、プログラマーがアルゴリズムに集中できるようにすることで、並行アプリケーションのプログラミング作業を容易にするように設計されています。それらは、通信が行われるという事実を隠さないため、クラスターを単一のマシンとして提示しようとはしません。[要出典]

他のプロセスVMとは異なり、これらのシステムは特定のプログラミング言語を提供しませんが、既存の言語に組み込まれています。通常、このようなシステムは、いくつかの言語( CFortranなど)のバインディングを提供します[要出典]例としては、Parallel Virtual Machine(PVM)やMessage Passing Interface(MPI)があります。最上位で実行されているアプリケーションは引き続きすべてのOSサービスにアクセスでき、システムモデルに限定されないため、これらは厳密には仮想マシンではありません。

歴史

システム仮想マシンとプロセス仮想マシンはどちらも1960年代にさかのぼり、引き続き活発な開発が行われています。

システム仮想マシンは、特にCompatible Time-Sharing System(CTSS)に実装されているように、タイムシェアリングから発展しました。タイムシェアリングにより、複数のユーザーが同時にコンピューターを使用できるようになりました。各プログラムはマシンに完全にアクセスできるように見えましたが、一度に実行されたプログラムは1つだけで、システムはタイムスライスでプログラムを切り替え、毎回状態を保存および復元しました。これは、特にIBMの研究システム(部分仮想化を使用したM44 / 44X 、完全仮想化を使用したCP-40およびSIMMON )を介して仮想マシンに進化し、ハイパーバイザーの初期の例でした。最初に広く利用可能な仮想マシンアーキテクチャは、CP-67 / CMSでした(詳細については、CP / CMSの履歴を参照してください)。重要な違いは、M44 / 44XやCP-40のように、1つのホストシステムで複数の仮想マシンをタイムシェアリングに使用することと、SIMMONのようにプロトタイピングにホストシステムで1つの仮想マシンを使用することです。互換性のために以前のシステムのハードウェアエミュレーションを備えたエミュレーターは、1963年にIBM System / 360にさかのぼります[6] [7]が、ソフトウェアエミュレーション(当時は「シミュレーション」と呼ばれていました)はそれよりも前のものです。

プロセス仮想マシンは元々 、コンパイラによるプログラムの中間表現として使用される中間言語の抽象プラットフォームとして生まれました。初期の例は1966年頃にさかのぼります。1966年の初期の例はBCPLコンパイラのフロントエンドによって発行されたOコード(オブジェクトコード)を実行する仮想マシンであるOコードマシンでした。この抽象化により、既存のOコードを取得し、基盤となる物理マシンのマシンコードにコンパイルする新しいバックエンドを実装することで、コンパイラを新しいアーキテクチャに簡単に移植できました。オイラー_言語は同様の設計を使用し、中間言語はP(ポータブル)という名前でした。[8]これは1970年頃にPascalによって普及し、特にPascal-Pシステム(1973)とPascal-Sコンパイラ(1975)で普及し、 pコードと呼ばれ、結果として得られたマシンはpコードマシンと呼ばれていました。これは影響力があり、この意味での仮想マシンは一般にpコードマシンと呼ばれることがよくあります。中間言語であることに加えて、Pascal p-codeは、特にUCSD Pascal(1978)で、仮想マシンを実装するインタープリターによって直接実行されました。これは後の通訳者、特にJava仮想マシン(JVM)。もう1つの初期の例は、 SNOBOL4 (1967)でした。これは、仮想マシンのアセンブリ言語であるSNOBOL実装言語(SIL)で記述され、マクロアセンブラーを介してネイティブアセンブラーにトランスパイルすることで物理マシンを対象としました[9]しかし、マクロはその後支持されなくなったため、このアプローチはそれほど影響力がありませんでした。プロセス仮想マシンは、 Pyramid 2000などの1回限りの実装から、 Infocomz-machineなどの汎用エンジンまで、TinyBASICやアドベンチャーゲームなどの初期のマイクロコンピューターソフトウェアを実装するための一般的なアプローチでした。Graham Nelsonは、「おそらくこれまでに作成された中で最もポータブルな仮想マシン」であると主張しています。[10]

Smalltalk -80の実装[11] 、特にプロセス仮想マシンを使用する実装アプローチとしてジャストインタイム(JIT)コンパイル を推進し たDeutsch / Schiffmann実装[12]には、大きな進歩がありました。[13] 後に注目すべきSmalltalkVMは、 VisualWorksSqueak Virtual Machine[14]Strongtalkでした。[15] 多くの仮想マシンの革新を生み出した関連言語は、自己プログラミング言語であり[16] 、適応最適化の先駆者でした[17]。および世代別ガベージコレクションこれらの手法は、1999年にHotSpotJava仮想マシンで商業的に成功したことが証明されました。[18] 他の革新には、プログラミング言語により近いスタックベースの仮想マシンではなく、基盤となるハードウェアによりよく一致するレジスタベースの仮想マシンが含まれます。1995年に、これはLimbo言語用のDis仮想マシンによって開拓されました。OpenJ9は、OpenJDKのHotSpot JVMの代替であり、HotSpotと比較してより優れた起動とより少ないリソース消費を主張するオープンソースのEclipseプロジェクトです。

完全仮想化

完全仮想化の論理図

完全仮想化では、仮想マシンは、変更されていない「ゲスト」OS(同じ命令セット用に設計されたもの)を分離して実行できるようにするのに十分なハードウェアをシミュレートします。このアプローチは、 VMファミリー の前身であるIBMCP -40およびCP-67で1966年に開拓されました。

メインフレームフィールド以外の例には、Parallels WorkstationParallels Desktop for MacVirtualBoxVirtual IronOracle VMVirtual PCVirtual ServerHyper-VVMware WorkstationVMware Server(廃止、以前はGSX Serverと呼ばれていました)、VMware ESXiQEMUが含まれます。 、Adeos、Mac-on-Linux、Win4BSD、Win4Lin Pro、およびEgeneravBladeテクノロジー。

ハードウェア支援仮想化

ハードウェア支援仮想化では、ハードウェアは、仮想マシンモニターの構築を容易にし、ゲストOSを分離して実行できるようにするアーキテクチャサポートを提供します。[19]ハードウェア支援仮想化は、 IBMが公式製品として提供した最初の仮想マシンオペレーティングシステムであるVM / 370 で使用するために、1972年にIBM System / 370に最初に導入されました。[20]

2005年と2006年に、IntelAMDは仮想化をサポートするための追加のハードウェアを提供しました。Sun Microsystems(現在のOracle Corporation )は、2005年にUltraSPARC Tシリーズプロセッサに同様の機能を追加しました。このようなハードウェアに適合した仮想化プラットフォームの例には、KVMVMware WorkstationVMware FusionHyper-VWindows Virtual PCXenParallels Desktop for MacOracle VM Server for SPARCVirtualBoxParallelsWorkstation

2006年、第1世代の32ビットおよび64ビットのx86ハードウェアサポートが、ソフトウェア仮想化よりもパフォーマンス上の利点を提供することはめったにありませんでした。[21]

オペレーティングシステムレベルの仮想化

オペレーティングシステムレベルの仮想化では、物理サーバーはオペレーティングシステムレベルで仮想化され、複数の分離された安全な仮想化サーバーを単一の物理サーバーで実行できるようにします。「ゲスト」オペレーティングシステム環境は、ホストシステムと同じオペレーティングシステムの実行中のインスタンスを共有します。したがって、同じオペレーティングシステムカーネルを使用して「ゲスト」環境を実装し、特定の「ゲスト」環境で実行されているアプリケーションは、それをスタンドアロンシステムと見なします。先駆的な実装はFreeBSDjailsでした; 他の例には、DockerSolaris ContainersOpenVZLinux-VServerLXC、AIX WorkloadPartitionsが含まれます、Parallels Virtuozzo Containers、およびiCore仮想アカウント

も参照してください

参考文献

  1. ^ ポペック、ジェラルドJ。; ゴールドバーグ、ロバートP.(1974)。「仮想化可能な第3世代アーキテクチャの正式な要件」 (PDF)ACMの通信17(7):412–421。土井10.1145 /361011.361073S2CID12680060 _
  2. ^ a b Smith、James E。; ナイア、ラヴィ(2005)。「仮想マシンのアーキテクチャ」コンピューター38(5):32–38、395–396。土井10.1109 /MC.2005.173S2CID6578280_ 
  3. ^ オリファント、パトリック。「仮想マシン」VirtualComputing。2016年7月29日にオリジナルからアーカイブされました2015年9月23日取得一部の人々は、その機能を使用して、Mac上でWindowsを実行する別の仮想マシンをセットアップし、両方のプラットフォームで利用可能なすべてのアプリケーションにアクセスできるようにします。
  4. ^ 「超高速サーバーの再起動–仮想化が揺らいでいるもう1つの理由」vmwarez.com2006-05-09。2006年6月14日にオリジナルからアーカイブされました2013年6月14日取得
  5. ^ 「仮想インフラストラクチャによるサーバーの統合と封じ込め」(PDF)VMware2007. 2013-12-28のオリジナルからアーカイブ(PDF)2015年9月29日取得
  6. ^ ピュー、エマーソンW.(1995)。IBMの構築:業界とそのテクノロジーの形成MIT。p。 274ISBN 978-0-262-16147-3
  7. ^ ピュー、エマーソンW .; etal。(1991)。IBMの360およびEarly370システムMIT。pp。160–161。  _ ISBN 978-0-262-16123-7
  8. ^ ワース、ニクラウス・エミル; ウェーバー、ヘルムート(1966)。EULER:ALGOLの一般化とその正式な定義:パートII、Association for ComputingMachineryのコミュニケーション9.ニューヨーク:ACMpp。89–99。
  9. ^ Griswold、Ralph E.SNOBOL4のマクロ実装カリフォルニア州サンフランシスコ:WH Freeman and Company、1972( ISBN 0-7167-0447-1)、第1章。 
  10. ^ ネルソン、グラハムA. 「通訳者について」ウェブサイトに通知します2009年12月3日にオリジナルからアーカイブされました2009年11月7日取得
  11. ^ ゴールドバーグ、アデル; ロブソン、デビッド(1983)。Smalltalk-80:言語とその実装コンピュータサイエンスのAddison-Wesleyシリーズ。アディソン-ウェスリーISBN 978-0-201-11371-6
  12. ^ ドイツ語、L。ピーター; シフマン、アランM.(1984)。「Smalltalk-80システムの効率的な実装」POPLユタ州ソルトレイクシティ:ACM。土井10.1145 /800017.800542ISBN 0-89791-125-3
  13. ^ Aycock、John(2003)。「ジャストインタイムの簡単な歴史」。ACM計算。生存 35(2):97–113。土井10.1145 /857076.857077S2CID15345671_  
  14. ^ Ingalls Jr.、Daniel "Dan" Henry Holmes ; ケーラー、テッド; マロニー、ジョン; ウォレス、スコット; ケイ、アラン・カーティス(1997)。「バック・トゥ・ザ・フューチャー:それ自体で書かれた実用的なSmalltalkであるSqueakの物語」。OOPSLA '97:オブジェクト指向プログラミング、システム、言語、およびアプリケーションに関する第12回ACMSIGPLAN会議の議事録米国ニューヨーク州ニューヨーク:ACM Press pp。318–326。土井10.1145 /263698.263754ISBN 0-89791-908-4
  15. ^ ブラチャ、ギラッド; Griswold、David(1993)。「Strongtalk:本番環境でのSmalltalkのタイプチェック」。オブジェクト指向プログラミングシステム、言語、およびアプリケーションに関する第8回年次会議の議事録OOPSLA'93。米国ニューヨーク州ニューヨーク:ACM。pp。215–230。土井10.1145 /165854.165893ISBN 978-0-89791-587-8
  16. ^ Ungar、David Michael ; スミス、ランドールB.(1987年12月)。「自己:シンプルさの力」。ACMSIGPLANの通知22(12):227–242。土井10.1145 /38807.38828ISSN0362-1340_ 
  17. ^ Hölzle、Urs ; Ungar、David Michael(1994)。「実行時型フィードバックを使用した動的にディスパッチされた呼び出しの最適化」PLDIアメリカ合衆国フロリダ州オーランド:ACM。pp。326–336。土井10.1145 /178243.178478ISBN 0-89791-662-X
  18. ^ Paleczny、Michael; ヴィック、クリストファー; クリック、クリフ(2001)。「JavaHotSpotサーバーコンパイラ」Java仮想マシン研究技術シンポジウムの議事録1.カリフォルニア州モントレー:USENIXAssociation。
  19. ^ Uhlig、リッチ; ナイガー、ギル; ロジャース、ディオン; サントーニ、エイミーL。; マーティンズ、フェルナンドCM; アンダーソン、アンドリューV。; ベネット、スティーブンM。; Kägi、Alain; Leung、Felix H。; スミス、ラリー(2005年5月)。「インテルバーチャライゼーションテクノロジー」。コンピューター38(5):48–56。土井10.1109 /MC.2005.163S2CID18514555_ 
  20. ^ Randal、A。(2019)。理想と現実:仮想マシンとコンテナの歴史を再考する。
  21. ^ アダムス、キース; Agesen、Ole(2006-10-21)。x86仮想化のソフトウェアとハ​​ードウェアの手法の比較(PDF)ASPLOS'06 2006年10月21〜25日。米国カリフォルニア州サンノゼ。2010年8月20日のオリジナルからアーカイブ(PDF) 。驚いたことに、第1世代のハードウェアサポートが既存のソフトウェア技術に比べてパフォーマンス上の利点を提供することはめったにありません。この状況は、VMM /ゲストの移行コストが高く、これらの移行の頻度またはコストを管理する際にソフトウェアの柔軟性の余地がほとんどない厳格なプログラミングモデルに起因します。

さらに読む

  • James E. Smith、Ravi Nair、仮想マシン:システムとプロセスのための多用途プラットフォーム、Morgan Kaufmann、2005年5月、ISBN 1-55860-910-5、656ページ(プロセスとシステム仮想マシンの両方をカバー) 
  • Craig、IainD。仮想マシンSpringer、2006、ISBN 1-85233-969-1、269ページ(プロセス仮想マシンのみを対象) 

外部リンク