Ограничение памяти для 32-разрядного процесса, работающего в 64-разрядной ОС Linux - PullRequest
13 голосов
/ 22 февраля 2011

Сколько виртуальной памяти может иметь 32-битный процесс в 64-битном Linux (т. Е. Сколько памяти я могу выделить и использовать с malloc() до того, как я получу указатель NULL)?

Я попробовал это на моем 32-битном Linux и достиг предела около 3 ГБ.Смогу ли я получить больше информации о 64-битном Linux?

Ответы [ 4 ]

26 голосов
/ 22 февраля 2011

В стандартном 32-битном ядре x86 smp каждый процесс может использовать 3 ГБ адресного пространства 4 ГБ, а 1 ГБ используется ядром (совместно используемым в адресном пространстве каждого процесса).

С 4G/ 4G разделяет 32-разрядное ядро ​​x86 типа "mememem ", каждый процесс может использовать (почти) все 4 ГБ адресного пространства, а ядро ​​имеет отдельное 4 ГБ адресного пространства.Это ядро ​​поддерживалось Red Hat в RHEL 3 и 4, но они удалили его в RHEL 5, потому что патч не был принят в основное ядро, и большинство людей все равно теперь используют 64-битные ядра.

С 64-битное ядро ​​x86_64, 32-битный процесс может использовать все адресное пространство 4 ГБ, за исключением пары страниц (8 КБ) в конце адресного пространства 4 ГБ, которые управляются ядром.Само ядро ​​использует часть адресного пространства, которая находится за пределами 4 ГБ, доступной для 32-битного кода, поэтому это не уменьшает адресное пространство пользователя.64-разрядный процесс может использовать гораздо больше адресного пространства (128 ТБ в RHEL 6).

Обратите внимание, что часть адресного пространства будет использоваться программным кодом, библиотеками и пространством стека, поэтому вы не будетебыть в состоянии malloc() все ваше адресное пространство.Размер этих вещей зависит от программы.Посмотрите на /proc/<pid>/maps, чтобы увидеть, как адресное пространство используется в вашем процессе;сумма, которую вы можете malloc(), будет ограничена наибольшим неиспользованным диапазоном адресов.

2 голосов
/ 20 февраля 2014

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

1 голос
/ 22 февраля 2011

32-разрядный процесс сможет получить доступ только к 4 ГБ виртуальной памяти независимо от ОС. Это связано с тем, что процесс может отображать только 32-битные адреса памяти. Если вы подсчитаете, вы увидите, что 32-битные адреса могут иметь доступ только к максимум 4 ГБ, даже если вы работаете на 128-битной ОС.

0 голосов
/ 22 февраля 2011

В 64-битной Linux максимальный объем памяти для одного процесса составляет 2 ^ 48 байт. (Теоретически, возможно большее, но современные микросхемы не позволяют использовать все виртуальное адресное пространство размером 2 ^ 64 байта.)

См. Википедия для получения дополнительной информации.

...