QNX RTP Logo QNX Realtime Platform: Русский Портал QNX
Thursday, 20 Nov 2008 13:09
Меню

Проект OpenNET - все о Unix
Главная

 · Начало · Статистика · Поиск ·

  QNX.ORG.RU —› Языки и алгоритмы —› сколько нитей можно запустить одновременно в рамках одного процесса

. 1 . 2 . 3 . 4 . >>

Посл.ответ Сообщение


Дата: 17 Дек,  13:58

сколько нитей можно запустить одновременно в рамках одного процесса


Дата: 17 Дек,  13:58

Люди, помогите! В универе дали задание: установить сколько нитей можно запустить в рамках одного процесса. Написала прогу, бесконечно создающую нити - она постепенно виснет все больше, но 500 проходило.
Подскажите плиз! Сколько же нитей может быть одновременно запущено в одном fork()


Дата: 17 Дек,  18:53

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


Дата: 17 Дек,  19:57

Если 4-ка, то странно что доходит до 500, если 6-ка, то, мне кажется, - малвато будет. В Proc32 четвёрки по умолчанию при сборке ядра задаётся 500 всего вместе, т.е. процессов, проксев и тд. Максималное значение, которое можно задать только пересобрав ядро - 2000. Про 6-ку не знаю, казалось бы что там по умолчанию должно бы быть поболе.


Дата: 17 Дек,  20:15

Katya21

Сколько же нитей может быть одновременно запущено в одном fork()


Так всё-таки чего надо: "нитей" - т.е. thread, создаваемых pthread_create() ? или процессов, клонируемых fork() ? - но это уже вопрос к таблицам procnto...
Если потоков, как сказано в 1-м вопросе, то: 32767 (где-то в документации сказана эта цифра, и понятно откуда оно - это разрядность целочисленного pthread_t).
Если же fork(), т.е. число процессов в системе, то у меня были цифры порядка 1743, с кодом завершения довольно странным: not enough memory - но это, скорее, размер таблиц procnto.


Дата: 17 Дек,  21:00

Гдето наqnxclub.net были тесты, показывающие что планировщику 6.2 плевать, какому процессу принадлежит нить. Ну а 4-ка ваще про pthread_create() не знает, только tfork() (в общемто, в свете вышесказанного про планировщик 6-ки, почти тоже, с некоторыми ограничениями и неудобствами, зато честно сказано что это-процесс, только данные с кодом у них общие). Так что видимо ограничение в размерах табц.


Дата: 18 Дек,  07:22

У меня получилось 23819 нитей в одном процессе - все последующие нити имеют PID 23819
Возможно (32768 минус 23819) занимают все остальные запущенные в системе процессы, но как-то странно...
Вот код:
[code ]
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <pthread.h>
#include <semaphore.h>
#include <sys/neutrino.h>
#include <errno.h>
#include <math.h>

#include <sys/iofunc.h>
#include <sys/dispatch.h>

void* test_th(void *);

int main(int argc, char *argv[]) {

pthread_attr_t attr;
struct sched_param param;
pthread_t test_th_id;

pthread_attr_init( &attr );
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED );
pthread_attr_setinheritsched(&attr,PTHREAD_EXPLICIT_SCHED);
pthread_attr_getschedparam( &attr, &param );
param.sched_priority = param.sched_curpriority = 9;
pthread_attr_setschedparam( &attr, &param );



for (int i=0; i<40000;i++)
{
pthread_create(&test_th_id, &attr, test_th, NULL);
printf("thread ID = %d ", test_th_id);
}


return EXIT_SUCCESS;
}

void* test_th(void *)
{

while(1)
{
sleep(2);
}

}

[/code]


Дата: 18 Дек,  07:56

А вот так и до 40000 нитей дотягивает!

pthread_attr_setstacksize( &attr, 4096*10 );

Так что 32768 похоже не ограничение.


Дата: 18 Дек,  09:04

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


Дата: 18 Дек,  19:10 · Поправил: Katya21

Большое спасибо за помощь!
А у меня вот какая прога (может показаться примитивно, но как уж научили)

#include <stdio.h>
#include<process.h>
#include<unistd.h>
#include<pthread.h>
#include<sys/wait.h>

int ts;
void* nit(int number)
{ printf("nit %d ok",number);
while(1){}
}

