Ответ
Виртуальная память — это абстракция, предоставляемая операционной системой, которая позволяет процессам работать с большим, непрерывным адресным пространством, не зависящим от фактического объема физической оперативной памяти (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 и она активно сбрасывает страницы на диск, производительность резко падает.