LINUX.ORG.RU

fork или ?


0

0

У меня есть прога от которой форкается куча мелких прожек. Но в главной проге порятка 5 метров переменных и они нафиг не нужны в процессах детях. Так вот кто знает как мне избавитсяот этих 5 метров в childah ?

anonymous

так, типа, освобождать при успешном создании в каждом дочернем процессе.

stormbringer
()

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

anonymous
()

Применяешь механизм fork-and-exec то есть отделяешь код child'а в маленькую прогу и после fork'а делаешь exec ее.

fire
()

?? Когда выполняется системный вызов fork -- порождённый процесс наследует _весь_ контекст процесса родителя. Собственно потомок отличается от предка только возращённым значением системного вызова. А вот вызвав ехес можно заместить контекст порожденного новым контестом... Можно разве что действительно освободить динамические переменные !

anonymous
()

После exec-а весь сегмент данных будет заменен. Никаких старых динамических структур не останется и в помине.

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

сам же написал "мне на фиг не нужны". Если нужны то можно их передать через shared memory то есть будет процесс родитель отображать в shared memory нужные структуры а смещение передашь через FIFO потом приведешь к тому что тебе нужно, будешь жить при певаючи. :-))

fire
()

Эти "5 метров переменных" никак не мешают. Благодаря механизму copy-on-write, в потомке(ах) эти переменные не займут дополнительной памяти, если только ты не начнешь изменять их. Попытка освободить динамически выделенную память в потомке не только бесполезна, но и вредна. Бесполезна, т.к. free() не возвращает память системе. Вредна, т.к. при освобождении памяти ты изменишьь copy-on-write страницы и система создаст их копию, отняв физическую память.

Можно делать exec(),который заменит все адресное пространство потомка, но смысла в этом особого нет, ибо ничего на этом выиграть не удастся. Правильное решение -- оставить эти переменные как есть и забыть про них с легким сердцем.

dg
()

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

fire
()

можно clone() юзать с флагом CLONE_VM - в мане подробно все описано

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