Поскольку это виртуальный адрес, а не физический.
Каждый процесс получает свое собственное адресное пространство (например, 32-разрядная система может позволить каждому процессу иметь свое собственное адресное пространство с полным диапазоном 4G).
Это блок управления памятью, который сопоставляет виртуальные адреса с физическими (и обрабатывает такие вещи, как сбои страниц, если выгруженные страницы необходимо выкупать из вторичного хранилища).
Может помочь следующая диаграмма, каждый раздел представляет блок памяти 4K:
Process A Physical Memory Process B
+-------+ +-------------+ +-------+
0K | |----> 0K | (shared) | <----| | 0K
+-------+ +-------------+ +-------+
4K | |--+ 4K | | <----| | 4K
+-------+ | +-------------+ +-------+
8K | | +-> 8K | | | | 8K
+-------+ +-------------+ +-------+
| : : : : : : : |
| +-------------+ |
| 128K | | <--------+
| +-------------+
+--------> 132K | |
+-------------+
На этой диаграмме вы можете видеть разрыв между адресами виртуальной памяти и адресами физической памяти (а также возможность для процессов совместно использовать блоки памяти). Адреса внизу слева и справа являются виртуальными адресами, которые видят процессы.
Адреса в центральном блоке являются фактическими физическими адресами, где данные «действительно» находятся, а MMU обрабатывает сопоставление.
Для более подробного объяснения fork
(и exec
) вы также можете посмотреть этот ответ .