LINUX.ORG.RU

Если есть 100 одинаковых процессов с разными параметрами запущенными, то как можно минимизировать их размер в памяти (на диске занимают 4Кб, в памяти - 300Кб).


0

0

Может все же можно с разделяемой памятью пошаманить ? Или опцию какую при компиляции указать (-OS ?).

★★★★★

Что это значит 300K ? Есть размер кода, стека и данных. Причем размер кода показывает и код библиотек, большинство из которых разделяемые (если конечно программы не собирались как static). Если уж размер кода для программ сильно критичен, то можно большинство функций вынести с свою разделяемую библиотеку. Стек у каждого процесса свой. Данные можно вынести в разделяемую память, но IPC у юникса такой, что лучше в это дело не ввязываться. А вообще-то непонятно какая необходимость запускать 100 процессов одновременно, что программа-то делает ?

Z0termaNN
()

код программ и разделяемых библиотек и так не дублируется в памяти. А чего вобще делают процессы?

maxcom ★★★★★
()

Походу САПЕР самый настоящий шпион
(хотя может он и разведчик) ;-)

anonymous
()

Все это я знаю (про стэк, код и данные). Вопрос был вообще про уменьшение (неважно чего, в смысле стэк ...) размера програмы в памяти. Для того, чтобы не было вопросов, зачем 100 процессов поясняю: в сети 254 адреса (192.168.10.1-192.168.10.254), так вот каждые полчаса нужно сканировать их всех сканером портов (работает реально около 100 машин). Сканер портов - собственный (на основе connect-а, как в pscan-е). Теперь, зачем это надо - не могу сказать, а параллельно это все надо делать, чтобы все это работало быстрее (время на выполнение сканирования очень ограничено, а параллельно по моим тестам (для моих задач) действительно быстрее). Т.К. времени мало надо заоптимизировать и по памяти - так точно быстрее будет (программа запускается на разных компьютерах с дискеты: от 384Мб ОЗУ до 16Мб - сами понимаете swap тут просто трещит всем винчестером). Так что помогите, если не тяжко. Нужен любой способ уменьшить размер, при этом не сильно замедляя функционирование и загрузку программ.

saper ★★★★★
() автор топика

Обиделись вы все что-ли ? (что я Вам цель проекта не сказал) Проблема тут одна: одна сеть постоянно прикрыта FireWall-ом и периодически открывается на 5 минут, так вот за это время я обязан ее проверять, но так как машин там добавилось, я иногда просто не успеваю обработать всю сеть из-за тормозов на моей системе (2 машины могут справиться с задачей легко, если диапазон адресов поделить пополам, да вот сверху сказали, что одной всегда хватало и.т.д). Так что не обижайтесь, и отпишите, кто что знает про оптимизацию в этой области.

saper ★★★★★
() автор топика

Можно в рамках одного процессса :
1. использовать threads,
2. использовать non-blocking connect

и в первом и во втором случае все упрется в количество одновременно
открытых дескрипоторов ( 256 для 2.0 и 1024 для 2.2 ядер).

Если же программу переписывать не хочется, то можно использовать
clone(2) вместо fork(2).

Z0termaNN
()

clone() ? Грамотно!

anonymous
()

К сожалению вызов clone() удаляет нас от POSIX-а, поэтому ипользовать его нельзя. Можно ли что-либо подобное организовать на POSIX-функциях ? (Про clone() я знал, но он ведь только для Linux ... или во FreeBSD и Solaris это тоже есть ?). PTHREADS - это POSIX Threads ? Под какие UNIX-ы, API PTHREADS тоже работает без переписывания и исправления кода ?

saper ★★★★★
() автор топика

Да вообще-то подо все unix-98, т.е. практически под все
коммерческие Unix последних версий.

Z0termaNN
()

POSIX threads:
Irix 6.5 +
Solaris
FreeBSD
Linux

На моей странице есть FLTK-переделанная для потоков
и там можно смотреть Fl_Brain.[H]cxx/Fl_Brain_win32.[H]cxx

(http://www.chat.ru/~yaroslav_v)

clone() не поддерживается на Solaris, IBM AIX, FreeBSD.

anonymous
()

На Linux поток тоже порядком ест ресурсов,
я рекомендую каждый поток сделать с НАИНИЗШИМ
приорететом:
#ifdef __linux__
nice(19); /* ;-) - на LinuxThreads by Xavier Leroy*/
#else
/* shed_param->priority=get_min_priority(SCHED_OTHER); */
#endif
в FLTK-brain это Fl_Brain::rank(double p);
(http://www.chat.ru/~yaroslav_v)

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