🚀 В Linux каждый процесс живёт в своей версии памяти.

Два разных приложения могут одновременно использовать один и тот же адрес, например 0x555555..., но попадать при этом в совершенно разные места физической RAM.

Почему так?

Потому что процесс видит не настоящую физическую память, а virtual address space - виртуальное адресное пространство.

Когда программа делает malloc, она получает адрес, который выглядит как обычный указатель:


int *x = malloc(sizeof(int));
*x = getpid();

printf("PID %d -> virtual address: %p -> value: %d\n",
getpid(), (void*)x, *x);


Если запустить такую программу в двух терминалах, адрес может оказаться одинаковым.

Но это не значит, что процессы пишут в одну и ту же память.

Для каждого процесса ядро и MMU переводят виртуальные адреса в свои физические страницы. Один и тот же виртуальный адрес в процессе A может указывать на один участок RAM, а в процессе B - на другой.

Именно поэтому процессы изолированы друг от друга.

Программа думает:

«Это моя память».

На самом деле Linux говорит:

«Это твоя иллюзия памяти. А куда она реально мапится - решаю я».

Виртуальная память - одна из тех штук, без которых не было бы нормальной изоляции процессов, безопасного multitasking, shared libraries, fork, mmap и современного Linux в целом.
11
🔥 4
👍 1
23 2K

Обсуждение 0

Обсуждение не доступно в веб-версии. Чтобы написать комментарий, перейдите в приложение Telegram.

Обсудить в Telegram