Какие существуют виртуальные машины
Виртуальные машины, какую выбрать и где скачать
В последнее время из уст людей, связанных с компьютерными технологиями, все чаще и чаще можно услышать термины «виртуализация» и «виртуальная машина». Причем довольно часто за обоими этими понятиями скрываются совершенно разные вещи. Так что же такое виртуализация, о которой так часто говорят, и почему она так актуальна в последнее время?
Общие сведения о виртуализации
В широком смысле, виртуализация представляет собой процесс отделения реализации какого-либо объекта или процесса от его представления для пользователя. Такое определение видится весьма пространным, однако понять его совсем просто: виртуализация имеет место быть тогда, когда мы видим что-то и работаем с тем, что на самом деле имеет другую от нашего виденья природу и строение. Для чего это нужно? Только для того, чтобы нам было удобно работать с созданным для нас окружением, которое на самом деле устроено совсем иначе, чем мы его себе представляем.
Виртуализация бывает разная: операционных систем, приложений, систем хранения данных, отдельных аппаратных и программных компонентов вычислительных систем. На самом деле, мы все так или иначе пользуемся продуктами виртуализации – многие наверное слышали про виртуальную машину Java в браузерах, логические диски в операционной системе Windows тоже частный случай виртуализации (ведь на самом деле, одно физическое устройство, жесткий диск, представляется пользователю как несколько логических томов).
Но все это было и раньше, почему же в последнее время так много заговорили о виртуализации? А случилось это потому, что за последние несколько лет был совершен большой технологический прорыв в области виртуализации операционных систем, открывший огромные возможности и перспективы. Под виртуализацией операционных систем понимают процесс создания на физическом компьютере так называемой виртуальной машины (что-то вроде виртуального компьютера), в которой устанавливается своя собственная операционная система. Таких виртуальных машин на одной физической платформе может быть несколько, при этом каждая виртуальная машина имеет свои собственные виртуальные аппаратные компоненты: память, процессор, жесткий диск, сетевые адаптеры. Эти ресурсы резервируются виртуальной машиной за счет физических ресурсов аппаратного обеспечения компьютера. Такая модель организации вычислительных систем впервые появилась еще в 70-х годах прошлого века в мэйнфреймах корпорации IBM System 360/370, когда требовалось сохранить предыдущие версии экземпляров операционных систем. Но лишь в 21-м веке эта технология обрела новый смысл на серверных системах и настольных ПК.
Виртуализация операционных систем тоже бывает разная, однако нас интересует такое её представление для пользователя: в операционной системе физического компьютера (её принято называть хостовой ОС): как обычная программа, устанавливается платформа виртуализации, с помощью которой создаются виртуальные машины, в которых, в свою очередь, устанавливаются различные операционные системы (их принято называть гостевыми ОС). На рисунках 1 и 2 показаны отличия классической архитектуры компьютера от архитектуры, содержащей виртуальные машины.
Рисунок 1 – Классическая архитектура компьютера
Рисунок 2 – Один из видов виртуализации операционных систем
Гостевые системы и хостовая ОС работают одновременно, обмениваются данными и участвуют в сетевом взаимодействии не только с хостовой ОС, но и с внешней по отношению к физическому компьютеру сетью.
Какие же преимущества несет собой возможность одновременного запуска нескольких операционных систем на одном компьютере? Вот лишь некоторые варианты использования виртуальных машин на настольных компьютерах пользователей:
Это, конечно же, далеко не все возможности применения виртуальных машин на пользовательских компьютерах. Каждый сам может себе придумать, для каких целей ему нужна виртуальная машина, и почувствовать, насколько это удобно, надежно и просто. Перед возможностью установки нескольких хостовых операционных систем на один компьютер с их раздельной загрузкой, виртуальные машины имеют следующие неоспоримые преимущества:
Тем не менее, несмотря на все преимущества, виртуальные машины также имеют и свои недостатки:
Все перечисленные недостатки виртуальных машин являются в принципе разрешимыми и, по сравнению с большим списком их достоинств, являются не столь существенными. Именно поэтому, технологии виртуализации и виртуальных машин развиваются взрывными темпами, а пользователи находят им все новые и новые применения.
Итак, вы решили установить виртуальную машину. Платформу виртуализации какого производителя вам выбрать? В данный момент на рынке платформ виртуализации присутствуют несколько лидирующих компаний: VMware (независимое подразделение корпорации EMC), Microsoft, Oracle, XenSource, Parallels, SWsoft, Virtual Iron и другие. У платформы каждого из производителей есть свои неоспоримые достоинства и недостатки, однако, что касается пользовательских (настольных) систем виртуализации для хостовых систем Windows, безоговорочных лидеров тут можно пересчитать по пальцам одной руки: компании VMware, Oracle и Microsoft.
Для настольных систем компании предлагают пользователям несколько бесплатных продуктов: VirtualBox (от Oracle), Hyper-V (от Microsoft, бывший Microsoft Virtual PC) и VMware Workstation Player (от VMWare). Кроме них, существует так же виртуальная машина QEMU, разрабатываемая сообществом
Лучшие виртуальные машины для Windows (бесплатные)
Microsoft Hyper-V
Эмуляторы операционных систем, что это и для чего они нужны
Немногие из рядовых пользователей компьютера знают, что есть целый вид программ, позволяющих имитировать операционные системы. Причём как мобильные (для смартфонов и планшетов), так и традиционные (для компьютеров и ноутбуков). В этой статье мы кратко рассмотрим, для чего нужны такие программы и что они умеют.
реклама
Эмуляторы мобильных ОС используются геймерами и разработчиками игр. Первые получают возможность использовать в мобильных играх мышь и клавиатуру, а также контроллеры Xbox и PlayStation, и играть на большом экране монитора. А вторые могут в комфортных условиях тестировать игры на рабочем компьютере, не используя смартфон или планшет.
Эмуляторы мобильных ОС (Андроид)
Наиболее популярная мобильная операционная система это Android, для неё существует больше десятка различных эмуляторов, например, Bluestacks, Nox App Player, Tencent Gaming Buddy, MEmu, LDPlayer, AndY, KoPlayer, Droid4X, YouWave. Половина из них поддерживает русский язык, но перед установкой рекомендую почитать описание и отзывы о программе, которую собираетесь использовать. Сам я пользовался Bluestacks и Nox App Player. По совместимости с играми и приложениями первая оказалась универсальней и оставил только её. На втором месте iOS (для гаджетов от компании Apple). Некоторые эмуляторы позволяют запускать несколько версий Андроида, это нужно, чтобы протестировать игры на смартфонах, которые уже не получают обновлений.
У некоторых симуляторов Андроида есть собственный магазин приложений, адаптированных под работу на ПК, например: Bluestack и LDPlayer. Другие заточены под конкретную игру, например Tencent Gaming Buddy изначально создавался именно под PUBG, совместим со всеми его дополнениями и имеет функционал, позволяющий запускать игру на старых ПК и ноутбуках, а на новых увеличивает частоту кадров и качество графики.
реклама
Другие эмуляторы писались больше для разработчиков приложений, и соответствуют реальному устройству Андроид, например AndY.
Существуют и устаревшие программы, такие как Droid4X, YouWave, обновления которых уже прекратились, но они до сих пор актуальны для старых приложений.
реклама
Также есть нестандартные решения, к примеру PrimeOS, которая устанавливается на отдельный раздел жёсткого диска, процесс её установки довольно сложный, используется в основном разработчиками мобильных приложений. Визуально отличается от остальных эмуляторов наличием меню Пуск и окон, как у Виндовс.
Другое нестандартное решение Bliss OS, это операционная система с открытым исходным кодом на базе Android, устанавливается как отдельная ОС и позволяет устанавливать себя на смартфоны и планшеты вместо Андроид. Её преимущество: отсутствие рекламных всплывающих окон и предустановленных приложений.
Настройки некоторых эмуляторов позволяют задавать число ядер центрального процессора, которые будет использовать программа, количество кадров в секунду (FPS), определить объём оперативной памяти, доступной эмулятору. А на случай проблем с совместимостью в играх, предусмотрено переключение режимов рендеринга графики с DirectX на OpenGL.
реклама
Практическое применение для дома
Я пользовался программой Bluestack для создания второго аккаунта в известной онлайн-игре, чтобы не вкладывать в неё деньги, и при этом быстро развиваться. Пробовал устанавливать WhatsApp на ПК во время ремонта смартфона. Сейчас я пользуюсь уже версией для браузера. Чтобы сын не портил зрение на маленьком экране и не сажал батарею телефона, ему на компьютер были установлены с помощью Bluestack программы со смартфона.
Эмуляторы ПК (виртуальные машины) для компьютеров
Аналогичные программы есть и для традиционных операционных систем. Они используются как разработчиками ПО, так и системными администраторами для тестирования различных программ.
Виртуальных машин довольно много, но наибольшую известность получили всего несколько: Oracle VirtualBox, VMware Workstation, Hyper-V (ранее известная как Microsoft Virtual PC).
Для домашнего использования чаще всего применяется Oracle VirtualBox, поскольку она полностью бесплатная, имеет хороший перевод и довольно простой интерфейс и поддерживает большинство ОС, включая Андроид.
VMware Workstation, Hyper-V чаще применяются уже для рабочих задач. Так VMware Workstation имеет бесплатную версию VMware Workstation Player для домашнего применения, которая из-за ограниченного функционала не стала популярной. Зато платная профессиональная версия довольно часто используется для домашних нужд. В отличие от VirtualBox, VMware Workstation эмулирует интерфейс БИОС и большее количество версий Mac OS X. VMware Workstation позволяет хранить виртуальный диск в одном или нескольких файлах на выбор пользователя и по умолчанию выделяет под него целых 60 Гб.
Hyper-V уже встроена в Windows с 7 по 10, во все версии, кроме базовой и домашней. Находится в дополнительных компонентах и по умолчанию не установлена. Она ничем не уступает остальным программам, но многие пользователи Виндовс просто не знают о её существовании. Hyper-V имеет свои особенности, например: позволяет при создании виртуального ПК задать поколение ОС (Поколение 1 или 2), которое в дальнейшем будет неизменно. Ещё можно задать для виртуальной машины использование динамической памяти (при наличии свободной у реального ПК), когда выявляется нехватка ранее выделенной памяти.
Практическое применение для дома и обучения
Ещё будучи студентом, я использовал виртуальные машины для запуска старых игр, которые уже не работали на современных операционных системах, и для освоения сетевых программ. Работу с локальной сетью лучше всего начинать с виртуальных машин, позднее перейдя на управление старым ПК, который уже стал пишущей машинкой, а только потом переходить на реальные рабочие компьютеры. Позднее я применял виртуальные машины для изучения операционных систем семейства Линукс.
Также виртуальная машина бывает полезна перед покупкой б/у ПК для обучения школьника или студента. Например, ему нужно работать с несколькими программами, и он сомневается, потянет ли их тот или иной компьютер. Виртуальная машина позволит эмулировать железо данного ПК и выявить степень его пригодности для текущих задач. Аналогично можно воссоздать апгрейд старого ПК, замену жёсткого диска на SSD или добавление оперативной памяти.
Два мира виртуальных машин
Виртуальный. В отличие от большинства модных компьютерных словечек, это понятие обычно соответствует своему словарному определению в тех случаях, когда речь идёт об аппаратуре или программах. Словарь «Random House College Dictionary» определяет «virtual» как «проявляющий свойства и эффекты чего-либо, но не являющийся таковым на самом деле».
Последние несколько лет в начале каждого семестра я даю студентам определения основных терминов, используемых в моём курсе: симуляция, эмуляция и виртуализация. И каждый раз я говорю, чтобы мои слова не принимали за стопроцентную правду. Дело в том, что в одних областях технического знания эти термины зачастую трактуются противоположно тому, что принято использовать в других. Нелёгкое это дело — давать определения.
Видимо, эту проблему заметил не только я. В своей книге Software and System Development using Virtual Platforms, вышедшей в прошлом году, мои коллеги Jakob Engblom и Daniel Aarno в первой главе вводят понятия simulation и emulation и отмечают неоднозначность их толкования в областях разработки программного обеспечения и проектирования аппаратуры.
С беспорядком в толковании этих двух терминов я для себя разобрался и вроде бы смирился. Осталось ещё одно понятие, уже более десяти (на самом деле пятидесяти) лет не теряющее популярности — это «виртуализация». За время своего бытия в категории «buzzword» оно стало сочетаться со множеством других слов. Недавно я осознал, что термин «виртуальная машина» (ВМ) на самом деле используется для обозначения двух хоть и связанных, но различных сущностей. В этой статье я расскажу о двух классах: языковые и системные виртуальные машины. Я покажу сходства и различия между ними, их назначение, классификацию, общие и частные черты в их практической реализации.
Если говорить широко, то виртуальная машина — это программа, задача которой состоит в реализации спецификаций определённого вычислительного устройства или класса устройств. В этом её главное отличие от «просто» физической машины, реализующей то же самое, но в аппаратуре. Всякая спецификация (архитектура компьютера) чаще всего включает в себя определение интерфейсов устройств и описание переходов между состояниями машины. Однако определение интерфейса, как известно, не должно налагать ограничений на способы его реализации.
Многие из нас, наверное, не замечают, как часто ежедневно они сталкиваются с обеими типами машин — виртуальными и реальными. Например, самый простой калькулятор имеет две реализации — как специализированное устройство и как программа:
И аппаратная машина слева, и виртуальная машина справа предоставляют один и тот же интерфейс — кнопки и экран, — и реализуют одни и те же функции — арифметические, логические, тригонометрические операции над числами, отображаемыми на экране.
Виртуальный калькулятор — это пример виртуальной машины — программной копии того, что изначально существовало только в виде аппаратуры, физической машины, вполне конкретной и осязаемой системы. К системным ВМ мы вернёмся чуть позже.
Языковые ВМ
Языковые ВМ обычно проектируются для исполнения одного гостевого приложения (иногда многопоточного) в одной копии виртуальной среды. Другими словами, они не берут на себя типичные для многопользовательской/многозадачной операционной системы функции разграничения доступа к ресурсам. Задача языковой ВМ — предоставить программе окружение, напрямую не зависящее от деталей (и в какой-то мере ограничений) нижележащей физической системы, таких как используемые в последней процессоры, объёмы ОЗУ и дисков, наличие и особенности периферийных устройств и т.д.
Конечно же, и тут не обойтись без холивара про терминологию. К языковым ВМ (language VMs) я буду относить и то, что называется process virtual machine, и то, что именуется managed runtime environment (MRE).
Два семейства языковых ВМ
Языковая ВМ стоит на середине пути: от языков высокого уровня до машинных кодов того компьютера, на котором она исполняется. Поэтому при создании новой архитектуры языковой ВМ следует учитывать два фактора: удобство преобразования выбранных входных языков и скорость исполнения на конкретных аппаратных системах. От первого будет зависеть универсальность и расширяемость создаваемой среды, а от второго — верхняя граница скорости работы программ для этой ВМ.
Базовой единицей исполнения для ВМ является машинная инструкция. Каждая такая инструкция должна определять операцию, выполняемую над данными, а также местоположение самих данных. Естественно, что набор операций сильно зависит от конкретной ВМ и может варьироваться в широких пределах. «Железные» наборы инструкций в этом куда более ограничены [Я всё ещё жду процессор с аппаратными malloc() и free(), а лучше — с аппаратным сборщиком мусора].
С другой стороны, в подходах к организации обрабатываемых данных среди ВМ не так много разнообразия. Фактически есть две устоявшиеся концепции — хранить данные на стеке (стеках) и использовать выделенный набор регистров.
Стековые ВМ
Такие ВМ хранят все или почти все данные в одном или нескольких стеках. Для обращения к ним используется адресация относительного положения требуемой ячейки от текущей вершины стека. Если у операции есть результат, то он помещается в стек, становясь его новой вершиной. Кроме данных, в стеке могут храниться адреса, используемые при возврате из вызванных подпроцедур в вызывающие. Или же адреса могут быть в отдельном стеке.
Про стековые машины известно и написано много, и я не буду пытаться здесь описать всё, что знаю и чего не знаю. Выделю лишь некоторые ключевые факты.
Поскольку речь сейчас только о программных системах, я не буду углубляться в особенности аппаратных стековых машин, с их сильными и слабыми сторонами, такими как обработка прерываний, скорость доступов к памяти, взаимодействие с различными узлами процессора, возможности к параллелизации и т.д. Рекомендую хорошую статью на Википедии в качестве отправной точки.
Примеры
Я не утаю правду, сказав, что за всё время всевозможных языковых виртуальных машин было создано очень много. Пытаться описать их все — безнадёжная затея. Поэтому я далее упомяну лишь некоторые из них в качестве примеров.
Исторические важные примеры стековых языковых ВМ
SECD — абстрактная машина, появившаяся в 1960-х годах и повлиявшая на развитие функциональных языков, в том числе LISP.
P-code — язык виртуальной машины, в который транслировал программы первый компилятор Паскаля университета Калифорнии. Благодаря переносимости p-code и подхода с «самораскруткой» (bootstrapping) компилятора имелась возможность достаточно быстро получить работающий компилятор Паскаля на новых ЭВМ, что во времена отсутствия стандартов на окружение (никаких тебе POSIX в 70-х) и огромного числа несовместимых между собой архитектур ЭВМ было важным фактором для завоевания языком популярности.
Forth — вообще-то Forth нельзя назвать только языковой ВМ. Для кого-то это процедурный язык высокого уровня, для кого-то объектно-ориентированный язык, кому-то — функциональный, кому-то — машинный, а кому-то и вовсе философия проектирования систем (Thinking Forth). Однако именно Форт приходит мне на ум, когда кто-то произносит слова «программирование» и «стек» в одном предложении.
Актуальные языковые ВМ
Java VM — байткод для всем известного «compile once, run everywhere» языка Java (а также для Scala, Clojure и др.) выполняется на стековой ВМ. Сам стек хранит скалярные данные выполняющихся методов, аргументы инструкций, в том числе ссылки на объекты и массивы, которые хранятся в отдельной области-куче.
Таким образом, две самые популярные среды времени исполнения используют стековые языковые ВМ. Возможно, у читателя возник вопрос: если код из байткода чаще всего в конце концов транслируется в настоящий машинный код хозяйской системы, архитектура которой содержит регистры, а не только стек (кто читает эти строки с дисплея машины со стековой машинной архитектурой — поднимите руки!), то почему две самых популярных языковых ВМ используют стековое представление? В [1] приводится следующий довод: «. a stack is amenable to platform independence (the host platform can have any number of registers in its ISA)» — «стек облегчает обеспечение платформонезависимости (хозяйская платформа может иметь любое количество регистров в своём наборе команд)».
Регистровые ВМ
Альтернативный подход к хранению обрабатываемых данных состоит в использовании выделенного набора ячеек памяти с фиксированными именами-номерами — регистрами. Инструкции в основном оперируют с данными на регистрах, при необходимости загружая отсутствующие значения из памяти или выгружая ненужные в память.
В некоторых регистровых архитектурах стек тоже обычно имеется в наличии. Однако он не играет центральной роли в работе ВМ, а используется для поддержки процедурного механизма (и в таком случае не обязательно является напрямую доступным программам).
Интереснейший вопрос заключается в том, какой тип ВМ — стековый или регистровый — исполняет программы быстрее. Однозначного ответа к настоящему моменту нет; данные одних исследователей доказывают преимущество первого вида, тогда как остальные утверждают обратное. Интересный эксперимент описан в [3] — авторы статьи используют для исполнения регистровую ВМ, код для которой получается с помощью оптимизирующей трансляции из Java байткода, и сравнивают производительность.
Примеры
Parrot VM — долгострой ВМ, разрабатываемая уже более 10 лет и служащая основной средой исполнения языка Perl 6.
Dalvik от Google — регистровая ВМ, служащая для исполнения приложений, написанных на Java. Интересно, что байткод стековой JVM (*.class) преобразуется в байткод регистровой ВМ (*.dex). В настоящее время Dalvik отходит на второй план в Android, уступая место ART — механизму прямой компиляции в машинный код хозяйской системы.
LLVM bitcode — одно из представлений исходной программы, используемое при трансляции программ с помощью инструментов на основе LLVM, и по совместительству входной язык ВМ, использующий трёхоперандный формат инструкций с регистрами. Необычным в этой ВМ является то, что инструкции выражены в т.н. SSA (single static assignment) форме, т.е. они используют потенциально неограниченное число виртуальных регистров. Распределение регистров ВМ на физические происходит позже в процессе трансляции в машинный код или интерпретации.
MIX и MMIX — виртуальные машины, используемые (или планируемые к использованию в будущих изданиях) Д. Кнутом в своей серии книг «Искусство программирования» для иллюстрации реализации алгоритмов. MIX выполнена в духе 1960-х: выделенный регистр-аккумулятор, 6-битные байты, двоично-десятичный формат чисел, отсутствие стека и склонность к задействованию самомодифицирующегося кода. MMIX — это уже вменяемый RISC с щедрым числом (256) и шириной (64 бит) регистров.
Экзотические ВМ
Остерегайтесь смоляной ямы Тьюринга, в которой всё возможно, но ничто из интересного не достижимо.
Наконец, третий подход к построению ВМ заключается в нарушении всех правил и создании архитектуры, непохожей ни на что «стандартное». С одной стороны, это очень увлекательно: придумать новую концепцию там, где всё уже вроде бы придумано. С другой стороны, польза от таких систем ограничена, часто из-за их (нарочной) экстремальной непрактичности.
printf() как виртуальная машина — не совсем экзотика, просто хочу показать знакомую многим вещь под новым углом. Ведь если присмотреться, то строка спецификации, идущая первым аргументом у стандартных функций семейства printf языка Си — это программа, инструкциями которой являются символы, а данными — оставшиеся аргументы функции. Большинство инструкций этой ВМ просто выводят один символ, совпадающий с кодом самой инструкции; но вот инструкция % имеет гораздо более сложную семантику, зависящую от следующих за ней символов. Неудивительно, что некоторые уязвимости в ПО основаны на передаче специально подобранной строки для интерпретации её в printf и исполнения неавторизованного кода.
OISC. Самый увлекательный и загадочный (для меня) класс языков экзотического типа — это OISC (one instruction set computer) — системы, содержащие ровно одну машинную инструкцию и при этом не являющиеся совсем тривиальными. Некоторые из них эквивалентны машине Тьюринга, т.е. на них могут быть запрограммированы достаточно сложные алгоритмы. Самая известная из OISC — subleq (subtract and branch unless positive).
Следует отметить, что OISC зачастую скрывается во вполне привычном наборе машинных инструкций; например, MOV в PDP-11 или #PF/#DF в составе Intel ® IA-32; последнюю машину можно назвать zero instruction set computer, потому что формально исполнения инструкций IA-32 при обработке исключений не происходит.
Dis — ВМ для распределённой ОС Inferno, созданной в Bell Labs людьми, стоявшими у истоков ОС Plan 9. Эта машина имеет адресацию «память-память», что довольно необычно по современным меркам (последний раз в аппаратуре такое было в Motorola 68000), и отсутствие архитектурно видимых регистров. Я не могу придумать преимуществ такого подхода ни перед регистровыми, ни перед стековыми системами; скорее, он собирает в себе все их недостатки.
Способы исполнения
После определения типа ВМ и деталей архитектуры наступает время создания программы, реализующей функциональность ВМ. После выбора языка программирования и прочих мелочей надо определиться с тем, каким образом будут обрабатываться инструкции. А способа есть минимум три:
Динамическая трансляция — техника, в общем случае превосходящая интерпретацию как по скорости, так и по сложности реализации. Она основана на том факте, что код, исполняющийся внутри ВМ, образует циклы, и входящие в них инструкции при каждой интерпретации будут совершать одинаковые действия. Если блоки кода ВМ перед исполнением транслировать в эквивалентные секции машинного кода физической системы, то можно сэкономить на декодировании и интерпретации. Чем больше итераций будет проводиться в цикле, тем значительнее будет эффект от использования трансляции. Я описал один из способов построения простого шаблонного транслятора в предыдущей статье.
Статическая трансляция — в случае, когда весь код, подлежащий исполнению, известен заранее (то есть в процессе работы ВМ подгрузки новых блоков с инструкциями не ожидается), то возможно использовать классическую компиляцию — однократно преобразовать машинные инструкции исходной ВМ в машинные инструкции физической системы, при этом опционально применяя разнообразные оптимизации.
Заинтересовавшимся вопросами проектирования и реализации языковых ВМ я могу посоветовать книгу [2], автор которой описывает теорию и приводит практические примеры реализации стековых, регистровых ВМ, а также «экзотического» варианта ВМ для событийно-ориентированной системы.
Системные ВМ
Системные виртуальные машины, как правило, создаются по спецификациям, для которых уже существуют «железные» реализации. Это привносит свои особенности в процесс создания таких ВМ. Архитектура настоящей аппаратуры ограничена сильнее чисто программной, «умозрительной» ВМ: влияют требования на производительность, энергопотребление, физические размеры кристалла, способного вместить реализацию, совместимости с внешними устройствами и т.д.
Часто целью создания системной ВМ является запуск внутри неё немодифицированных (пренебрегаем паравиртуализацией для простоты) операционных систем, предоставляющих многозадачность и контролируемый доступ к системным ресурсам гостевым пользовательским приложениям. В отличие от языковых ВМ, рассчитанных на работу одиночного процесса, системная ВМ должна предоставлять достаточно полное окружение из большого числа моделей периферийных устройств, симуляцию работы с картами физической памяти, корректную обработку прерываний и исключений, монотонное и равномерное течение виртуального времени и т.д.
В отличие от создателей языковых ВМ, которые часто имеют довольно большую свободу при выборе деталей машинного языка, программисты, реализующие системные ВМ, связаны необходимостью чётко следовать спецификациям на аппаратуру, которые обычно нелегко изменить. Значительные усилия приходится тратить на эффективную поддержку идиосинкразий (или попросту костылей) выбранного машинного языка. После длительной эволюции и многочисленных расширений некоторые архитектуры и вовсе выглядят как сплошной забор из костылей… но я отвлёкся. В любом случае, при создании системной ВМ больше внимания достаётся вопросам создания корректной и быстрой программы, чем хлопотам о входном машинном языке.
Классификация системных ВМ
Системные ВМ в первую очередь классифицируются по тому, какой тип гостевого процессора моделируется. Классификаций процессоров существует много, и они довольно подробно описаны в различных источниках, поэтому здесь лишь кратко резюмирую самые общие вещи. По архитектуре набора команд ЦПУ бывают CISC — сложные инструкции, делающие сразу много вещей сразу, включая загрузку данных из памяти, и RISC — максимально простые инструкции, в которых доступ к памяти и операции над данными в регистрах явно разделены; несколько особняком стоят VLIW, в которых несколько разных операций объединяются в одно машинное слово. Также можно классифицировать наборы команд по признаку вариативности длины инструкции: системы с переменной длиной команд и системы с фиксированной длиной. По правде сказать, по-настоящему постоянная длина инструкций встречается редко — всегда или что-то не влезает в машинное слово (например, 32-битные литералы в ARC и 64-битные в IA-64), или же создатели пытаются сэкономить, назначая для часто используемых инструкций последовательности покороче (16-битные команды ARCompact или ARM Thumb).
При создании системной ВМ важным классификационным признаком является наличие/отсутствие отношений «родства» между архитектурами хозяйской и гостевой систем. По степени родства моделируемая и моделирующая системы могут быть: полностью разнородными (например, Zilog Z80 и PowerPC), похожими (Intel IA-32 и Intel 64, или Intel 8086 и Intel IA-32) или же совпадающими (X и X, где X — ваша любимая архитектура).
В случае, когда гость и хозяин различны, задача системной ВМ состоит в обеспечении возможности запуска приложений, написанных и скомпилированных для «чужой» архитектуры, на хозяйской системе без необходимости их перекомпиляции или какой-либо ещё модификации. В идеале программная прослойка ВМ может быть вообще невидимой для конечного пользователя. Она обязана работать корректно, достаточно быстро и не требовать дополнительной конфигурации.
В случаях совпадения архитектур систем гостя и хозяина системные ВМ также находят применение. Запуск гостевой ОС внутри ВМ под управлением монитора позволяет контролировать потребление ею ресурсов, исполнять одновременно с другими системами, замораживать, восстанавливать из образов, клонировать, мигрировать с одного места на другое и вообще выполнять разные фокусы, которые затруднительно провернуть с ОС, запущенной напрямую на железе.
Для создателей ВМ критично важным становится свойство «виртуализуемости» набора команд. От того, удовлетворяет ли выбранная архитектура машинных команд достаточным условиям Голдберга-Попека, зависит, насколько просто будет реализовать монитор виртуальных машин для неё, а также насколько серьёзное замедление (по отношению к работе на «голом» железе) он будет вносить. Intel IA-32/Intel 64 до появления расширений Intel VT-x принадлежала к первой категории сложно-виртуализуемых систем, но в настоящее писать эффективные мониторы для неё «легко» (если это слово применимо к разработке модулей ядра для набора команд с почти полувековой эволюцией).
Способы исполнения
С точки зрения программной реализации системные ВМ имеют много общего с языковыми. Это неудивительно — базовая единица исполнения в обоих случаях — машинная инструкция.
Интерпретация — и снова это слово! В случае, когда нужно сделать максимально легко портируемую системную ВМ без особой оглядки на скорость, интерпретатор будет естественным первым выбором. Bochs — наверное, самый известный из открытых проектов такого типа. Подчеркну вновь отсутствие порядка в терминологии — на официальной странице Bochs представлен как «PC emulator», а не симулятор или виртуальная машина.
Динамическая трансляция — как было описано ранее, группа технологий, обещающих более высокую скорость работы. А вот статическая трансляция, применимая для языковых ВМ, не очень удобна для создания ВМ системных — в полноплатформенных моделях крайне редко весь код доступен и известен заранее, до начала симуляции. К чисто динамическим трансляторам относится ранее упомянутый IA-32 Execution Layer.
Аппаратная поддержка — для архитектур, поддерживающих виртуализацию аппаратно, это наиболее эффективный метод. Однако он и самый «капризный», ведь он работает только при совпадении архитектур гостя и хозяина. Часто даже относительно небольшие различия между наборами расширений выбранных систем могут сделать нецелесообразными попытки создания ВМ такого типа. Большинство современных коммерческих гипервизоров для IA-32 активно полагаются на наличие VT-x в своей работе.
Заинтересовавшимся вопросами проектирования и реализации системных ВМ я хочу посоветовать книгу [1]. Незаинтересовавшимся тоже рискну её посоветовать — в ней доступно объясняются многие важные особенности компьютерной архитектуры, она написана довольно понятным языком.
IBM разработала операционную систему VM (Virtual Machine) в 1964. Как и любая ОС, VM контролировала ресурсы компьютера. Она также предоставляла новую возможность, никогда не существовавшую раньше в других ОС: иллюзию для каждого пользователя, что в его распоряжении есть целый компьютер, полностью для его нужд. IBM создала VM задолго до появления идеи персонального компьютера, и в то время возможность иметь хотя бы симуляцию компьютера целиком и полностью для себя самого было Большим Делом. Если двадцать человек подключились к системе с VM одновременно, она создаёт для каждого из них иллюзию, что они используют двадцать различных независимых компьютеров.
Итоги
В данной статье я постарался описать два класса программных систем, называемых виртуальными машинами, показать различия и сходства между ними, известные вариациии используемых архитектур и их программных реализаций. Суммарно классификация ВМ выглядит следующим образом:
Языковые виртуальные машины в первую очередь различаются по организации доступа к данным. Системные ВМ в первую очередь характеризуются особенностями аппаратной архитектуры реализуемого гостя. Очень часто реализуемый на практике сценарий подразумевает совпадение архитектур хозяина и гостя. При этом самым важным свойством с точки зрения проектировщика монитора ВМ является удовлетворение условиям эффективной виртуализуемости.
Уфф, как всегда, хотел написать пару строк, а получилась длинный пост-простыня. Конечно, область вопросов о структуре, производительности и развитии виртуальных машин необъятна. Я планировал написать ещё о паре моментов в работе создателей ВМ, но, пожалуй, отложу их на следующий раз.
Спасибо за внимание!