Вопрос с собеседования · Основы

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

MiddleОперационные системы
Ещё спрашивают так:
  • Зачем процессу виртуальные адреса?
  • Что такое страница памяти и page fault?
  • Что такое swap и почему он замедляет систему?
Коротко

Каждый процесс видит своё виртуальное адресное пространство; процессор с ОС переводят виртуальные адреса в физические страницами (обычно по 4 КБ).

  • Изоляция: процесс не может обратиться к чужой памяти
  • Память выделяется лениво — страница появляется при первом обращении (page fault)
  • Страницы можно вытеснять на диск (swap) и отображать файлы (mmap)

А ещё TLB кэширует трансляцию; огромные страницы (huge pages) снижают промахи

Подробно

Программа работает с виртуальными адресами. Блок управления памятью процессора (MMU) переводит их в физические по таблице страниц, которую ведёт ОС для каждого процесса. Память нарезана на страницы фиксированного размера, обычно 4 КБ; соседние виртуальные страницы могут лежать где угодно в физической памяти.

Что это даёт:

  • изоляцию — у процессов разные таблицы страниц, чужие адреса просто не отображены; запись в недоступную страницу — segfault;
  • простоту — каждый процесс видит непрерывное пространство, начиная с одних и тех же адресов, независимо от того, кто ещё работает;
  • ленивое выделение — malloc на гигабайт резервирует адреса, а физическая страница выделяется при первом обращении. Обращение к неотображённой странице — page fault: ОС выделяет страницу и возобновляет программу. Поэтому RSS (резидентная память) меньше VSZ;
  • общие страницы — библиотеки загружаются в память один раз и отображаются во все процессы; fork делит страницы с copy-on-write;
  • отображение файлов — mmap превращает файл в участок памяти, страницы читаются с диска по требованию;
  • swap — редко используемые страницы ОС выгружает на диск и подгружает обратно при обращении.

Цена. Трансляция на каждый доступ к памяти была бы дорогой, поэтому у процессора есть TLB — кэш последних трансляций. Промах TLB — проход по многоуровневой таблице страниц. Для баз данных и JVM с большими кучами включают огромные страницы (2 МБ, 1 ГБ): меньше записей, меньше промахов.

Swap и производительность. Обращение к выгруженной странице — чтение с диска, в тысячи раз медленнее памяти (major page fault). Когда рабочему набору не хватает памяти, система постоянно гоняет страницы туда и обратно (thrashing) и почти не работает. Для серверов с базами swap часто отключают или ставят vm.swappiness низким, а при нехватке памяти срабатывает OOM killer.

Пример

ps -o pid,vsz,rss,comm -p 1234
  PID    VSZ    RSS COMMAND
 1234 8123456 412300 java       # 8 ГБ адресов зарезервировано, 400 МБ реально в памяти

/usr/bin/time -v ./app | grep "page faults"
  Major (requiring I/O) page faults: 12
  Minor (reclaiming a frame) page faults: 48211

Что хотят услышать

  • Виртуальные адреса, страницы, таблица страниц, MMU.
  • Зачем: изоляция, ленивое выделение, общие страницы, mmap.
  • Page fault minor и major, swap и thrashing.
  • TLB и huge pages — плюс для middle.

Частые ошибки

  • «Виртуальная память — это swap».
  • Считать VSZ реальным потреблением памяти.

Проверьте себя

Один верный вариант. Подумайте, потом откройте ответ.

Показать варианты и ответ
  • ✗Все процессы видят одну физическую память и делят адреса
  • ✓У каждого процесса своё виртуальное адресное пространство, переводимое страницами
  • ✗Виртуальная память — это только swap-раздел на диске
  • ✗Память выделяется физически сразу при каждом вызове malloc

Что спросят дальше

Связанные вопросы

Партнёр платформы

Разбор собеседования с sotto

После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.

Разбор собеседования