LINUX.ORG.RU

доступная память


0

0

Здравствуйте. Как можно узнать, сколько памяти может взять прога у системы? Т.е. есил я знаю, что проге нужно 300 метров, но они будут использоваться и выделяться по-разному, и если столько памяти мне система не даст - то сразу выйти с ошибкой. Каким образом это можно сделать? Или еще лучше, как узнать сколько можно взять памяти? В зависимости от этого менять алгоритм

anonymous
Ответ на: комментарий от SatanClaus

Память юзается под разные цели. Как то потоки, отедльные структуры данных. В основном тратится на создание потоков

anonymous
()

может попытацца так (опытным путем)

void* ptr;
start = 1024 * 1024 * 1024; //гигабайт
end = 1024 * 1024; // мегабайт

mem = start;
while ((ptr = malloc(mem)) != NULL) {
mem = mem / 2;
}

kpblca
()
Ответ на: комментарий от kpblca

ерунда.

точнее ИНОГДА это работает но крайне редко

если ты начнёш ф-ю main() этой ерундой то malloc на абсолютном большинстве систем НИКОГДА не вернёт NULL даже если доступной памяти осталось 1 байт

cvv ★★★★★
()

Это Frequently Unanswered Question ;-)
На самом деле в многопользовательской, мультизадачной операционной
системе этот вопрос не имеет практического смысла. Если даже в
какой-то момент ты сможешь определить, сколько система выделила
бы тебе памяти нет никаких гарантий, что последующий твой запрос
на память будет успешным - мало ли какой еще процесс запросил память.
Поэтому не парься - просто запрашивай память по потребности.


Onanim
()
Ответ на: комментарий от Onanim

да и ещё нюанс. В твоём случае память целесообразней запрашивать через mmap(MAP_ANONYMOUSLY) вместо malloc() и иже с ним.

cvv ★★★★★
()
Ответ на: комментарий от cvv

Чем это лучше? Ну вообще предпологается, чт на системе основная задача - моя, поэтому я думал определить макс кол-во доступной памяти, вычесто оттуда метров 200, и вперед

anonymous
()
Ответ на: комментарий от anonymous

этот вопрос действительно так часто задается, что
я уже устал отвечать.

Onanim все правильно сказал. могу только добавить,
что есть флаг MAP_LOCKED (или можете сделать mlock
после mmap). другого способа _гарантированно_ получить
память в многопользовательской среде нет.

если sysctl_overcommit_memory == OVERCOMMIT_NEVER,
то вы можете более или менее рассчитывать на то,
что выделенная через mmap (без MAP_LOCKED) память
действительно для вас найдется в момент использования.
но и в этом случае нет гарантий что администратор
не сделает swapoff или кривой драйвер не заберет
себе всю память в системе.

idle ★★★★★
()
Ответ на: комментарий от cvv

> да и ещё нюанс. В твоём случае память целесообразней запрашивать через mmap(MAP_ANONYMOUSLY) вместо malloc() и иже с ним.

У меня есть серьезные подозрения, что на всех современных юниксах malloc больше определенного порога работает на mmap, а не на brk. Это совершенно точно так на FreeBSD - я давеча проверял. Порог - что-то в районе десятков или сотен килобайт, это уже запямятовал.

anonymous
()
Ответ на: комментарий от anonymous

glibc под linux именно так себя и ведёт, порог насколько я знаю настраиваемый. В последних OpenBSD malloc ВСЕГДА напрямую транслируется в mmap.

насколько я понимаю непосредственное использовани mmap более гибко чем использование malloc(), но malloc при небольших обьёмах ~1K существенно более быстр.

cvv ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.