LINUX.ORG.RU

Так как сейчас правильно выделять память в приложении?

 


1

6

По мотивам треда про calloc Calloc нынче ни на что не влияет что-ли? Без философий о том, кто ламер, кто не ламер и понимает современные технологии.

Чисто на практике. Хочется, чтобы:

Программа в процессе работы ГАРАНТИРОВАННО не падала от нехватки памяти при ее выделении и ее не прибивал OOM Killer (по крайней мере просто из-за выделения памяти), то есть, если в процессе работы обнаруживается ее нехватка, она могла бы сообщить об этом пользователю. Или хотя бы корректно завершиться, сохранив текущие данные.

Согласитесь, пользователь, которого вся эта философия оверкомитов, страниц памяти и настроек OOM Killer не волнует, вправе ожидать такого корректного для себя поведения программы. Ему просто хочется, например, редактировать видео и если он допустим при этом перебрал с чем-то жрущим память (например, слишком ресурсоемкий фильтр выбрал), получил сообщение об этом и продолжил работу.

Как правильно для этого работать с памятью? Естественно хотелось бы при этом, по-возможности, попроще и поуниверсальнее.

И если этого фактически невозможно достичь на современной системе, что-то тут сильно не так. Ну не нормально это, когда работаешь с какой-то софтиной и вдруг она бабах и не сказав худого слова упала только потому что какая-то функция не вписалась в объем, потому что параллельно запущенный браузер сожрал всю память или просто потому что не умеет предупреждать о нехватке ресурсов.

rustonelove

★★★★★

Последнее исправление: praseodim (всего исправлений: 4)
Ответ на: комментарий от Reset

С твоего незнакомства с матчастью, увы.

Эта тема по эпичности скоро будет похожа на легендарную «взлетит или не взлетит».

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

Две темы это уже обсуждали. И уже множество лет в подобных темах.

Самый правильный способ это выделить буфер константного размера на старте программы

Из того, что выделил какой-то «буфер», которого не существует - из этого ничего не следует. Никакого буфера нет. Ты выделил пустоту константного размера, в которой 0памяти. И память там будет появляться по мере использования.

А это значит, что в любой момент ты можешь словить oom.

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

Неважно что такое жава. Я уже объяснил в чём заключается подмена понятий. Когда мы сравниваем какую-то жаву с процессами, то мы не можем сравнивать жаву с процессами. Мы можем сравнивать только жвм, а жвм такая же программа, которая работает с той же системой и по таким же принципам, как и всё остальное.

По поводу «Падает, но не падает» - тебе уже привели пример с виртуалкой. Оно падает в рамках «процесса» жвм, а не в рамках процесса ОС. При этом точно так же оно может падает и в рамках процесса, но это можно обрабатывать, а не падать. При этом самой жвм ничего падать не мешает.

Поэтому «не падает» жабки распространяется только на внутреннюю логику жвм, а не на самом процесс, который крутиться. Аналогичное работает и для всего остального.

Но опять же - это абсолютно убогое сравнение т.к. жава - это дерьмо. Оно не может существовать само по себе, оно не может обладать теми возможностями, что даёт то, что может падать. Ну и самое главное - то, что может точно так же падать есть и в жаве - это сама жава, которая ничем не отличается от любой другой программы.

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

Оно не может существовать само по себе, оно не может обладать теми возможностями, что даёт то, что может падать. Ну и самое главное - то, что может точно так же падать есть и в жаве - это сама жава, которая ничем не отличается от любой другой программы.

Спасибо, наконец-то я все понял.

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

С чего бы это? Это самый рабочий способ.

Этот способ ровно никак не отличается от выделения большого буфера после долгой работы программы.

tailgunner ★★★★★
()
Последнее исправление: tailgunner (всего исправлений: 1)
Ответ на: комментарий от Reset

С чего бы это? Это самый рабочий способ.

Так из-за таких удаков и сделали оверкоммит. Все так или иначе берут впрок большие куски и потом с ними ничего не делают. Например, ff держит раза в 4-6 больше анонимной памяти чем использует. Проблему подогревают многопоточные приложения.

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

По этой теме сразу возникает вопрос. Допустим, в программе создаются и удаляются энное количество объектов. В процессе выясняется, что возникла высокая фрагментация. И как обычно с этим борятся: на уровне архитектуры аппы или всё применяются какие-то негласные правила?

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

По этой теме сразу возникает вопрос ... возникла высокая фрагментация. И как обычно с этим борятся ...?

А как ты борешься с фрагментацией в обычной куче? Статический буфер тут новых проблем не прибавляет, даже наоборт - избавляет от них т.к. обычно в подобном варианте буфер партиционируется сразу под все виды объектов (в пулы объектов или чанков определённого размера) и дальнейшего перераспределения памяти между ними не происходит.

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

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

Ну и что тебе из этого кода не понятно, овощ?

Раскудахтался? Ну вот, ты там же кукарекал о том, что «сделали оверкоммит» - найди мне так «сделанный оверкоммит». Я знаю - ты сможешь.

rustonelove
()

Реально на второй круг пошли? Дали же уже советы дельные

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

Эту проблему не надо решать. Надо просто заранее создать все возможные объекты в нужном количестве, а в процессе работы переводить их из спящего состояния в активное и наоборот.

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

Или выделять их в memory pool по мере надобности

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

В процессе выясняется, что возникла высокая фрагментация.

С этим есть так же много нюансов. Почему вообще берётся фрагментации в хипе? Откуда? Я тебе отвечу - от строк. Ничто другое в 95% случаев хип не фрагментирует.

И как обычно с этим борятся: на уровне архитектуры аппы или всё применяются какие-то негласные правила?

С этим никто не борется в подавляющем большинстве случаев. Вот мы много раз слышали от балаболов то, что строки типа «бесплатные» и никаких проблем нет.

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

И тут сразу видна некая глобальная, фундаментальная проблема - нельзя решить поставленную тобою задаче на поставленном тобою уровне. Это не задача организации памяти и работы с нею - это задача архитектуры над нею.

На уровне же памяти(реализации) эта задача нерешаема. А когда она решена «свыше» - её не надо решать на уровне ниже. На уровне ниже уже решенную задачу можно запороть, но это такое.

rustonelove
()

Никак. Есть ulimit чтобы отдельный процесс не выжирал всю память, и есть mlock чтобы память не выгружалась в swap (требующих соответствующих привилегий). Больше ничего сделать нельзя. Никакие заранее-выделения-памяти не помогут, поскольку они будут вытеснены в swap, а потом приложение будет убито при попытке к ним обратиться, когда памяти куда их можно было бы загрузить не будет. Это плата за универсальность и производительность системы, в том числе за экономию памяти.

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

И в нужный момент скажет русским языком, «в системе не хватает памяти, закройте ненужные приложения».

мегеге, точно так же молча пристреливается, проверено электрониками (с)

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