Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Программирование под Unix/Linux > Что-то менее ресурсоемкое чем fork, pthread_create


Автор: Anton Vatchenko 19.4.2007, 09:54
После вызова 10 fork система ругается, что не может выделить больше памяти, а при pthread_create - на второй раз слетает с той же ошибкой. Есть что-то, что меньше расходует ресурсы? Нужно создать около 150 потоков...

Автор: MAKCim 19.4.2007, 10:14
Цитата(Anton Vatchenko @  19.4.2007,  09:54 Найти цитируемый пост)
После вызова 10 fork система ругается, что не может выделить больше памяти, а при pthread_create - на второй раз слетает с той же ошибкой. Есть что-то, что меньше расходует ресурсы? Нужно создать около 150 потоков... 

fork() возвращает ENOMEM или EAGAIN?
если второе, то поможет увеличение лимита на количество создаваемых дочерних процессов у родительского
man 2 setrlimit
man 2 getrlimit

Автор: Anton Vatchenko 19.4.2007, 10:35
ENOMEM

Автор: permea 19.4.2007, 10:50
Цитата
Есть что-то, что меньше расходует ресурсы?

?
#include <sched.h>
int clone(int (*fn)(void *), void *child_stack, int flags, void *arg);
_syscall2(int, clone, int, flags, void *, child_stack);   
?

Автор: Anton Vatchenko 19.4.2007, 11:59
весь инет обрыл, и не мог найти, что передавать в child_stack.

Автор: permea 19.4.2007, 12:14
Аргумент child_stack указывает на местонахождение стека, использованного дочерним процессом. Хотя дочерний и родительский процессы могут разделять память, дочернему процессу нельзя ипспользовать тот-же стек для исполнения, что и вызывающему процессу. Поэтому родительский процесс должен выделить пространство в памяти под стек дочернего процесса и передать указатель на это пространство функции clone. На всех процессорах с реализацией Linux (кроме процессоров HP PA) стек "растет вниз". child_stack обычно указывает на самый последний адрес памяти для стека дочернего процесса. 
(с) http://www.opennet.ru/man.shtml?topic=clone&category=2&russian=0
?

Автор: Anton Vatchenko 19.4.2007, 12:16
Это я читал. И что туда передавать?

Автор: permea 19.4.2007, 12:24
Надо полагать, указатель на конец выделенного маллоком куска памяти. 

Автор: MAKCim 19.4.2007, 19:16
Anton Vatchenko, 
clone() не стандартизирован POSIX-ом
так что, если нужна совместимость не только с Linux, подумай прежде чем его использовать
лучше скажи, чем у тебя система загружена, что больше чем на 10 fork-ов памяти не хватает?

Автор: Goganchic 22.4.2007, 21:49
А это точно не лимиты самой системы?

Автор: MAKCim 23.4.2007, 09:07
Цитата(Goganchic @  22.4.2007,  21:49 Найти цитируемый пост)
А это точно не лимиты самой системы? 

он же написал - ENOMEM

Автор: Goganchic 23.4.2007, 10:18
точно-точно, извиняюсь smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)