LINUX.ORG.RU

Что еще можно применить вместо fork()?

 , , memfree,


6

3

Работаю в сфере встраиваемых решений. Есть ситуация, ошибочная, когда с помощью fork() невозможно запустить другую программу из приложения. Ситуация ошибочна потому, что приложение «съело» столько озу, что на fork() места не остается.

Что еще можно применить вместо fork()? Есть ли еще какие-нибудь идеи, мысли, методы запуска программ из программ?



Последнее исправление: beastie (всего исправлений: 1)

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

Не знаю как сейчас (свежьіе версии глибс) но раньше она бьіла прожорливая. Дебиан/убунту втч изза єтого временно мигрировали на eglibc. Но есть вариантьі и по тоньше: прлверкнньі й временем uglibc и новьій и молодежньій (тм) Musl

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

И еще:

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

2. Если у вас 128 метров памяти (если я правильно понял) на железке которая как бьі пренадлежит к категории ембед то єто дофуя. Я конеч но не ембедщик и не знаю вашего софта и тред читал впоперек но странно что ещениуто ни не сказал что софтина написана криво

Все вьіше мое имхо

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

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

Бизнес продавца таких железок - лицензия и софтверная поддержка образа системы.

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

Что бы слезть с «иглы» такого разработчика, надо сделать свою железку. Плюс ее надо отладить и что бы ее надежность была 24/7, * срок гарантии - не менее 5 лет. А потом так же и сопровождать, когда микросхемы начнут сниматься с производства, глюки в драйверах и т.п.

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

Пример железки http://icp-das.ru/catalog/pac_controllers/linpac/lp-8000-st/51292.html

А вот весь их каталог, чуть ли не на все случаи жизни: http://icp-das.ru/catalog/

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

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

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

немного офтоп: имею схожую ситуацию пишу с напарником «плагин» для системы (железка + софтина под офтопик) производимой 3ими лицами. гемор еще тот

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

Прошу прощение, долго не появлялся на форуме.

Дело в том, что «пожиратель памяти» - это чисто человеческий, интуитивный критерий ;) который для системы Linux не применим.

Если брать пример, который я приводил на первой странице, с отключенным overcommit, то пожиратель памяти = софт, идущий вместе с железкой. Что еще можно применить вместо fork()? (комментарий)

А если вернуться к моему случаю, то, конечно, мой написанный софт.

К тому же четко не ясно, как определить объем ОЗУ, используемый приложением. Т.к. критерий «используемый» к сожалению не определен...

Vic
() автор топика
Ответ на: Результат от Vic

Поэтому, создана программа прослойка, launcher, минимального размера, которая сидит в ОЗУ и запускает процессы, по мере надобности остального комплекса программ. Остальные же программы, выдают этому launcher-у команды на запуск приложений и параметры запуска.

пора мне поспать…

Твоя проблема ведь в _освобождении_ памяти, при чём тут запуск?! Ну назапускает лаунчер 100500 задач, а что дальше? Чем это лучше fork()?

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

жаль, что разработчики кде этим не занимаются

очень много кода, и мало индусов. Юзерам нужны фичи, а памяти и так у всех ≥1Tb.

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

К тому же четко не ясно, как определить объем ОЗУ, используемый приложением. Т.к. критерий «используемый» к сожалению не определен...

всё уже украдено до нас, man OOM Killer

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

emulek, раскройте пожалуйста, что вы хотели сказать свой фразой «man OOM Killer»? Если ничего, то смысла в вашей фразе к сожалению нет.

Vic
() автор топика
Ответ на: комментарий от emulek

про launcher

Вы не правильно поняли суть проблемы про fork(). Тема моего первого поста решена полностью. Прочитайте пожалуйста более внимательно. Если у вас все еще будут вопросы, то готов на них ответить.

Далее, для всех, я делюсь здесь своим опытом. Если Вам данный опыт не нужен, то прошу сюда ничего не постить.

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

К тому же четко не ясно, как определить объем ОЗУ, используемый приложением.

Для начала надо понять что такое память, а потом уже рассуждать. man RSS, так же ман тот же pmap -x.

