Ответ 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()
, будет ограничена наибольшим неиспользуемым диапазоном адресов.