В вычислительной технике виртуальная машина ( ВМ ) — это виртуализация или эмуляция компьютерной системы . Виртуальные машины основаны на компьютерных архитектурах и обеспечивают функциональность физического компьютера. Их реализация может включать специализированное оборудование, программное обеспечение или их комбинацию. Виртуальные машины различаются и организованы по их функциям, как показано здесь:
Некоторые эмуляторы виртуальных машин, такие как QEMU и эмуляторы игровых консолей , также разработаны для эмуляции (или «виртуальной имитации») различных системных архитектур, что позволяет выполнять программные приложения и операционные системы, написанные для другого процессора или архитектуры. Виртуализация на уровне ОС позволяет разделять ресурсы компьютера через ядро . Эти термины не являются универсально взаимозаменяемыми.
«Виртуальная машина» была первоначально определена Попеком и Голдбергом как «эффективный, изолированный дубликат реальной компьютерной машины». [1] Текущее использование включает виртуальные машины, которые не имеют прямого соответствия какому-либо реальному оборудованию. [2] Физическое, «реальное» оборудование, на котором работает VM, обычно называется «хостом», а виртуальная машина, эмулируемая на этой машине, обычно называется «гостем». Хост может эмулировать несколько гостей, каждый из которых может эмулировать различные операционные системы и аппаратные платформы.
Желание запустить несколько операционных систем было первоначальным мотивом для виртуальных машин, чтобы обеспечить разделение времени между несколькими однозадачными операционными системами. В некоторых отношениях системную виртуальную машину можно считать обобщением концепции виртуальной памяти , которая исторически предшествовала ей. CP/CMS от IBM , первые системы, которые позволили полную виртуализацию , реализовали разделение времени , предоставив каждому пользователю однопользовательскую операционную систему, Conversational Monitor System (CMS). В отличие от виртуальной памяти, системная виртуальная машина давала пользователю право писать привилегированные инструкции в своем коде. Этот подход имел определенные преимущества, такие как добавление устройств ввода/вывода, не разрешенных стандартной системой. [2]
Поскольку технология развивает виртуальную память для целей виртуализации, новые системы перераспределения памяти могут применяться для управления разделением памяти между несколькими виртуальными машинами в одной операционной системе компьютера. Может быть возможным совместное использование страниц памяти с идентичным содержимым между несколькими виртуальными машинами, работающими на одной физической машине, что может привести к их сопоставлению с одной и той же физической страницей с помощью техники, называемой слиянием одной и той же страницы ядра (KSM). Это особенно полезно для страниц только для чтения, таких как те, которые содержат сегменты кода, что имеет место для нескольких виртуальных машин, работающих с одинаковым или похожим программным обеспечением, библиотеками программного обеспечения, веб-серверами, компонентами промежуточного программного обеспечения и т. д. Гостевые операционные системы не должны быть совместимы с аппаратным обеспечением хоста, что позволяет запускать разные операционные системы на одном компьютере (например, Windows , Linux или предыдущие версии операционной системы) для поддержки будущего программного обеспечения. [3]
Использование виртуальных машин для поддержки отдельных гостевых операционных систем популярно в отношении встроенных систем . Типичным применением будет запуск операционной системы реального времени одновременно с предпочтительной сложной операционной системой, такой как Linux или Windows. Другим применением будет новое и непроверенное программное обеспечение, все еще находящееся на стадии разработки, поэтому оно работает внутри песочницы . Виртуальные машины имеют и другие преимущества для разработки операционной системы и могут включать улучшенный доступ к отладке и более быстрые перезагрузки. [4]
Для консолидации серверов часто используются несколько виртуальных машин, работающих под управлением собственной гостевой операционной системы. [5]
Процессная виртуальная машина, иногда называемая прикладной виртуальной машиной или управляемой средой выполнения (MRE), работает как обычное приложение внутри хостовой ОС и поддерживает один процесс. Она создается при запуске этого процесса и уничтожается при его завершении. Ее цель — предоставить платформенно -независимую среду программирования, которая абстрагируется от деталей базового оборудования или операционной системы и позволяет программе выполняться одинаково на любой платформе. [ необходима цитата ]
Процессная виртуальная машина обеспечивает высокоуровневую абстракцию — высокоуровневый язык программирования (по сравнению с низкоуровневой абстракцией ISA системной виртуальной машины). Процессные виртуальные машины реализуются с использованием интерпретатора ; производительность, сравнимая с компилируемыми языками программирования, может быть достигнута с помощью компиляции «на лету» . [ требуется цитата ]
Этот тип виртуальной машины стал популярен с языком программирования Java , который реализован с использованием виртуальной машины Java . Другие примеры включают виртуальную машину Parrot и .NET Framework , которая работает на виртуальной машине, называемой Common Language Runtime . Все они могут служить в качестве уровня абстракции для любого компьютерного языка. [ необходима цитата ]
Особым случаем виртуальных машин процессов являются системы, которые абстрагируются от механизмов связи (потенциально неоднородного) компьютерного кластера . Такая виртуальная машина состоит не из одного процесса, а из одного процесса на физическую машину в кластере. Они разработаны для облегчения задачи программирования параллельных приложений, позволяя программисту сосредоточиться на алгоритмах, а не на механизмах связи, предоставляемых межсоединением и ОС. Они не скрывают тот факт, что связь имеет место, и, как таковые, не пытаются представить кластер как одну машину. [ необходима цитата ]
В отличие от других виртуальных машин процессов, эти системы не предоставляют определенный язык программирования, а встроены в существующий язык; обычно такая система обеспечивает привязки для нескольких языков (например, C и Fortran ). [ необходима цитата ] Примерами являются параллельная виртуальная машина (PVM) и интерфейс передачи сообщений (MPI).
Как системные виртуальные машины, так и виртуальные машины процессов появились в 1960-х годах и продолжают активно развиваться.
Системные виртуальные машины выросли из разделения времени , что было реализовано в Compatible Time-Sharing System (CTSS). Разделение времени позволяло нескольким пользователям использовать компьютер одновременно : каждая программа, казалось, имела полный доступ к машине, но в один момент времени выполнялась только одна программа, при этом система переключалась между программами в отрезках времени, сохраняя и восстанавливая состояние каждый раз. Это превратилось в виртуальные машины, в частности, через исследовательские системы IBM: M44/44X , которые использовали частичную виртуализацию , и CP-40 и SIMMON , которые использовали полную виртуализацию и были ранними примерами гипервизоров . Первой широко доступной архитектурой виртуальных машин была CP-67 / CMS (подробнее см. в History of CP/CMS ). Важное различие было между использованием нескольких виртуальных машин на одной хост-системе для разделения времени, как в M44/44X и CP-40, и использованием одной виртуальной машины на хост-системе для прототипирования, как в SIMMON. Эмуляторы , с аппаратной эмуляцией более ранних систем для совместимости, появились ещё в IBM System/360 в 1963 году [6] [7] , тогда как программная эмуляция (тогда называемая «симуляцией») появилась ещё раньше.
Виртуальные машины процессов изначально возникли как абстрактные платформы для промежуточного языка, используемого в качестве промежуточного представления программы компилятором ; ранние примеры датируются примерно 1964 годом, когда система написания компилятора META II использовала его как для описания синтаксиса, так и для генерации целевого кода. Известным примером 1966 года была машина O-кода , виртуальная машина, которая выполняет O-код (объектный код), выдаваемый передней частью компилятора BCPL . Эта абстракция позволяла легко переносить компилятор на новую архитектуру, реализовав новый бэкэнд , который брал существующий O-код и компилировал его в машинный код для базовой физической машины. Язык Эйлера использовал похожую конструкцию с промежуточным языком, названным P (переносимый). [8] Это было популяризировано около 1970 года Паскалем , в частности, в системе Pascal-P (1973) и компиляторе Pascal-S (1975), в которых это называлось p-кодом , а полученная машина — машиной p-кода . Это оказало влияние, и виртуальные машины в этом смысле часто обычно назывались машинами p-кода. Помимо того, что это был промежуточный язык, p-код Pascal также выполнялся непосредственно интерпретатором, реализующим виртуальную машину, в частности, в UCSD Pascal (1978); это повлияло на более поздние интерпретаторы, в частности, на виртуальную машину Java (JVM). Другим ранним примером был SNOBOL4 (1967), который был написан на языке реализации SNOBOL (SIL), языке ассемблера для виртуальной машины, который затем был нацелен на физические машины путем транспиляции в их собственный ассемблер через макроассемблер . [ 9] Однако с тех пор макросы вышли из моды, поэтому этот подход был менее влиятельным. Виртуальные машины процессов были популярным подходом к реализации раннего программного обеспечения микрокомпьютеров, включая Tiny BASIC и приключенческие игры, от одноразовых реализаций, таких как Pyramid 2000, до универсального движка, такого как z-machine компании Infocom , который, по утверждению Грэма Нельсона , является «возможно, самой портативной виртуальной машиной из когда-либо созданных». [10]
Значительные успехи были достигнуты при реализации Smalltalk -80, [11] в частности, реализация Deutsch/Schiffmann [12] , которая продвинула компиляцию just-in-time (JIT) вперед как подход к реализации, который использует виртуальную машину процесса. [13] Позднее известными виртуальными машинами Smalltalk стали VisualWorks , Squeak Virtual Machine [ 14] и Strongtalk . [15] Связанным языком, который произвел много инноваций в области виртуальных машин, был язык программирования Self , [16] который стал пионером адаптивной оптимизации [17] и сборки мусора поколений . Эти методы оказались коммерчески успешными в 1999 году в виртуальной машине Java HotSpot . [18] Другие инновации включают в себя виртуальную машину на основе регистров, чтобы лучше соответствовать базовому оборудованию, а не виртуальную машину на основе стека, которая является более близким соответствием языку программирования; в 1995 году это было впервые реализовано виртуальной машиной Dis для языка Limbo .
При полной виртуализации виртуальная машина имитирует достаточно оборудования, чтобы позволить немодифицированной «гостевой» ОС (разработанной для того же набора инструкций ) работать в изоляции. Этот подход был впервые применен в 1966 году с IBM CP-40 и CP-67 , предшественниками семейства VM .
Примерами за пределами области мэйнфреймов являются Parallels Workstation , Parallels Desktop для Mac , VirtualBox , Virtual Iron , Oracle VM , Virtual PC , Virtual Server , Hyper-V , VMware Fusion , VMware Workstation , VMware Server (прекращено, ранее называлось GSX Server), VMware ESXi , QEMU , Adeos , Mac-on-Linux, Win4BSD, Win4Lin Pro и технология Egenera vBlade.
При аппаратной виртуализации оборудование обеспечивает архитектурную поддержку, которая облегчает создание монитора виртуальной машины и позволяет гостевым ОС работать изолированно. [19] Аппаратная виртуализация была впервые представлена на IBM System/370 в 1972 году для использования с VM/370 , первой операционной системой виртуальной машины, предлагаемой IBM в качестве официального продукта. [20]
В 2005 и 2006 годах Intel и AMD предоставили дополнительное оборудование для поддержки виртуализации. Sun Microsystems (теперь Oracle Corporation ) добавила аналогичные функции в свои процессоры UltraSPARC T-Series в 2005 году. Примерами платформ виртуализации, адаптированных к такому оборудованию, являются KVM , VMware Workstation , VMware Fusion , Hyper-V , Windows Virtual PC , Xen , Parallels Desktop для Mac , Oracle VM Server для SPARC , VirtualBox и Parallels Workstation .
В 2006 году было обнаружено, что поддержка оборудования x86 первого поколения 32- и 64-разрядных систем редко обеспечивает преимущества в производительности по сравнению с программной виртуализацией. [21]
При виртуализации на уровне ОС физический сервер виртуализируется на уровне операционной системы, что позволяет нескольким изолированным и защищенным виртуализированным серверам работать на одном физическом сервере. «Гостевые» среды операционной системы совместно используют тот же запущенный экземпляр операционной системы, что и хостовая система. Таким образом, то же ядро операционной системы также используется для реализации «гостевых» сред, и приложения, работающие в данной «гостевой» среде, рассматривают ее как автономную систему. Первой реализацией были FreeBSD jails ; другие примеры включают Docker , Solaris Containers , OpenVZ , Linux-VServer , LXC , AIX Workload Partitions , Parallels Virtuozzo Containers и iCore Virtual Accounts .
Снимок — это состояние виртуальной машины и, как правило, ее устройств хранения в определенный момент времени. Снимок позволяет восстановить состояние виртуальной машины на момент снимка позже, фактически отменяя любые изменения, произошедшие впоследствии. Эта возможность полезна в качестве метода резервного копирования , например, перед выполнением рискованной операции. [ необходима цитата ]
Виртуальные машины часто используют виртуальные диски для своего хранения; в очень простом примере жесткий диск объемом 10 гигабайт имитируется с помощью плоского файла объемом 10 гигабайт . Любые запросы виртуальной машины на местоположение на ее физическом диске прозрачно транслируются в операцию над соответствующим файлом. Однако, как только такой слой трансляции присутствует, можно перехватывать операции и отправлять их в разные файлы в зависимости от различных критериев. Каждый раз, когда делается снимок, создается новый файл, который используется в качестве наложения для своих предшественников. Новые данные записываются в самый верхний оверлей; однако для чтения существующих данных необходимо сканирование иерархии наложения, что приводит к доступу к самой последней версии. Таким образом, весь стек снимков фактически представляет собой один связный диск; в этом смысле создание снимков работает аналогично методу инкрементального резервного копирования . [ необходима цитата ]
В снимок могут быть включены и другие компоненты виртуальной машины, например, содержимое ее оперативной памяти (ОЗУ), настройки BIOS или параметры конфигурации. Примером таких снимков является функция « Сохранить состояние » в эмуляторах игровых консолей . [ необходима цитата ]
Восстановление снимка состоит из удаления или игнорирования всех слоев наложения, которые были добавлены после этого снимка, и направления всех новых изменений в новый оверлей. [ необходима цитата ]
Описанные выше снимки можно переместить на другой хост-компьютер с его собственным гипервизором; когда виртуальная машина временно останавливается, делается снимок, перемещается и затем возобновляется на новом хосте, это называется миграцией. Если старые снимки регулярно синхронизируются, эта операция может быть довольно быстрой и позволить виртуальной машине предоставлять бесперебойную услугу, пока ее предыдущий физический хост, например, отключается для физического обслуживания. [ необходима цитата ]
Подобно механизму миграции, описанному выше, отказоустойчивость позволяет виртуальной машине продолжать работу в случае отказа хоста. Обычно это происходит, если миграция перестала работать. Однако в этом случае виртуальная машина продолжает работу из последнего известного когерентного состояния, а не из текущего состояния, на основе любых материалов, которые были предоставлены резервному серверу в последний раз. [ необходима цитата ]
Вложенная виртуализация относится к возможности запуска виртуальной машины внутри другой, имея эту общую концепцию, расширяемую на произвольную глубину. Другими словами, вложенная виртуализация относится к запуску одного или нескольких гипервизоров внутри другого гипервизора. Природа вложенной гостевой виртуальной машины не обязательно должна быть однородной с ее хостовой виртуальной машиной; например, виртуализация приложений может быть развернута внутри виртуальной машины, созданной с помощью аппаратной виртуализации . [22]
Вложенная виртуализация становится все более необходимой, поскольку широко распространенные операционные системы получают встроенную функциональность гипервизора, которая в виртуализированной среде может использоваться только в том случае, если окружающий гипервизор поддерживает вложенную виртуализацию; например, Windows 7 способна запускать приложения Windows XP внутри встроенной виртуальной машины. Кроме того, перемещение уже существующих виртуализированных сред в облако, следуя подходу Infrastructure as a Service (IaaS), намного сложнее, если целевая платформа IaaS не поддерживает вложенную виртуализацию. [23] [24]
Способ, которым вложенная виртуализация может быть реализована на конкретной компьютерной архитектуре, зависит от поддерживаемых возможностей аппаратной виртуализации . Если конкретная архитектура не обеспечивает аппаратную поддержку, необходимую для вложенной виртуализации, для ее включения используются различные программные методы. [23] Со временем все больше архитектур получают необходимую аппаратную поддержку; например, с момента появления микроархитектуры Haswell (анонсированной в 2013 году) Intel начала включать теневое копирование VMCS в качестве технологии, ускоряющей вложенную виртуализацию. [25]
Некоторые люди используют эту возможность для настройки отдельной виртуальной машины под управлением Windows на Mac, что дает им доступ ко всему спектру приложений, доступных для обеих платформ.
Удивительно, но мы обнаружили, что аппаратная поддержка первого поколения редко обеспечивает преимущества в производительности по сравнению с существующими программными методами. Мы приписываем эту ситуацию высоким затратам на переход VMM/гостевой ОС и жесткой модели программирования, которая оставляет мало места для гибкости программного обеспечения в управлении частотой или стоимостью этих переходов.