В вычислительной технике виртуальная машина ( ВМ ) — это виртуализация или эмуляция компьютерной системы . Виртуальные машины основаны на компьютерной архитектуре и обеспечивают функциональность физического компьютера. Их реализация может включать специализированное оборудование, программное обеспечение или их комбинацию. Виртуальные машины различаются и организованы по своим функциям, показанным здесь:
Некоторые эмуляторы виртуальных машин, такие как QEMU и эмуляторы игровых консолей , также предназначены для эмуляции (или «виртуальной имитации») различных системных архитектур, что позволяет выполнять программные приложения и операционные системы, написанные для другого процессора или архитектуры. Виртуализация на уровне ОС позволяет разделить ресурсы компьютера через ядро . Эти термины не являются универсально взаимозаменяемыми.
Первоначально Попек и Голдберг определили «виртуальную машину» как «эффективную изолированную копию реальной компьютерной машины». [1] Текущее использование включает виртуальные машины, которые не имеют прямого соответствия какому-либо реальному оборудованию. [2] Физическое «реальное» оборудование, на котором работает виртуальная машина, обычно называется «хостом», а виртуальная машина, эмулируемая на этой машине, обычно называется «гостем». Хост может эмулировать несколько гостей, каждый из которых может эмулировать разные операционные системы и аппаратные платформы.
Желание запускать несколько операционных систем было первоначальным мотивом создания виртуальных машин, чтобы обеспечить разделение времени между несколькими однозадачными операционными системами. В некотором смысле системную виртуальную машину можно считать обобщением концепции виртуальной памяти , исторически предшествовавшей ей. IBM CP/CMS , первые системы, допускающие полную виртуализацию , реализовали разделение времени , предоставив каждому пользователю однопользовательскую операционную систему, Conversational Monitor System (CMS). В отличие от виртуальной памяти, системная виртуальная машина дает пользователю право писать привилегированные инструкции в своем коде. Этот подход имел определенные преимущества, такие как добавление устройств ввода/вывода, не разрешенных стандартной системой. [2]
Поскольку технология развивает виртуальную память для целей виртуализации, новые системы избыточного выделения памяти могут применяться для управления общим использованием памяти между несколькими виртуальными машинами в одной компьютерной операционной системе. Возможно совместное использование страниц памяти с идентичным содержимым несколькими виртуальными машинами, работающими на одной физической машине, что может привести к сопоставлению их с одной и той же физической страницей с помощью метода, называемого слиянием одной страницы ядра (KSM). Это особенно полезно для страниц, доступных только для чтения, например тех, которые содержат сегменты кода, что имеет место для нескольких виртуальных машин, на которых выполняется одно и то же или похожее программное обеспечение, библиотеки программного обеспечения, веб-серверы, компоненты промежуточного программного обеспечения и т. д. Гостевым операционным системам не требуется быть совместимым с аппаратным обеспечением хоста, что позволяет запускать различные операционные системы на одном компьютере (например, Windows , Linux или предыдущие версии операционной системы) для поддержки будущего программного обеспечения. [3]
Использование виртуальных машин для поддержки отдельных гостевых операционных систем популярно в отношении встраиваемых систем . Типичным использованием будет запуск операционной системы реального времени одновременно с предпочтительной сложной операционной системой, такой как Linux или Windows. Другое применение — новое и непроверенное программное обеспечение, которое все еще находится на стадии разработки и работает в « песочнице» . Виртуальные машины имеют и другие преимущества для разработки операционных систем, включая улучшенный доступ для отладки и более быструю перезагрузку. [4]
Для консолидации серверов часто используются несколько виртуальных машин с собственной гостевой операционной системой. [5]
Виртуальная машина процесса, иногда называемая виртуальной машиной приложения или управляемой средой выполнения (MRE), работает как обычное приложение внутри операционной системы хоста и поддерживает один процесс. Он создается при запуске процесса и уничтожается при выходе. Его цель — предоставить независимую от платформы среду программирования, которая абстрагирует детали базового оборудования или операционной системы и позволяет программе выполняться одинаково на любой платформе. [ нужна цитата ]
Виртуальная машина процесса обеспечивает абстракцию высокого уровня — абстракцию языка программирования высокого уровня (по сравнению с абстракцией низкого уровня ISA системной виртуальной машины). Виртуальные машины процессов реализуются с помощью интерпретатора ; производительность, сравнимая с компилируемыми языками программирования, может быть достигнута за счет использования JIT-компиляции . [ нужна цитата ]
Этот тип виртуальных машин стал популярен благодаря языку программирования Java , который реализован с помощью виртуальной машины Java . Другие примеры включают виртуальную машину Parrot и .NET Framework , которая работает на виртуальной машине под названием Common Language Runtime . Все они могут служить слоем абстракции для любого компьютерного языка. [ нужна цитата ]
Особым случаем процессных виртуальных машин являются системы, абстрагирующиеся от механизмов связи (потенциально гетерогенного) компьютерного кластера . Такая виртуальная машина состоит не из одного процесса, а из одного процесса на физическую машину в кластере. Они предназначены для облегчения задачи программирования параллельных приложений, позволяя программисту сосредоточиться на алгоритмах, а не на механизмах связи, предоставляемых межсоединением и ОС. Они не скрывают факт наличия связи и как таковые не пытаются представить кластер как единую машину. [ нужна цитата ]
В отличие от других виртуальных машин процессов, эти системы не предоставляют определенного языка программирования, а встроены в существующий язык; обычно такая система предоставляет привязки для нескольких языков (например, C и Fortran ). [ нужна цитация ] Примерами являются параллельная виртуальная машина (PVM) и интерфейс передачи сообщений (MPI).
И системные виртуальные машины, и виртуальные машины процессов появились в 1960-х годах и остаются областями активного развития.
Системные виртуальные машины выросли из разделения времени , что, в частности, реализовано в совместимой системе разделения времени (CTSS). Разделение времени позволяло нескольким пользователям одновременно использовать компьютер : казалось, что каждая программа имела полный доступ к машине, но одновременно выполнялась только одна программа, при этом система переключалась между программами во временных интервалах, каждый раз сохраняя и восстанавливая состояние. Это превратилось в виртуальные машины, в частности, через исследовательские системы IBM: M44/44X , в которых использовалась частичная виртуализация , а также CP-40 и SIMMON , которые использовали полную виртуализацию и были ранними примерами гипервизоров . Первой широко доступной архитектурой виртуальных машин была CP-67 /CMS ( подробности см. в разделе «История CP/CMS» ). Важным различием было использование нескольких виртуальных машин в одной хост-системе для разделения времени, как в M44/44X и CP-40, и использование одной виртуальной машины в хост-системе для прототипирования, как в SIMMON. Эмуляторы с аппаратной эмуляцией более ранних систем для совместимости восходят к IBM System/360 в 1963 году, [6] [7] , тогда как программная эмуляция (тогда называемая «симуляцией») предшествует этому.
Виртуальные машины процессов первоначально возникли как абстрактные платформы для промежуточного языка , используемого в качестве промежуточного представления программы компилятором ; ранние примеры датируются примерно 1966 годом. Примером начала 1966 года была машина O-code , виртуальная машина, которая выполняет O-код (объектный код), создаваемый внешней частью компилятора BCPL . Эта абстракция позволила легко перенести компилятор на новую архитектуру путем реализации новой серверной части , которая взяла существующий O-код и скомпилировала его в машинный код для базовой физической машины. В языке Эйлера использовалась аналогичная конструкция с промежуточным языком под названием P (переносимый). [8] Это было популяризировано примерно в 1970 году Паскалем , особенно в системе Pascal-P (1973) и компиляторе Pascal-S (1975), в котором он был назван p-кодом , а полученная машина - машиной p-кода . Это оказало большое влияние, и виртуальные машины в этом смысле часто называли машинами с p-кодом. Помимо того, что Pascal был промежуточным языком, p-код также выполнялся непосредственно интерпретатором, реализующим виртуальную машину, особенно в UCSD Pascal (1978); это повлияло на более поздние интерпретаторы, особенно на виртуальную машину Java (JVM). Другим ранним примером был SNOBOL4 (1967), который был написан на языке реализации SNOBOL (SIL), языке ассемблера для виртуальных машин, который затем был ориентирован на физические машины путем транспиляции в их родной ассемблер через макроассемблер . [9] Однако с тех пор макросы вышли из моды, поэтому этот подход стал менее влиятельным. Виртуальные машины процессов были популярным подходом к реализации раннего программного обеспечения для микрокомпьютеров, включая Tiny BASIC и приключенческие игры, от одноразовых реализаций, таких как Pyramid 2000, до движка общего назначения, такого как z-machine от Infocom , который, как утверждает Грэм Нельсон , «возможно, самая портативная виртуальная машина из когда-либо созданных». [10]
Значительные успехи произошли в реализации Smalltalk -80, [11] особенно в реализации Deutsch/Schiffmann [12] , которая продвинула JIT-компиляцию вперед как подход к реализации, использующий виртуальную машину процесса. [13] Позже известными виртуальными машинами Smalltalk были VisualWorks , виртуальная машина Squeak , [14] и Strongtalk . [15] Родственным языком, который породил множество инноваций в виртуальных машинах, был язык программирования Self , [16] который стал пионером в области адаптивной оптимизации [17] и сборки мусора по поколениям . Эти методы оказались коммерчески успешными в 1999 году на виртуальной машине HotSpot Java. [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 году было обнаружено, что поддержка 32- и 64-разрядного оборудования x86 первого поколения редко обеспечивает преимущества в производительности по сравнению с программной виртуализацией. [21]
При виртуализации на уровне ОС физический сервер виртуализируется на уровне операционной системы, что позволяет нескольким изолированным и безопасным виртуализированным серверам работать на одном физическом сервере. Среды «гостевой» операционной системы используют тот же запущенный экземпляр операционной системы, что и хост-система. Таким образом, одно и то же ядро операционной системы также используется для реализации «гостевых» сред, а приложения, работающие в данной «гостевой» среде, рассматривают ее как автономную систему. Пионерской реализацией были тюрьмы FreeBSD ; другие примеры включают Docker , Solaris Containers , OpenVZ , Linux-VServer , LXC , разделы рабочей нагрузки AIX , контейнеры Parallels Virtuozzo и виртуальные учетные записи iCore .
Некоторые люди используют эту возможность для настройки отдельной виртуальной машины под управлением Windows на Mac, предоставляя им доступ ко всему спектру приложений, доступных для обеих платформ.
Удивительно, но мы обнаружили, что аппаратная поддержка первого поколения редко обеспечивает преимущества в производительности по сравнению с существующими программными технологиями.
Мы связываем эту ситуацию с высокими затратами на переход между VMM и гостевой системой и жесткой моделью программирования, которая оставляет мало места для гибкости программного обеспечения в управлении частотой и стоимостью этих переходов.