POSIX rlimit: Что именно мы можем предположить о RLIMIT_DATA?
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()
?