Что такое виртуальная память?
- Зачем процессу виртуальные адреса?
- Что такое страница памяти и 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 минут бесплатно.