Дело в том, что «пожиратель памяти» - это чисто человеческий, интуитивный критерий ;) который для системы Linux не применим.

Датычё, вон тебе эмулек выше сказал про ООМ-киллер. Ладно он тоже не знает что это такое, дак вот - давай я тебе объясню. ООМ-киллер это такая херня в линукс, основа которой как раз и пытается ответить на вопрос «кто есть пожиратель памяти?», и представляешь себе - отвечает.

с отключенным overcommit

Никто из вас даже не знает что такое оверкоммит, но вы все любите о нём рассуждать.

А учитывая твои перлы:

Вообще же менеджеры виртуальной памяти законно очень умные программы, т.к. им приходится учитывать разнообразие 100% потребностей всех написанных программ и даже не написанных еще программ. И в них всегда используется тонкая грань компромисса, между скоростью/надежностью/оптимальностью. Потому, если я вижу free = 106 Мб, я прекрасно отдаю себе отчет, что эта цифра может не соответствовать реально доступному ОЗУ для приложения (например, если память сильно фрагментирована и ее перераспределение еще не выполнено, то и 1 Мб может не найтись).

Тебе надо почитать и понять как работает память. Чтобы потом не нести херню, аля «память сильно фрагментирована». Не может там быть фрагментации по определению.

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

Такое ощущение, что ты ещё вчера вылез из доса, прочитал что-то про линукс - нихрена не понял, зато запомнил пару терминов и теперь во всю ими кидаешься.

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

Хм.. в чейнджлоге 3.* смотрел, в 2.6 отбекпортировали?

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

Странный вопрос. Всё это и есть clone() с разными параметрами (и fork тоже).

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

что вы хотели сказать свой фразой «man OOM Killer»?

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

Вы не правильно поняли суть проблемы про fork(). Тема моего первого поста решена полностью.

а... Дык открыли-бы новую тему. А то всплыло из недр нечто годичной давности уже обсосанное, откуда я знаю, где у вас тут свежачок начинается? ☺

Ладно, извиняюсь.

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

Датычё, вон тебе эмулек выше сказал про ООМ-киллер. Ладно он тоже не знает что это такое, дак вот - давай я тебе объясню. ООМ-киллер это такая херня в линукс, основа которой как раз и пытается ответить на вопрос «кто есть пожиратель памяти?», и представляешь себе - отвечает.

да ты прямо пророк!

А можно ещё божественных откровений, но тех, которых я ещё не слышало?

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

Очень надеялся на vfork(), но попробовал, результат тот же.

Vic
() автор топика
Ответ на: комментарий от carb_blog10

carb_blog10, дело не в том как оно должно быть по манам и учебникам, а как получается на практике, в конкретном изделии (изделиях).

Вы дали ссылку на man RSS, на что конкретно вы хотели обратить мое внимание? Если просто на то, что есть man rss, то грош цена вашего обращения.

Тебе надо почитать и понять как работает память

Укажите пожалуйста куда глядеть, одну ссылку в студию, которая по вашему мнению подтвердит Вами сказанное.

Vic
() автор топика
Ответ на: комментарий от emulek

emulek, мы наверное друг-друга не поняли. Вы процитировали мои слова:

К тому же четко не ясно, как определить объем ОЗУ, используемый приложением. Т.к. критерий «используемый» к сожалению не определен...

Ваш ответ на них:

всё уже украдено до нас, man OOM Killer

Как ваши слова коррелируют с моими процитированными?

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

дело не в том как оно должно быть по манам

Дело в том, что ты нулёвая балаболка. Пойди в пхписты - не мучай себя.

а как получается на практике,

Какой практике? Чего практике?

в конкретном изделии (изделиях).

Как всё запущенное, ты не просто нулёвое, ты ещё и форфан несёшь херню, лижбы не обосраться. Какой жопой твоё изделие влияет на дефолтные абстракции ОС?

Вы дали ссылку на man RSS, на что конкретно вы хотели обратить мое внимание?

Конкретно на rss - это конкретное и четкое понятие.

Если просто на то, что есть man rss, то грош цена вашего обращения.

