Получить доступ

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

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

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

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

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

Так подсказку видит пользователь sotto на живом собеседовании — за пару секунд, пока вы думаете вслух.

Подробно

Программа работает с виртуальными адресами. Блок управления памятью процессора (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 реальным потреблением памяти.

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

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

Закрытая бета

Подсказки на собеседовании — в реальном времени

sotto слышит вопрос интервьюера и показывает короткий ответ и план, как в блоке «Коротко». Оставьте контакт — пришлём доступ и промокод.

  • Промокод на 2 часа — сверх пробных 30 минут
  • Программа для Windows — скачать сразу, войти — через Яндекс ID или VK ID
  • Прямая связь с разработчиком: что улучшить — сделаем