POSIX rlimit: Что именно мы можем предположить о RLIMIT_DATA?

Prequisites

POSIX.1 2008 определяет setrlimit() а такжеgetrlimit() функции. Различные константы предоставляются дляresource Аргументация, некоторые из которых воспроизведены ниже для более легкого понимания моего вопроса.

Определены следующие ресурсы:

(...)

RLIMIT_DATA

Это максимальный размер сегмента данных процесса в байтах. Если этот предел превышен, функция malloc () должна завершиться с ошибкой, установленной в [ENOMEM].

(...)

RLIMIT_STACK

Это максимальный размер стека исходного потока в байтах. Реализация не увеличивает стек автоматически за этот предел. Если этот предел превышен, для потока должен быть сгенерирован SIGSEGV. Если поток блокирует SIGSEGV, или процесс игнорирует или перехватывает SIGSEGV и не принял меры для использования альтернативного стека, расположение SIGSEGV должно быть установлено в SIG_DFL, прежде чем он будет сгенерирован.

RLIMIT_AS

Это максимальный размер общей доступной памяти процесса в байтах. Если этот предел превышен, функции malloc () и mmap () должны завершиться с ошибкой, установленной в [ENOMEM]. Кроме того, автоматический рост стека завершается неудачей с эффектами, описанными выше.

Кроме того, POSIX.1 2008определяет сегмент данных как это:

3.125 Сегмент данных

Память, связанная с процессом, который может содержать динамически распределяемые данные.

Я понимаю чтоRLMIT_DATA ресурс традиционно использовался для обозначения максимального объема памяти, который может быть назначен процессу сbrk() функция. Последние выпуски POSIX.1 больше не определяют эту функцию, и многие операционные системы (например, Mac OS X) не поддерживают эту функцию как системный вызов. Вместо этого он эмулируется с вариантомmmap() который не является частью POSIX.1 2008.

Вопросы

Я немного запутался по поводу семантики и использованияRLIMIT_DATA ресурс. Вот конкретные вопросы, которые у меня есть:

Может ли стек быть частью сегмента данных в соответствии с этой спецификацией?

Стандарт говорит оRLIMIT_DATA: «Если этот предел превышен, функция malloc () должна завершиться с ошибкой, когда errno установлено в [ENOMEM]». Означает ли это, что память выделена с помощьюmalloc() должен быть частью сегмента данных?

В Linux память выделяетсяmmap() не учитывается в сегменте данных. Только память, выделенная сbrk() или жеsbrk() является частью сегмента данных. Последние версии glibc используютmalloc() реализация, которая выделяет всю свою память сmmap(), ЗначениеRLIMIT_DATA таким образом, не влияет на количество памяти, которое вы можете выделить с помощью этой реализацииmalloc().

Это нарушение POSIX.1 2008?

Другие платформы демонстрируют подобное поведение?

Стандарт говорит оRLIMIT_AS: «Если этот предел превышен, функции malloc () и mmap () должны завершиться с ошибкой, установленной в [ENOMEM]. Как провалmmap() не указан дляRLIMIT_DATAЯ пришел к выводу, что память, полученная изmmap() не учитывается в сегменте данных.

Это предположение верно? Это относится только к не POSIX вариантамmmap()?

Ответы на вопрос(1)

Ваш ответ на вопрос