Ты не осилила загуглить/понять что это? Дак это моя, либо твоя проблема? Ты задала свой даунистический и нулёвый говновопрос - я тебе ответил, сказав что конкретно за него отвечает.

Мне за тебя ещё гуглить и думать? Нахрен сюда пришел, коли еле-еле полторы извилины работают и даже гуглить не осилила?

Укажите пожалуйста куда глядеть, одну ссылку в студию, которая по вашему мнению подтвердит Вами сказанное.

Что конкретно подтвердит? Что ты нулёвое ничтожество? Мне не нужна ссылка - я просто смешаю тебя с говном.

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

Я ему должен доказать, что мой ответ это то, что ему надо. При этом даже понять что именно нулёвой обезьяне нереально впринципе, ибо она сама не знает что ей надо.

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

Ваш ответ на них:

Отвечу за него я, т.к. меня один хрен затрут.

Темболее я уже ответил на твой вопрос, шавка. Отвечу ещё раз.

Как ваши слова коррелируют с моими процитированными?

ООМ-киллер умеет четко определять объём ОЗУ используемый любым приложением, так же умеет определять как они его испльзуют, выражая это в своих попугаях и на основе их работает его «евристика» выбора таргета.

Какраз таки rss, но тыж не осилил загуглить.

Твои жалкие:

Т.к. критерий «используемый» к сожалению не определен...

Никто не учитывает, ибо этот выхлоп является тотальным бредом и противоречит реальному миру. У ОЗУ есть конкретный критерий использования.

Т.е. он ответил правильно.

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

Ах да, тебе там нужны были ссылки про погуглить. Гуглить про mmu и там по сноскам/ссылкам вглубь по википедии до просвещения.

Там будут ответы: почему там не фрагментации, почему нет никаких общих памятей у процессов и прочего досовского бреда высраными твоими почти 2-мя извилинами, почему манагер памяти никак не относится к цифре во free. Почему цифра во free всегда верна и почему проецирование твоего недопонимания на систему, с последующим деланьем вида, что ты что-то там понимаешь называя рандомные термины в перемешку с какими-то дефолтными фразами со 2-го курса недовуза является жалким и убогим говном и работает только там, где ты моешь полы, делая вид, что ты можешь что-то кроме мытья полов.

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

И да, что ты копипастишь херню, чтобы обосраться не так явно.

Ты должен копипастить это:

Дело в том, что «пожиратель памяти» - это чисто человеческий, интуитивный критерий ;) который для системы Linux не применим.

Потом прочитать ман ООМ-киллер, узнать его назначение и обосраться. Я за тебя это сделаю, да хотя уже выше сделал. Сделаю ещё раз: ООМ-киллер определяет критерий «пожиратель памяти» в системе линукс и он четко определён.

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

Царь уже написал ядро. И не одно. И написал бы еще, да доктор карандаши отобрал, потому что царь с ними на санитаров кидался.

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

Что-то долго не отвечает. Наверное прям сюда пишет...

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

попробуй при старте зарезервировать память

Свою проблему я решил, сделав, компактный загрузчик см. пост Что еще можно применить вместо fork()? (комментарий).
Далее тут идет лирика, иногда не в тему, как у carb_blog10.

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

К тому же четко не ясно, как определить объем ОЗУ, используемый приложением. Т.к. критерий «используемый» к сожалению не определен...

Ваш ответ на них:

всё уже украдено до нас, man OOM Killer

Как ваши слова коррелируют с моими процитированными?

строго говоря, задача определения «используемой» памяти не имеет решения(точнее решение было-быслишком дорого, а потому бесполезно). На практике применяют эвристические методы анализа использования памяти, на основе которых решается вопрос, какое именно приложение нужно аварийно завершить(если памяти недостаточно). Т.е. если fork() или ещё что-то запрашивает память, а памяти мало, то какое-то приложение снимается. Называется эта подсистема OOM Killer.

Вы хотите свой OOM написать? Удачи. Или чего конкретно вы хотите?

emulek
()
Ответ на: Результат от Vic

