2016-08-03 2 views
-1

В приведенной ниже ссылке ответ Sdaz MacSkibbons дает краткий обзор адресного пространства процесса в системах виртуальных адресов.Адресное пространство процесса в системах виртуальных адресов

What happens when a computer program runs?

Теперь предположим, что каждый процесс получает 4 ГБ виртуального адресного пространства. Теперь это означает, что верхние адреса этого виртуального адресного пространства получат стекную часть (предположим, что адрес стека начинается с 0), а адресное пространство снизу будет выделено для текста, данных, глобалов и кучи. Так как размер кучи изменяется, новые распределения malloc будут отображать виртуальные адресные пространства в реальной памяти напрямую или они проверяют, свободны ли/доступны ли ранее выделенные виртуальные адресные страницы в кучу. И как насчет того, нужно ли нам большое количество памяти кучи, например, более 4 ГБ, чем то, как поддерживает процесс?

Заранее спасибо.

+0

Зависит от ОС. Создайте C-программу, используя printf с% p, чтобы распечатать адреса локальных переменных (stacK), по сравнению с выделенными (malloc()) переменными, по сравнению с адресами статических переменных (программных данных), по сравнению с адресами функций (указатель на функцию) .... Часть виртуального адресного пространства используется для ОС. Также есть некоторые данные, относящиеся к каждому запущенному потоку (например, начальное значение для rand()) (для доступа к этому могут использоваться регистры сегментов FS или GS или их можно отобразить в виртуальное адресное пространство). – rcgldr

ответ

1

Ответ, на который вы ссылаетесь, просто показывает способ, которым можно было бы сделать.

Предполагая, что у вас есть логическое адресное пространство 4 ГБ, не все из них могут быть действительными или даже потенциально действительными виртуальными адресами.

Некоторая часть этого логического адресного пространства будет посвящена системе. Маловероятно, что система будет использовать или приблизиться к использованию всего диапазона логических адресов, посвященных этому.

В логическом адресном пространстве будут отсутствовать другие области, которые не будут иметь действительных логических адресов.

Далее, описание памяти как кучи и стека вводит в заблуждение. Куча и стек - это просто память чтения/записи. В них нет ничего особенного, и операционная система не заботится о том, для чего используется память.

Придумайте разделов программы как существа: - исполняемый файл, только для чтения - Нет казнить, чтение/запись - Нет выполнить, только для чтения

Ваш второй вопрос о таНос. Реализации Malloc управляют пулами памяти чтения/записи. Malloc пытается обработать запрос памяти, возвращая память из пула. Если доступной памяти недостаточно, malloc увеличит размер пула, сопоставив больше виртуальной памяти с логическим адресным пространством.

Если приложениям требуется выделить большие объемы памяти, они обычно не используют malloc. Вместо этого они используют операционные системы. Если у вас есть адресное пространство 4 ГБ, вы не можете выделить блоки размером более 4 ГБ.

Смежные вопросы