Saturday, March 19, 2016

Эмуляция vs Виртуализация

Эмуляция - ориентирована на использование аппаратуры полностью отличной от базовой системы с полной изоляцией от внешнего мира. Подразумевается полная эмуляция оборудования и временных характеристик, если требуется. Возможна в режиме бинарной трансляции, когда код преобразуется в код совпадающий с системой команд базовой системы(это может осуществляться как на уровне пользовательского приложения, так и на уровне операционной системы и самого процессора, как пример процессоры Transmeta), а так же в режиме интерпретации бинарного кода для случаев, когда код подразумевает само модификацию и компиляция кода в другую систему команд будет неэффективна.
Виртуализация - подразумевается что используется архитектура близкая или совместимая на бинарном уровне с базовой системой, как результат при выполнении не привилегированных команд можно выполнять их напрямую и используя аппаратную поддержку виртуализации вызывать наши обработчики на команды которые потенциально могут изменить состояние системы или обращения к прерываниям с внешними устройствами. Также возможно использование бинарной трансляции кода для замены потенциально опасных команд на заглушки вызывающие код обработчиков непосредственно без инициирования прерывания. В данном режиме эмулируется кое какое простое оборудование способное выполнить наиболее критические операции подобные доступа к сети и устройствам ввода вывода.
Паравиртуализация - базируется на тех же технологиях как и виртуализация, но позволяет улучшить производительность так как вместо эмуляции протокола работы с подобием реальной аппаратуры мы может обойтись одним псевдоустройством с областью памяти для обмена пакетами с каким-то методом синхронизации, когда запись в определенную область или вызов прерывания сигнализирует готовность данных для обмена. Также позволяет контролировать внутренние параметры системы и освобождать свободную память или понизить частоту опроса и выдачи процессорного времени виртуальной машине, как результат нагрузка систему снижается и более прогнозируема или контролируема со стороны планировщиков базовой системы.
Вложенная виртуализация - является технологией рассчитанной на предоставление возможности запуска вложенных виртуальных машин на уже виртуализированной системе без использования программной эмуляции вложенной системы. Основная задача проэмулировать аппаратные расширения виртуализации, например, команды смены режима процессора или распределения памяти. Основная проблема в данном режиме у нас уже есть какие-то обработчики, привязанные к прерываниям или выполнению команд критичных для состояния системы. И дать возможность совместного управления основной системой и виртуализированной мы не можем, так они имеют максимальный приоритет и если вложенная система будет иметь доступ к ним они могут устроить побег из изоляции. А значит нужно дать возможность виртуальной машине первого уровня привязать новые обработчики для системных функции и при срабатывании исключений для критичных команд, передать сообщение об этом на корректный уровень виртуализации с нулевого уровня в первый уровень виртуализации для корректной обработки событий 2 уровня виртуализации. Частично это решается через бинарную трансляцию кода исполняемого в виртуальной машине, что позволяет все критичные команды заменить на вызов обработчиков для этих команд без переходов между уровнями.
Контейнеры - организуется через стандартную функциональность операционной системы по изоляции процессов и подмены ресурсов. Позволяет получить очень легковесную изоляцию вложенной системы от базовой системы и других запущенных контейнеров. Организовано через создание пространств имен для всех ресурсов системы, когда существуют базовое пространство доступное лишь в базовым процессам, и выделенные подпространств доступных в контейнерах. Главный недостаток отсутствие возможности запуска процессов рассчитанных на запуск под другой семейство операционных систем, так как процесс будет видеть тоже самое ядро что и основная система, частично это решается расширением количества подсистем доступных в базовом ядре или запуском дополнительных прослоек эмуляции API не доступного на базовой системе, как пример может быть использовано UNIX подсистема в NT ядре или Wine для Unix ядер.