или в состав функций самого ядра (ведь процесс init запускается без родителя

call_usermodehelper()

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

Вы хотите свой OOM написать? Удачи. Или чего конкретно вы хотите?

Нет, не хочу.
Свою проблему я решил, сделав, компактный загрузчик см. пост Что еще можно применить вместо fork()? (комментарий)
Тема оставлена до конца года открытой, на случай, если еще будут предложения по запуску процессов, кроме как fork, vfork, clone.
Сижу гуглю про call_usermodehelper(), по подсказки неизвестного коллеги, проходившего мимоходом ;)

Vic
() автор топика
Ответ на: комментарий от carb_blog10

carb_blog10, немного оффтоп.
Под Linux есть что-то подобное, типа vcl в дельфях?
Сразу поясню, что мне не нужен vcl в линуксе, а то еще чего недоброго подумаете :)
Интересует система асинхронного обмена «сообщениями» между компонентами одной программы и между компонентами разных программ, на Си.
libevent, конечно близко, но не достаточно. QT, уже перебор. Могу ли я сам все придумать и сделать - да, конечно.
Однако, благодаря вашей манере общения, может Вы, как опытный зверь, встречали у кого-то другое готовое решение или делали что-то подобное сами?

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


zeromq выглядит как оптимизация работы с сокетами, нежели абстракция до уровня сообщений.
libevent дает абстракцию до файловых дескрипторов и функций обратного вызова.
ИМХО, сокеты, zeromq, libevent - это все для межпрограммного (межпроцессного) обмена.

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

carb_blog10, немного оффтоп.

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

Тонко.

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

Под Linux есть что-то подобное, типа vcl в дельфях?

ДА ты я смотрю прошаренный. Как же я резко задетектил маздайскую балаболку. Молодец.

асинхронного

С этим в детсад.

компонентами

Ну тут уже маздай головного мозга. Конкретных терминов ты не знаешь?

между компонентами разных программ

Ещё лучше.

Могу ли я сам все придумать и сделать - да, конечно.

Сомневаюсь, в противном случае ты бы такую херню не нёс.

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

Подобное чему? Ты бы не сливался на манеру общения, после того, как ты тотально обосрался. Собственно как и шавка чуть выше моего ответа.

Ну давай, мне даже интересно. Можешь ли ты не обосравшись описать, что такое «асинхронного», что такое «обмена «сообщениями»» и что такое «асинхронного обмена «сообщениями»».

Далее, если ты это осиливаешь - попытайся не обосравшись выкатить мне какой-то реальный юзкейс юзанья этой полезности. Хотябы 2-3. Можно один, если уж совсем заклинит.

carb_blog10
()

А почему бы сразу exec() не делать без fork()? Как раз и другую программу запустит, и память освободит от предыдущей в том же процессе :)

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

zeromq выглядит как оптимизация работы с сокетами, нежели абстракция до уровня сообщений.

Ещё раз, перед тем как кидаться всяким говном, высранным твоими 2-мя недоизвилинами - попытайся хотябы ответить на вопрос «что такое сообщение?».

libevent дает абстракцию до файловых дескрипторов

Датычё, прям таки до «файловых дескрипторов»? А на какой абстракции основана эта абстракция?

ИМХО, сокеты, zeromq, libevent - это все для межпрограммного (межпроцессного) обмена.

Подожди, но ты же высирал: «между компонентами одной программы и между компонентами разных программ»?

Хотя скорее всего ты даже обосраёшься объснить что ты имел ввиду, но всё же.

Ладно, повторю вопрос: Зачем нужно юзать «сообщения»? Я вот немогу найти им применение, возможно твои потуги слишком гениальны, чтобы я их понял - объясни.

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

carb_blog10, Вы, конечно, ответили конкретику: «Я вот не могу найти им применение».
Но не ответили на вопрос «Может Вы, как опытный зверь, встречали у кого-то другое готовое решение или делали что-то подобное сами?».

Удостоите ответом? В других же ветках вы по делу пишите.

Ладно, повторю вопрос: Зачем нужно юзать «сообщения»? Я вот немогу найти им применение, возможно твои потуги слишком гениальны, чтобы я их понял - объясни.

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

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

