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

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

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

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

Ответы [ 3 ]

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

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

0 голосов
/ 31 августа 2011

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

0 голосов
/ 31 августа 2011

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

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

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

...