У процесса есть одна или несколько задач (запланированных ядром), которые для многопоточного процесса являются потоками процессов (а для не поточного процесса - задачей, выполняющей процесс), и у него есть адресное пространство ( и некоторые другие ресурсы, например дескрипторы открытых файлов).
Конечно, адресное пространство находится в виртуальной памяти. Ядру разрешено обмениваться страницами (например, в зону подкачки вашего диска). Он изо всех сил старается этого избежать (перестановка страниц на диск происходит очень медленно, поскольку время доступа к диску составляет десятки миллисекунд, а время доступа к ОЗУ - десятые доли микросекунды).
текст & bss и т. Д. - это сегменты виртуальной памяти, которые являются отображениями памяти. Вы можете думать о пространстве процессов как о карте памяти. Системный вызов mmap (2) - это способ его изменения. Когда исполняемый файл запускается с помощью системного вызова execve , ядро устанавливает несколько отображений (например, для текста, данных, bss, стека и т. Д.). Системный вызов sbrk (2) также меняет его. Большинство реализаций malloc
используют mmap
(по крайней мере, для достаточно больших зон), а иногда sbrk
.
Вы можете избежать замены диапазона памяти, заблокировав его в ОЗУ с помощью системного вызова mlock (2) , который обычно требует привилегий root. Это редко полезно на практике (если вы не пишете приложения реального времени). Существует также системный вызов msync (для сброса памяти на диск), вы, конечно, можете отобразить часть файла в виртуальную память (используя mmap
), вы можете изменить защиту с помощью mprotect ( 2) , удалите карту с помощью munmap (2) , расширьте отображение с помощью mremap - специфичного для Linux системного вызова-, и вы даже можете перехватить сигнал SIGSEGV
и обработчик это (часто машинным способом). Системный вызов madvise (2) позволяет настроить подкачку с подсказками.
Вы можете понять карту памяти процесса pid 1234, прочитав файл /proc/1234/maps
(или также /proc/1234/smaps
). (Внутри приложения вы можете использовать /proc/self/
вместо /proc/1234/
...) Я предлагаю вам запустить в терминале:
cat /proc/self/maps
, которая покажет вам карту памяти процесса, выполняющего эту команду cat
. Вы также можете использовать утилиту pmap
.
Самые последние ядра Linux предоставляют Рандомизация размещения адресов (поэтому два одинаковых процесса, выполняющие одну и ту же программу на одном входе, имеют разные адреса mmap
-ed & malloc
-ed). Вы можете отключить его через /proc/sys/kernel/randomize_va_space