Виртуализация -- это парадигма, подход к решению некоторого широкого набора задач при помощи определенной практики.
Слово "виртуальный" -- средневековая латынь, латинское слово virtualis было впервые использовано товарищем, которого граф оставил вместо себя управлять поместьем (потом появилась специальная должность виконт, viscount). Этот граф отправился в крестовый поход, а на его месте остался человек, который обладал теми же достоинствами и добродетелями, но графом не являлся.
По некоторому набору требований мы создаем что-то, что не является тем, что мы воссоздаем (либо потому, что это просто не оно, или потому, что его никогда и не было). Мы создаем модель некоторого окружения, в котором происходит функционирование некоторых сущностей.
Виртуализация -- это всегда создание некоторой "кажимости", некоторого набора условностей. Программа, которая создает набор таких "кажимостей", это и называется виртуальной машиной (монитор, который контролирует исполнение чего-то, что происходит внутри него).
При использовании правильного набора абстракций получается очень мощный механизм, из-за того, что, если мы выделим только определенные важные поведенческие аспекты из какой-то сущности, то мы получим возможность воссоздавать тот же самый набор контрактов и ожиданий на широком наборе реального аппаратного обеспечения.
Типичный пример: высокоуровневый язык. Компьютеры не умеют в си или другие языки программировния, они умеют исполнять набор инструкций -- набор бинарного кода с достаточно простыми, примитивными операциями (прочитать значение, сложить значение, записать назад в память, ...). Этот набор инструкций разный для телефона, компьютера, ..., потому что отличаются архитектуры.
Конкретная реализация компьютерных систем достаточно большие изменения претерпела за последние лет 49, при этом значительная часть мыслей, которые выражены в программах на высокоуровневых языках, не изменились. например, алгоритм умножения матриц запускай хоть на телефоне, хоть на суперкомпьютере -- логика того, что нужно делать, никак не изменится. Поэтому в определенном смысле языки программирования являются технологией виртуализации мыслей: мы выражаем именно то, что хотим выразить, а дальше уже определенный инструмент (в данном случае транслятор) транслирует этот код в какой-то набор команд, понятных конкретному процессору.
Другая похожая система виртуализации -- это система разделения времени. Из истории компьютеров: первая система, которая была предшественницей юникса, называлась MULTICS и являлась желанием людей в университете одновременно использовать один компьютер для более чем одного человека одновременно. Были созданы time-scheduling системы -- системы, которые умели по какому-то внешнему событию (таймеру) переключать текущий контекст исполнения и начинать исполнять что-то другое. В результате (тогда компьютеры уже работали быстрее, чем люди) исполнение, пока один человек как-то взаимодействовал со своей программой, его программа ждала, а другая программа могла исполняться. Если посмотреть на то, что происходит на компьютере при таком раскладе, то программе кажется, что она исполняется непрерывно, при этом реально на процессоре происходит исполнение кусочков программы, прерываемое аппаратным прерыванием, переключением контекста и продолжением исполнения какой-то другой программы. В результате программа может не думать, что она сосуществует с другими программами на этом компьютере, они просто исполняются независимо и не думаю о существовании других программ. И дело некоторого монитора виртуальных машин (schedulerа ядра ОС) -- осуществить создание кажимости, что у каждой из этих программ есть свой процесс.
Третий показательный пример -- виртуальная память. Если мы программировали на си или иже подобных языках, то мы знаем, что, с точки зрения программы на языке си, вся память -- это один большой линейный массив, а указатель -- это индекс в этом большом линейном массиве. Весь язык си построен вокруг указателей, арифметикой над ними. Если это верно про аппаратный компьютер (у компьютера есть какое-то количество физ памяти), то из-за того, что в нем существует множество различных программ, и в разных компьютерах много чего разного (той же памяти), то иллюзия непрерывного линейного пространства (например, от 0 до 4 ГБ для 32-битного пространства, от 0 до дохрена для 64-битного) некорректна. Существует какая-то сущность (в данном случае у ОС) -- менеджер виртуальной памяти, который создает иллюзию непрерывной линейной памяти поверх сузествующей физической памяти и, соответственно, обеспечивает композицию размещения данных разных программ в этой самой наличной физической памяти.
Похожая концепция -- это TCP-соединение -- пример виртуального канала. Нам кажется, что у нас есть некоторая труба, в которую можно с одной стороны посылать байтики, с другой стороны получать байтики, хотя на самом деле это достигается зачем благодаря достаточно сложной коммутируемой сети, которая обменивается пакетами, некоторые пакеты теряются и так далее, так что там внутри все сложно, до для того, что пишет программы в терминах сокетов, это вообще не важно: он знает, куда посылать или откуда получать, вот и абстракция. Эту идею легко переносить между разными компьютерными системами.
Примеры из зала: нету :(
Концепция VM появилась, когда появились достаточно мощные компьютеры (когда вычислительная мощность не только на арифметике, а вообще на абстрактных логических операциях у компьютеров стала сильно больше, чем у людей), стало понятно, что нужны какие-то более простые концепции для создания прикладными программами (программами, которые не очень знают, где они исполняются). Появилось разделение на системных программистов и прикладных (первые хорошо знали, как работают компьютеры, вторые хорошо понимали, как решать конкретные прикладные задачи), и зачастую это оказывались разные люди, и между ними был некоторый договор, который частично достигался различными виртуализационными техниками.
Определение виртуализации получилось скучным, преподаватель постарается пересказать. Это такая техника, которая создает параметризированный контекст исполнения, это технология создания некоторого такого замкнутого самосогласованного мира, в рамках которого происходит некоторое взаимодействие, приэтом у этого мира есть управляющие ручки -- возможность решить что-либо.
Например, процесс в юниксе -- хороший пример многих аспектов виртуализации. Это представление некоторой достаточно сложной сущности работы компьютеров в достаточно простых терминах: у процесса есть линейное адресное пространство, непрерывный поток исполнения (и то и другое -- кажимость), и при этом у него есть внешние ручки (его можно убить, к нему можно присоединиться отладчиком), то есть, у него есть контекст, и этот контекст управляем. Наличие менеждера ресурсов (менеджера контекста) позволяет создавать контекст, при этом сам контекст является контролируемым: он существует не сам по себе, но на него можно как-то извне воздействовать.
И внутренний, и внешний аспекты виртуализации (внутренний -- мир достаточно прост внутри виртуализированной системы, внешний -- этим миром, в котором живут виртуализируемые сущности, можно как-то управлять) одинаково важны и полезны.
Зачем нужна VM, и как устроена память. Ч1