Текущее 64-битное ядро Linux имеет ограничение в 64 ТБ физической ОЗУ и 128 ТБ в виртуальной памяти (см. Ограничения RHEL и Порт Debian ). Текущие процессоры x86_64 (т. Е. То, что у нас в ПК) имеет (виртуальный) предел адреса 2 ^ 48 = 256 ТБ из-за того, как регистр адреса в ЦП использует все биты (верхние биты используются для флагов страниц, таких как ReadOnly, Writable, ExecuteDisable, PagedToDisc и т. Д. В таблице страниц), но спецификация позволяет переключаться в режим истинного 64-битного адреса, достигая максимума при 2 ^ 64 = 16EB (в байтах). Тем не менее, материнская плата и центральный процессор имеют не так много контактов для доставки всех 48 бит адреса памяти к микросхеме ОЗУ через адресную шину, поэтому предел физической памяти ниже (и зависит от производителя), но виртуальный адрес пространство по своей природе может превышать объем ОЗУ, который может быть на материнской плате, до ограничения виртуальной памяти, указанного выше.
Ограничение на процесс увеличивается в зависимости от того, как установлено виртуальное адресное пространство памяти для процесса, потому что могут быть разные размеры для стека, области mmap () (и динамических библиотек), самого программного кода, а также сопоставления ядра. в пространство процесса. Некоторые из этих настроек могут быть изменены путем передачи аргумента компоновщику, иногда с помощью специальной директивы в исходном коде, или путем непосредственного изменения двоичного файла с помощью программы (двоичный файл имеет формат ELF). Также существуют ограничения, которые установил администратор компьютера (root) или пользователь (см. Вывод команды "ulimit -a"). Эти ограничения могут быть мягкими или жесткими, и пользователь не может преодолеть жесткий лимит.
Также ядро Linux может быть настроено так, чтобы разрешать чрезмерное выделение памяти. В этом случае программе разрешается выделять огромный объем оперативной памяти, а затем использовать только несколько страниц (см. Разреженные массивы, разреженная матрица), см. документация по ядру Linux . Таким образом, в этом случае программа завершится с ошибкой только после заполнения запрошенной памяти данными, но не во время выделения памяти.