Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

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

Ответ 3

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

Ответ 4

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

Подробнее см. Wikipedia.