Что такое виртуальная память?

«Что такое виртуальная память?» — вопрос из категории Linux и ОС, который задают на 25% собеседований C/C++ Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Виртуальная память — это абстракция, предоставляемая операционной системой, которая позволяет процессам работать с большим, непрерывным адресным пространством, не зависящим от фактического объема физической оперативной памяти (RAM).

Основные принципы:

  • Каждый процесс имеет собственное изолированное виртуальное адресное пространство.
  • Адреса, которые использует программа (виртуальные), транслируются в физические адреса RAM с помощью таблиц страниц, управляемых ОС и аппаратным блоком MMU (Memory Management Unit).
  • Память делится на фиксированные блоки — страницы (обычно 4 КБ).
  • Если процесс обращается к странице, которая в данный момент не находится в RAM, возникает исключение — page fault. ОС обрабатывает его, загружая требуемую страницу с диска (из области подкачки — swap) в RAM, возможно вытесняя другую страницу.

Пример на C++:

#include <iostream>
#include <vector>

int main() {
    // Выделяем 1 ГБ виртуальной памяти. На этом этапе физическая память может не выделяться.
    // Операционная система резервирует адресное пространство.
    std::vector<int> hugeArray(256 * 1024 * 1024); // 256M элементов int ~ 1 ГБ

    // Физическая память (страницы) будет выделяться по мере записи (при первом доступе).
    // Это может вызывать page faults.
    hugeArray[0] = 42;
    std::cout << "First element: " << hugeArray[0] << std::endl;

    return 0;
}

Преимущества:

  • Изоляция и безопасность: Процессы не могут напрямую обращаться к памяти друг друга.
  • Оверкоммит (Oversubscription): Сумма виртуальной памяти всех процессов может превышать объем физической RAM.
  • Упрощение программирования: Программа видит линейное адресное пространство, ей не нужно управлять физической памятью.

Недостатки/Накладные расходы:

  • Производительность: Трансляция адресов (через TLB — Translation Lookaside Buffer) и обработка page faults требуют времени.
  • Фрагментация: Может возникать как на уровне виртуальной, так и физической памяти.
  • Замедление при активном свопинге: Если системе не хватает RAM и она активно сбрасывает страницы на диск, производительность резко падает.