Тоже все для межпрограммного обмена (между процессами). Мне б внутри программы найти - внутри одного потока и между потоками.

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

между компонентами разных программ

Мне б внутри программы

Вы бы определились что именно нужно. Сигналы можно посылать и своему процессу. Есть хорошая книга про IPC Стивенса «UNIX: взаимодействие процессов». В оригинале это второй том книги «UNIX Network Programming». Книги старые, но общие вопросы там разобраны хорошо

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

Но не ответили на вопрос «Может Вы, как опытный зверь, встречали у кого-то другое готовое решение или делали что-то подобное сами?».

Знаешь чем отличается шаблонная бездарная обезьяна от опытного пацана. Пацан решает задачу, а обезьяны носится со своими 2-3-мя шаблонами и пытается найти готовое говно.

Давай получше объясню. Любая бездарная обезьяна знает 2-3шаблона, допустим те же сообщения, которые ей рассказали на курсах делфей. И обезьяна решение любой задачи, которую можно хоть как-то свести к этим сообщениям - пытается свести к ним. Ей похрен, нужно ли это сводить? Зачем? Можно сделать лучше, проще и надёжней, но бабуину это не интересно - ему главное как в делфях.

Что тебе мешает ваять говно на делфях, зачем ты лезешь туда, где тебе не дано?

Т.е. бабуин не способен к пониманию матчасти, бабуин не способен к мышлению. Бабуин способен только нести херню и обсираться, и при этом у него даже желания не возникает «я же тотальное ничтожество? Мб я не буду нести херню и хотябы погуглю?». Зачем? да?

Удостоите ответом? В других же ветках вы по делу пишите.

Я пишу по делу только тогда, когда задаётся конкретный вопрос, а не хрен знает что. Выкатывай конкрекретную задачу - мы найдём тебе вменяемое решение.

Я уже говорил - мне не интересно готовое говно, ибо оно всегда говно.

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

Под компонентом программы, подразумевал экземпляры различных си структур (мне больше нравится объект в терминах ООП).

Ты даже не понимаешь, какую же всётаки херню ты несёшь. Во-первых объект в ООП самодостаточен и он сам за себя отвечает.

Это сделано для упращения и унификации, ибо мозг рядового бабуина не способен работать объемными системами. Он способен понять 2-3типа апи и говнякать.

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

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

Бабауин всегда строит сопряжения от готовых апишных шаблонов, когда как илитный пацан строит сопряжение от сопрягаемых. Только для понимания сопрягаемых - нужно понимание, которого собственно нет у бабуина.

Поэтому бабуин всегда мечтает о том, чтобы все сопряжения имели один и тот же вид «всунул эту фигню в эту фигню». Если такого нет - он мечтает о том, чтобы кто-то заваял за него готовые переходники и он жил как нивчем не бывало.

Программа создает различные комбинации объектов и связи между ними, в зависимости от требуемого способа работы.

Как жешь завоняло маздайским говнарём. Нет.

Ты реально несёшь херню чисто форфан в надежде, что кто-то её поймёт и найдёт тебе то, что ты хочешь? Нет. Всем насрать.

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

Датычё, а на основании чего ты сделал вывод, что недообъяснение бабуина каким-то образом относится к реальному миру?

Я тебя удивлю - в реальном мире нет никаких «несинхронных» обменом, нет никаких сообщений - это всё бабуиньи абстракции, но вот юзать ты их можешь только в среде таких же бабуинов как ты.

Мне же твой говновыхлоп не интересен. Единственное, что ты можешь высрать, и что будет хоть каплю объективным - это задача.

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

И ещё, ты реально настолько туп, что непонимаешь - ты не ответил на вопрос. Я тебя спрашивал не «покажи мне жалкие попытки бабаина высрать хоть какое-то описания структуры программы», а «зачем нужно юзать сообщения?».

Ты ответил на этот вопрос? Нет. Ты этого не понимаешь? Вот когда ты осилишь ответить на этот вопрос - в тебе возможно проснётся что-то человеческое, а пока - мне не интересно копаться в говне и твоём анскилле.

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