int main()
{ int p, i;
//printf("33[2J"[img]http://qnx.org.ru/components/minibb/img/smilies/wink.gif[/img];
i=0; ts=0;
p=fork();
if(p==0)
while(1)
{ i++; printf("
"[img]http://qnx.org.ru/components/minibb/img/smilies/wink.gif[/img];
pthread_create(0,0,(void* (*)(void *))nit, (void*)i);
if(i==100000) {i=0; ts++;}
//if(i>1000) break;
}
wait(0);
printf("
"[img]http://qnx.org.ru/components/minibb/img/smilies/wink.gif[/img];
return(0);
}


Дата: 18 Дек,  19:16

ой, чего-то в printf повставлялось...
Ну суть то в том, чтобы нити продолжали работать. Если их просто создавать, то они будут тут же завершаться. Поэтому while(1){} в нити, чтобы она уж наверняка не завершилась. А QNX у меня стоит на виртуальной машине, поэтому дождалась только 500 (уж больно тормозит проц)


Дата: 18 Дек,  19:53

Katya21
while(1){}

И как сделал qnxloder
qnxloder

while(1)
{
sleep(2);
}

Почувствуйте разницу.


Дата: 18 Дек,  21:05 · Поправил: Olej

Katya21
p=fork();
if(p==0)
while(1)
{ i++; printf( " здесь я не знаю что было " )
pthread_create(0,0,(void* (*)(void *))nit, (void*)i);


А fork() + pthread_create() в одном процессе могут показывать вообще такие эффекты, которые вы и не предполагаете .
См. HELP pthread_at_fork() - прибегать к такой гремучей смеси имеет смысл только если вы очень сильно понимаете, что при этом происходит + очень надо - 100 раз подумайте, прежде чем использовать их вместе.


Дата: 19 Дек,  09:29

Не учите "девушку" плохому .
Ваши sleep-ы в теле потока... чисто гипотетически ..могут успеть отработать .. еще в процессе создавания других потоков - и "эксперемент" будит не "чистым".
И воще, что за привычка гонять pthread_create() ,без проверки на возвращаемое значение???!.. да и при том еще во всех "незасинхронизированных" потоках выводить..printf-ом..?? Представляю всю эту "кучу".. сообщений.
Конешна, со sleep-ом можна смирица - но ведь достаточно просто проверить наличие ошибки которое вернет _create!

И воще...
  RETURN VALUE
If successful, the pthread_create() function returns zero. Otherwise, an error number is returned to indicate the error.
 ERRORS
The pthread_create() function will fail if:
[EAGAIN]
The system lacked the necessary resources to create another thread, or the system-imposed limit on the total number of threads in a process PTHREAD_THREADS_MAX would be exceeded.


Отсюда собсвено и ответ - PTHREAD_THREADS_MAX!!
Какое оно у вас сегодня в цифирах.. никто гарантировать не береца..


Дата: 19 Дек,  10:29

lastcross
И воще...
RETURN VALUE
If successful, the pthread_create() function returns zero. Otherwise, an error number is returned to indicate the error.
ERRORS
The pthread_create() function will fail if:
[EAGAIN]
The system lacked the necessary resources to create another thread, or the system-imposed limit on the total number of threads in a process PTHREAD_THREADS_MAX would be exceeded.


А откуда эта цитата? - просто в QNX (6.3.2, по крайней мере) такого нет:

EAGAIN Insufficient system resources to create thread.

, а вот в ,limits.h , напротив, есть интересная строчка:

#if defined(__EXT_POSIX1_199506)
...
#undef PTHREAD_THREADS_MAX


Дата: 19 Дек,  10:48

pthread_create в fork() - это чтобы создаваемые нити принадлежали одному дочернему процессу. Я проверяла, у них всех pid один и тот же. А прога моя выводит просто номер i нити, которая создалась в этом fork()


Дата: 19 Дек,  10:50

то есть вместо того, чтобы писать какую-то прогу, мне просто надо было поискать в библиотеках QNX-а?


Дата: 19 Дек,  11:07

Katya21
то есть вместо того, чтобы писать какую-то прогу, мне просто надо было поискать в библиотеках QNX-а?


Точнее: в заголовочных файлах...
Только вы там ничего не найдёте , потому как каким-то стандартом POSIX от 06.1995г. - эта константа упразднена .


Дата: 19 Дек,  11:25

he Open Group Base Specifications Issue 6
IEEE Std 1003.1, 2004 Edition
http://www.opengroup.org/onlinepubs/009695399/functions/pthread_create.html

Еще есть там PTHREAD_THREADS_MAX - только это расширение, и расширение опциональное. В sysconf можно посмотреть значение _SC_THREAD_THREADS_MAX. Есть ли в QNX - нужно смотреть.


Дата: 19 Дек,  11:34

http://www.opengroup.org/onlinepubs/009695399/functions/pthread_create.html

или

http://www.opennet.ru/man.shtml?topic=pthread_create&category=3&russian=5

Понятное дело .. это конешна не QNX .. но и POSIX, тоже никто неотменял - всетаки блин.. не чистокуниксовая функция.. А то что в limit.h кто-то написал такие строчки - дак флаг им вруки ...им значит виднее было. Спор конечно не критичный (в данном контексте), но было бы кпримеру оч. удивительно тут..(я тут дам волю фантазии) если вдруг оператор new не выделял память.. как все привыкли "ожидать" от него.. а делал что-либо другое.. и только терпеливый программист открыл бы истину для себя - прочитав что же конкретно трактует QNX (конкретнее..компилер..наверное) по этому поводу.
А может я старый стал.. и смотрю по "старым" ссылкам ?
Но суть проблемы.. не в этом.. Влюбом случае Обработка ошибок - конкретнее говорит .. что сощдать поток не получается (толи прав нехватает.. толи ресурсы не позволяют)... поэтому признаку стоит прекращать клепать потоки.. и разбираца почему.. и выводить подсчет потоков.

Katya21

то есть вместо того, чтобы писать какую-то прогу, мне просто надо было поискать в библиотеках QNX-а?
]

..я даже незнаю что ответить - видишь что пишут по этому поводу Olej?
- вобщем случае, мне так думалось, что ограничение на количество потоков - это ресурсы (толи это стек.. толи это индетификаторы..толи еще чего)
Кстати.. зачем создавать было еще один процесс? .. ведь начиная с main() - у тебя уже есть процесс ..


Дата: 19 Дек,  11:36

Спасиба.. lestat-у .. за мою спокойную.. сегоднешнюю..ночь


Дата: 19 Дек,  12:38

lastcross
Спасиба.. lestat-у .. за мою спокойную.. сегоднешнюю..ночь


... и за некоторую ясность: что и откуда пришло


Дата: 21 Дек,  10:49

#include <stdio.h>
#include<process.h>
#include<unistd.h>
#include<pthread.h>
#include<sys/wait.h>
#include<sys/neutrino.h>

int chid;
void* nit(void* foo)
{ char buf[3];
int num_nit;
int coid=ConnectAttach(0,0,chid,0,0);
MsgSend(coid,"",1,buf,3);
}

int main()
{ int p, i, tid, temp;
chid=ChannelCreate(0);
i=0; tid=0;
p=fork();
if(p==0)
while(tid>=0)
{ i++;
pthread_create(&tid,0,(void* (*)(void *))nit, 0);
if(tid==temp) break;
printf(" tid = %d",tid);
temp=tid;
}
wait(0);
printf(" i = %d",i);
getchar();
return(0);
}
Вот! Как только добирается до 65534, tid все время повторяется! Это и есть предел.


Дата: 21 Дек,  14:57

Многоуважаемая...девушка...
На вопрос типа... " ..сколько нитей можно запустить одновременно в рамках одного процесса.." ответить точно никто Вам не берется... Потому как в Вашем вопросе стоит непонятное слово "..МОЖНО..", какждый может страктовать его по разному ..(кому, когда, и сколько ...это самое "можно"[img]http://qnx.org.ru/components/minibb/img/smilies/wink.gif[/img].. Все зависит от вашего кода . В одной реализации - можно 200 потока.. в другой 2.. В тойже риализации но на другом тазике.. под другим юзером - ниодного незя будит запустить.
Если же Вас интересует - ограничение на количество создаваемых потоков в одном процессе.. тогда прочитайте внимательно все что тут было написано до этого..
Ибо когданить..вас очень удивит тот факт .. что ваш процесс больше двух потоков не запускает.... А еще интереснее - ниодного потока не запустил (pthread_create - вернет ошибку которую.. вы так яро необрабатываете досихпор..), а может стека им не хватает... а может параметры не верны...Это кстати бы избавило Вас от всяких манипуляций с дополнительной переменной temp..

И воще..что за привычка пихать в pthread_create в качестве первого параметра, индетификатора потока, указатель на объект переменной типа int.. когда на самом деле тип у нее должен быть pthread_t!!!. Может и на вашей машине... и сегодня ..pthread_t это эквивалент типа int..пока-что.. А Вы хотите удивица через ..годика так два... перекомпилировав свой код на другой машине..? А вощем.. флаг вруки Вам ..

Темболее, про ограничение связанные с индетификатором потоков тут уже писалось до Вас .. Читаете невнимательно ))


Дата: 21 Дек,  16:38

Вот интересно: с каких это пор все стали такими грамотными, грозными и пушистыми? Неужели в нонешней России, Украине и пр. стало нормой советовать студентам посылать преподавателей университета и демонстрировать им их безграмотность (даже если они действительно тупые)?
Ведь с самого начала сказано:
Katya21
В универе дали задание: установить сколько нитей можно запустить в рамках одного процесса

Может кто присоветует студентке что-нибудь более конструктивное, чем объявить в универе, что все препы козлы? К сожалению, я сегодня слишком далек от вузовских нравов и уж тем более в ex-USSR...


Дата: 22 Дек,  01:54

Evgeniy
Вот интересно: с каких это пор все стали такими грамотными, грозными и пушистыми? Неужели в нонешней России, Украине и пр. стало нормой советовать студентам посылать преподавателей университета и демонстрировать им их безграмотность (даже если они действительно тупые)?

Советовать вряд ли стало нормой, а посылать - пожалуй уже норма. И чем круче родители студента (больше денег), тем дальше, как правило, студенты посылают преподавателей
Evgeniy
Ведь с самого начала сказано:

Katya21
В универе дали задание: установить сколько нитей можно запустить в рамках одного процесса


В совсем другой ветке обсуждения (что не делает чести студенту, это не этично, по крайней мере, заводить дискуссию на одну тему сразу в двух местах на форуме), было универовское задание, и был вопрос, мало связанный с этим заданием. lestat дал конкретный ответ на конкретный вопрос (как уже было упомянуто, не связанный с заданием). Может тут многое модераторами поправлено, и я что-то упустил.
Evgeniy
Может кто присоветует студентке что-нибудь более конструктивное, чем объявить в универе, что все препы козлы?

Опять же, я наверно что-то упустил. Потому как выше в этой дисскуссии именно даны дельные советы. Как я понимаю, это либо лаба либо практика, и преп хочет видеть код, в котором студент создает потоки, считает их, и по упору аккуратно прибивает все потоки и сообщает цифирю. Дополнительным вопросом может быть, отчего зависит эта полученная цифра и пр. Код, который студент два раза сюда послал, заслуживает оценки 2 (два) балла по старосоветской системе (может у них уже 2 - это твердый зачет, я не в курсе). И выше было сказано почему. Повторю. Чтобы исправить положение и получить троечку, надо ответить на дополнительные вопросы:
1) что делает функция fork() и зачем она применяется в данном конкретном случае;
2) всегда ли полезно игнорировать код завершения, возвращаемых функциями, в частности ф-цией pthread_create().
Именно так учили нас. Очень надеюсь, что хоть где-то еще так учат. Причем у нас не было вариантов выбора а-ля Америка:
а) функция fork() накалывает на вилку кусок жареной свинины;
б) порождает процесс, идентичный вызвавшему её процессу;
в) удваивает колличество процессов в системе и наливает чашечку кофе тому, кто её вызвал.
Если это не лаба или практика, а обычный зачет по теории, тогда преп обычно хочет цифру из документации или аргументированный анализ, что от чего зависит (в зависимости, что было рассказано на лекциях), без всякого кода.


