Да, в современных операционных системах существует отдельная куча для каждого процесса. Между прочим, существует не просто отдельный стек для каждого процесса, но есть отдельный стек для каждого потока в процессе. Таким образом, процесс может иметь множество независимых стеков.
Но не все операционные системы и не все аппаратные платформы предлагают эту функцию. Вам нужен блок управления памятью (аппаратно), чтобы это работало. Но настольные компьютеры имеют эту функцию с тех пор ... ну ... некоторое время назад ... 386-CPU? (оставьте комментарий, если вы знаете лучше). Однако вы можете оказаться на каком-то микропроцессоре, который не имеет этой функции.
В любом случае: ограничение размера кучи в основном ограничено операционной системой и оборудованием. Аппаратные ограничения особенно из-за ограниченного количества адресного пространства, которое это позволяет. Например, 32-битный процессор не будет обрабатывать более 4 ГБ (2 ^ 32). Процессор, который имеет расширения физических адресов (PAE), который поддерживают текущие процессоры, может адресовать до 64 ГБ, но это делается с помощью сегментов, и один отдельный процесс не сможет использовать эту функцию. Он всегда будет видеть 4 ГБ макс.
Кроме того, операционная система может ограничивать объем памяти по своему усмотрению. В Linux вы можете видеть и устанавливать ограничения с помощью команды ulimit
. Если вы выполняете некоторый код не изначально, а, например, в интерпретаторе / виртуальной машине (такой как Java или PHP), то эта среда может дополнительно ограничить размер кучи.