Виртуальная машина VM – это представление физических вычислительных ресурсов в виде программы.
Каждая VM представляет собой набор ресурсов, которые предоставляются уровнем физической инфраструктуры. Эти ресурсы обычно организуются в «пул» (некоторое количество чего-то, из которого можно брать это что-то частями). Эти ресурсы могут предоставляться VM динамически и (иногда) – статически.
Каждая VM «видит» свой набор назначенных ей ресурсов в форме компонентов
- Тип аппаратной платформы процессора (x86 для 32-битных VM или x64 для 64-битных VM)
- Тип виртуального оборудования (в зависимости от уровня виртуализации)
- Виртуальный процессор CPU (и возможно виртуальные сокеты (sockets) и виртуальные ядра (cores))
- Виртуальная память RAM (также это может быть Persistent RAM, т.е. оперативная память, сохраняющая данные в отсутствие питания)
- Виртуальный диск, подключенный к виртуальному контроллеру
- Виртуальная сетевой интерфейс NIC (Network Interface Card)
Могут быть также дополнительные аппаратные компоненты, которые не являются обязательными, но могут быть полезными в ряде случаев, например, когда требуется видеодрайвер, клавиатура и мышь для удалённой консоли управления.
Например, в платформе виртуализации VMware vSphere для VM можно назначать множество дополнительного оборудования.

Кроме показанного на рисунке, для VM можно также назначать устройства PCI, устройства SCSI, виртуальные порты FC, а также некоторые другие виды устройств хранения, например, NVMe или SATA.
В последнее время приобретают популярность виртуальные GPU, которые используются в некоторых задачах, которые лучше выполняются на GPU, а не на CPU
Как VM делят процессор и память
На одном физическом сервере можно запустить много виртуальных машин. Как же они делят его вычислительные ресурсы: вычислительную мощность процессора CPU и память RAM?
Для этого существует много различных программно-аппаратных механизмов, которые работают на уровне машинных кодов, по сути, упорядоченных потоков 0 и 1, которые обрабатывает процессор и которые временно храниться в кэше (быстродействующей промежуточной памяти процессора), а также в оперативной памяти RAM компьютера, к которой непосредственно процессор подключен.
Как известно, один процессор CPU (Central Processor Unit) может содержать 2, 4, 6, 8 или больше ядер (cores), то есть, самостоятельных вычислительных единиц, которые могут обрабатывать один или больше потоков (т.е. нулей и единиц, которые образуют процессы программы или приложения). Конечно, самый простой способ – назначить каждому ядру свою виртуальную машину.

Однако, кроме такого элементарного способа, можно в одном ядре (Core) задавать ещё и несколько потоков (Thread) и обрабатывать их раздельно. Это делается методом прерываний. То есть, процессор или ядро, обрабатывают сначала один поток, затем другой, потом третий и т.д. Затем обработав все заданные потоки, снова возвращается к первому потоку.
В реальности все несколько сложнее, поскольку в этом процессt приходится задействовать еще и области памяти RAM, выделяя её области под процессы виртуальных машин, а также буфер памяти процессора CPU (регистры и кэш, который может быть нескольких уровней). Очередность выполнения определяется планировщиком задач процессора (Scheduler), который управляется гипервизором, а тот в свою очередь, выполняет политики, заданные приложениями, которые порождают потоки данных.

.
Это довольно упрощенное описание реального процедуры, которая может быть гораздо сложнее. В различных статьях и технических документах эти процедуры любят иллюстрировать фрагментами кодов на языке высокого уровня, которые мало проясняют картину.
Для иллюстрации, приведет микрофотографию реального восьмиядерного CPU с областями 3-уровневого кэша LL Cache Slice, и других устройств: ядра CPU (CPU Core) агент памяти (Memory Agent), агента шины PCIe (PCIe Agent), устройство управления питанием (Power Control Unit), двух канальный контроллер вваод-вывода памяти (2-Channel DDR3 I/O), кольцевой шины, объединяющей области кэша (Ring Bus) и др.

Совместная работа перечисленных устройств позволяет получить формальную картину обработки потоков данных, показанную на рис. 3.
В общем и целом, можно получить следующую картину обработки потоков процессов VM. При помощи программной обработки, процессы (Process) различных VM делятся на потки (threads), которые обрабатываются в ядрах (Cores) процессоров CPU (Node), использующих общую память (memory). Таких узлов Node может быть довольно много, и они не обязательно должны совпадать с физическими процессорами. То есть, один процессор может обрабатывать несколько узлов Node, а также и узел Node может занимать ресурсы нескольких процессоров.

Возможность динамического изменения ресурсов VM
Какие виды ресурсов можно изменять на работающей VM, т.е. динамически? На самом деле, это в основном зависит от используемого гипервизора и его версии, так что тут есть много возможностей.
В основном эти возможности, следующие:
Тип ресурса | Увеличение ресурса | Уменьшение ресурса |
CPU (socket) | Возможно | Возможно |
CPU (core) | Невозможно, вследствие ограничений ОС | Невозможно, вследствие ограничений ОС |
RAM | Возможно | Возможно, но обычно не используется |
Накопитель (устройство) | Возможно, кроме устройств IDE | Возможно, кроме устройств IDE |
Накопитель (пространство) | Возможно, кроме устройств IDE | Возможно, кроме устройств IDE, но обычно не используется |
Контроллер устройства хранения | Возможно | Возможно, но обычно не используется |
Сетевой контроллер | Возможно | Возможно |
Устройство PCI | Возможно | Возможно, но обычно не используется |
Устройство USB | Возможно | Возможно |
Периферийное устройство | Невозможно | Невозможно |
GPU общего применения | Возможно | Возможно, но обычно не используется |
В следующих публикациях рубрики «Ликбез» этот вопрос будет рассмотрен подробнее.
Уведомление: Telecom & IT