LINUX.ORG.RU

Управление памятью


0

0

Есть приложение, которое берет 8гб памяти при помощи malloc. В этом блоке памяти создаются элементы динамического массива, однако не факт что за время всей своей работы приложение создаст весь массив, скорее всего этого не произойдет и только в худшем случае все 8 гб будут заняты. А так как известно что физически память выделяется только при обращении к областям которые выделил malloc то и реальный резидентный размер приложения будет не 8гб а в среднем 1 гб

Исходя из последнего можно на системе запустить 4 копии такого приложения или нет если в системе памяти 4+8гб(своп)? Судя по резидентным размерам да, однако если сложить размеры выделяемые программе то нет. Вопрос 1 - влезут 4 копии при резидентном размере 1 гб или нет?

Если да то как они выпадут если суммарный резидентный размер начнет превышать суммарный допустимый объем памяти (ведь прогам выделено по 8гб которые им не запрещено юзать и то что они юзают лишь 1/8 этого места статичтическая случайность), здесь я имею ввиду какой сигнал сгенерирует сислема или какие иные действия произведет ОС. Меня смущает то что если malloc ине память выделил то я гарантированно могу её использовать.

Если нет то правильноли я думаю что второй проге уже не дадут запуститься, в смысле повторное затребование mallocom 8гб когда 8гб уже выделено при суммарном допустимом 12гб уже невозможно? Тут меня смущает то что при таком подходе память просто тратиться в пустую размер виртуальной памяти и резидентный размер существенно разные вещи все же и в этом случае не совсем понятны причины того что реальная память (страница) выделяется при первом обращении.

Короче кто знает ПОЧЕМУ так или иначе поясните плиз (интересует Unix в общности и Linux, Free/OpenBSD в частности)

anonymous

>Есть приложение, которое берет 8гб памяти при помощи malloc.

ты уверен что malloc на твоей машине сможет выделить такой обьем памяти? У тебя 64-битная система?

реально malloc память не выделяет а выделяет адресное пространство. а память выделяется ядром по мере необходимости.

тоесть на Linux при включеном overcommit на твоей конфигурации ты реально сможеш запустить четыре экземляра приложения с 1G используемой рамы в каждом приложении. при выключеном оверкомите - не сможеш.

по другим осям не подскажу кроме одного момента - 32битные платформы не смогут обеспечить тебя 8Gb адресов.

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

Я собственно уже по умолчанию считаю что система 64 (AMD Athlon 64 X2) про 32 вопрос тоже интересен но там естесно объемы надо брать поменьше (ну 3гб при 2+4гб(свопа) хотя это помоему ничего не меняет).

То что malloc выделяет адресное пространство я в курсе, я вот и хочу понять - если мне выделено адресное пространства на 8гб то я ведь могу его использовать все? могу! А могу и не все. Но главное что гарантированно могу (или тут я не прав и malloc возвращает гипотетическое нечто?). Так вот что будет если у меня невкольким программам выделено много адресного пространства но используют они его мало? Вы говорите влезут, а что весли вдруг они начнут разбухать и использовать много пространства (читай памяти) пока последняя просто не кончиться??? Какие действие предпримет система и как они будут видны в программе (Я хочу обработать подобную ошибку): я просто получу сегфолт, сигнал какой или исключение в С++?

Ну вот есть такое:
class object {...};
.....
void* ptr = calloc(sizeof(test), 100000000);
.....
object* obj = new(ptr) obj();
......
object* obj20000000 = new(obj+20000000) obj();

Вот последнее может не сработатет если тупо память кончится. Как я об этом узнаю? или не как? На сколько мне известно в С++ аллокаторы размещения new() исключения bad_alloc() не генерят, если адрес размещения является валидным в виртуальном адресном пространстве процесса (то есть выделен mallocm или подобными)

И переживет ли система такие фокусы? в смысле сумеет сама восстаноиться после исчерпания памяти или нет? (FreeBSD, Linux но особо интересно знать про первую)

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

man malloc на Linux нам как-бы говорит

BUGS
By default, Linux follows an optimistic memory allocation strategy. This means that when malloc() eturns non-NULL there is no guarantee that the memory really is available. This is a really bad bug. In case it turns out that the system is out of memory, one or more processes will be killed by the infamous OOM killer. In case Linux is employed under circumstances where it would be less desirable to suddenly lose some randomly picked processes, and moreover the kernel version is sufficiently recent, one can switch off this overcommitting behavior using a command like:

# echo 2 > /proc/sys/vm/overcommit_memory

so the kernel Documentation directory, files v/overcommit-accounting and sysctl/vm.txt.



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

Я помоему везде имеющуюся память указывал с учетом свопа или я чего не по русски изложил?

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

> Я помоему везде имеющуюся память указывал с учетом свопа или я чего не по русски изложил?

не знаю. я не осилил, много букв.

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

Ладно, в остатке своп учитываем. Что будет на фряхе? Работать будет на ней а доступа к оной пока нет...

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

при нехватке памяти тебя убьют сигналом. перехватить сигнал нельзя. если надо обработать то вырубаеш оверкомит и увеличиваеш свап до нужных размеров.

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

> при нехватке памяти тебя убьют сигналом. перехватить сигнал нельзя. если надо обработать то вырубаеш оверкомит

Это же специфично для Линукса, разве нет?

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

Т. е. при включенном оверкомите malloc мне ничего не скажет а если памяти не хватит то меня просто укокошат, без особых последствий для системы так?

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

yes, thanks.

to be precise, oom-killer can kill another task, and VM_FAILT_OOM doesn't always imply out_of_memory(), but I was wrong anyway.

if handle_mm_fault() returns VM_FAULT_OOM, do_page_fault() just exits.

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

> Т. е. при включенном оверкомите malloc мне ничего не скажет а если памяти не хватит то меня просто укокошат, без особых последствий для системы так?

_скорее_всего_ укокошат твой процесс, кушающий память, но может быть не первым. Так что не факт, что система будет работать штатно после такого.

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