Разве разные программы получают свою память из общей кучи или из отдельной кучи?

Я немного смущен, как glibc on linux выделяет свою память для различных программ. Это несколько вопросов:

  1. Является ли он выделен из общей кучи (т. Е. Существует общая куча всех процессов в Linux) или есть одна куча, выделенная для каждого процесса в системе.

  2. Также предположим, что я компилирую одну статическую библиотеку и, наконец, статически привязан к основному процессу, как он получит свою память? Это уже связано с какой-то другой кучей (как мы ее уже скомпилировали) или получит свою память из кучи основного процесса.

  1. В смысле libc нет общей кучи – это нарушит правила защиты процессов и виртуальной памяти. Каждый процесс сохраняет свою собственную кучу. Ядро (с помощью MMU в процессоре) поддерживает таблицы виртуальной памяти, которые отображают виртуальные адреса в реальной памяти.

  2. Статические библиотеки – это не что иное, как связывание кода во время компиляции – нет концепции времени статической библиотеки. Это одно и то же, что и процесс, и будет использовать свою кучу.

Каждый процесс имеет свою собственную виртуальную кучу. Однако он может обмениваться физической оперативной памятью или нет, в зависимости от доступа. Дополнительную информацию см. В разделе « Копирование на запись» .

Куча (и любая другая записываемая память – стек, BSS и т. Д.) Является отдельной для каждого процесса. В рамках процесса память может быть разделена между streamами, и может быть не так (в случае локального хранилища streamов). Это верно для вновь созданных приложений. Для fork -ed приложения память делится до тех пор, пока ни один из них не начнет запись (copy-on-write).

Любая доступная только для чтения память (например, разделяемая библиотека или запуск одного и того же приложения несколько раз), вероятно, будет разделяться между процессами. Это решение для исполняемого загрузчика ядра.

Статическая библиотека напрямую связана с исполняемым файлом, поэтому для каждого исполняемого файла есть отдельная копия (если только это несколько экземпляров одного и того же исполняемого файла).