🚀
В 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 в целом.
Обсуждение 0
Обсуждение не доступно в веб-версии. Чтобы написать комментарий, перейдите в приложение Telegram.
Обсудить в Telegram