Дата: 24 Дек,  19:04

Да сдала я уже эту программу. Это было часть ргз. В ргз 3 задания, это - третье.
Первые 2 я сделала верно. А вот насчет этого, про нити, преподаватель сначала сказал, чтобы я заставила нити бесконечно чего-то ждать. Вот я второй раз поместила исправленную версию - когда нити ждут подтверждения на посланное сообщение. И не надо утверждать, что они не работают!
Единственное, в чем я ошиблась - это не совсем корректное сравнение, надо было не
while(tid>=0)
{ i++;
pthread_create(&tid,0,(void* (*)(void *))nit, 0); ...

А tid=pthread_create(0,0,(void* (*)(void *))nit, 0);
чтобы в случае ошибки -1 завершить работу.

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


Дата: 24 Дек,  19:13 · Поправил: lestat

Детка, за такое "(void* (*)(void *))" выгоняют с любой программерской конторы. У нас это называли трёхзвёздночный программист.


Дата: 25 Дек,  06:16 · Поправил: Katya21

Это не я придумала, так в лекциях написано приводить к типу void! И имеено так "(void* (*)(void *))" !


Дата: 25 Дек,  07:04

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

"Это не я придумала, так в лекциях написано приводить к типу void! И имеено так "(void* (*)(void *))" ..."

..и никто и несомневался - что Ваш препод " не просто препод, он профессор"...

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

. 1 . 2 . 3 . 4 . >>

You must login to post.

©   2000-2003 Команда проекта QNX.ORG.RU // QNX.ORG.RU Team
Авторы проекта: Дмитрий Алексеев [dmi] и Дмитрий Васильев. Техническое сопровождение проекта: Игорь Сорокин [isorokin]. Информационное сопровождение: Дмитрий Алексеев [dmi]
QNX - зарегистрированная торговая марка QNX Software Systems, Ltd., Canada. Остальные упоминаемые на сайте торговые марки и логотипы являются исключительно собственностью их уважаемых владельцев. Ничьи права не затронуты. Материалы сайта не могут быть скопированы и где-либо использованы в той или иной форме без письменного разрешения разработчиков сайта.
Powered by Mambo Open Source