Максимальный используемый объем памяти в конфигурации x86? - PullRequest
0 голосов
/ 24 апреля 2020

Я построил проект на основе языка C с конфигурацией x86, и если я поместил около 3 ГБ стека, это привело к неправильной работе или неправильному результату.

Каков максимальный объем используемой памяти в конфигурации x86?

(Среда разработки имеет достаточно памяти; Windows 64 бит, 16 ГБ ОЗУ.)

Ответы [ 2 ]

1 голос
/ 25 апреля 2020

В 64-разрядном ядре 32-разрядный процесс может использовать все виртуальное адресное пространство 4 ГБ, за вычетом накладных расходов, если он построен как исполняемый файл с поддержкой больших адресов. В противном случае только 2 ГБ.

Это не включено по умолчанию для сравнения с кодом, который делает небезопасные предположения . Разработчик должен передать флаг компоновщику при сборке исполняемого файла. Флаг /LARGEADDRESSAWARE для MSV C и --large-address-aware для MinGW.

Когда в 32-разрядной версии Windows с включенным переключателем / 3GB работает программа с поддержкой больших адресов, она сможет отображать не более 3 ГБ виртуального адресного пространства (оставшиеся 1 ГБ зарезервированы для ядра). Однако в 64-разрядной системе Windows она должна быть в состоянии отобразить все 4 ГБ, за исключением некоторых накладных расходов.

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


Без учета большого адреса , 32-разрядная программа, работающая на Windows (32-разрядная или 64-разрядная), по умолчанию будет иметь только 2 ГБ виртуального адресного пространства, независимо от того, сколько виртуального адресного пространства будет доступно Windows после вычитания. Использование адреса ядра и прочие накладные расходы.

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

Исторически сложилось, что 32-битный Windows использовал разделение виртуального адресного пространства 2G: 2G между ядром и пользовательским пространством. Некоторые программы могут зависеть от разницы между двумя указателями на разные объекты, помещающиеся в целое положительное целое со знаком, или других предположений, которые не гарантируются ISO C, и LAA сломается. Поддержка большого адреса обеспечивает обратную совместимость с такими программами. ( Недостатки использования / LARGEADDRESSAWARE для 32-битных Windows исполняемых файлов? )

0 голосов
/ 24 апреля 2020

Ваша проблема не в объеме используемой памяти в windows. Вы запросили 3Gb только для стека (не памяти, а только стека). Это очень редко.

Например, обычное ограничение на FreeBSD (не windows) для стека процессов таково:

$ ulimit -a
number of pseudoterminals            (-P) unlimited
socket buffer size       (bytes, -b) unlimited
core file size          (blocks, -c) unlimited
data seg size           (kbytes, -d) 33554432
file size               (blocks, -f) unlimited
max kqueues                     (-k) unlimited
max locked memory       (kbytes, -l) unlimited
max memory size         (kbytes, -m) unlimited
open files                      (-n) 230121
pipe size            (512 bytes, -p) 1
stack size              (kbytes, -s) 524288     <<<<<<<<<<<<<<<
cpu time               (seconds, -t) unlimited
max user processes              (-u) 12042
virtual memory          (kbytes, -v) unlimited
swap size               (kbytes, -w) unlimited

Как видите, стек ограничен системой до 524288 килобайт, так что, вероятно, в этой системе также произойдет сбой.

Обычно в вашей системе возникают проблемы с выделением такого количества памяти для стека. Все операционные системы ограничивают

. Подумайте, что обычно для стека на процесс установлено ограничение порядка 10 МБ ... поэтому у вас, вероятно, возникли некоторые проблемы с проектированием.

Что вы используете такое количество стеков в вашей программе?

(Извините, у меня нет машины windows для проверки этого, и я не знаю, как проверить максимальную сумму, разрешенную для сегмента стека)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...