LINUX.ORG.RU

pthread_create() откуда берется лишний процесс в списке процессов?


0

0

вот примитив:

#include <stdio.h>
#include <pthread.h>

void *Servlet (int *init)
{
	usleep (15000000);
	pthread_exit(NULL);
}

int main()
{
	int i=0;
	pthread_t tchild;

	if ( pthread_create ( &tchild, 0, (void*)Servlet, &i) != 0)
		perror ("Could not create thread");
	else
		pthread_detach(tchild);
	usleep (15000000);

	return 0;
}

компилирую, запускаю. даю команду ps -aux|grep моя_прога.
и вместо ожидаемых двух процессов вижу три (естественно не
считая grep моя_прога). и так сколько бы потоков я не создовал,
всегда на один поток больше чем ожидается. Кто может объяснить,
в чем тут дело ?

Re: pthread_create() откуда берется лишний процесс в списке процессов?

Артефакт Линуха.

Каждый раз, когда в проге >1 треда, создается дополнительный (один на всех)
тред-манагер, единственное назначение которого - ждать смерти дочек.

Die-Hard ★★★★★
()

Re: pthread_create() откуда берется лишний процесс в списке процессов?

Кстати-да. Die-Hard прав. Только вот почему-то в болшенстве литературы это НЕ описано. Я у себя в проекте долго глюк искал.... потом на форуме здесь прочитал что все нормально.

Dead ★★★★
()

Re: Re: pthread_create() откуда берется лишний процесс в списке процессов?

понятно. тогда, если я kill'ом обью этот манагер, есть вероятность, что все остальные потоки уйдут в зомби ?

NikZ
()

Re: Re: Re: pthread_create() откуда берется лишний процесс в списке процессов?

NikZ (*) (2003-02-12 10:57:27.489): > если я kill'ом обью этот манагер, есть вероятность, что все остальные потоки уйдут в зомби ?

Нет. Манагер уйдет в зомби, а дочки отойдут к иниту. И информация об их статусе станет недоступной самому толстому треду.

Die-Hard ★★★★★
()

Re: pthread_create() откуда берется лишний процесс в списке процессов?

2Die-Hard "Манагер уйдет в зомби, а дочки отойдут к иниту. И информация об их статусе станет недоступной самому толстому треду"

Ты это проверял?

Просто если один трэд валится по Segmentation fault то все остальные тоже умирают. Неужели kill будет обработан по другому? Проверять как-то лень :-)

Dead ★★★★
()

Re: Re: pthread_create() откуда берется лишний процесс в списке процессов?

> Ты это проверял?
Да.

> если один трэд валится по Segmentation fault то все остальные тоже умирают.
Не совсем.

Попробуй пошли манагеру SIGSEGV. У меня вообще ничего не происходит, сигнал игнорируется!

Любой другой тред сразу вылетает, после чего вылетает все остальное.

Die-Hard ★★★★★
()

Re: pthread_create() откуда берется лишний процесс в списке процессов?

Мои наболюдения: если по Segmentation fault велетает один тред, то валются все треды сразу, не спорю. бывали случаи, когда киллом убивал один тред, часть остальных тредов убивалось, часть уходило в зомби и эти зомби приходилось добивать повторным киллом. вот это мне и интересно, что собсно на самом деле происходило. думаю, такое случается когда убиваешь или родительский трэд или "манагер" (назовем лишний трэд так)

NikZ
()

Re: Re: pthread_create() откуда берется лишний процесс в списке процессов?

NikZ (*) (2003-02-13 13:58:14.414):
IMHO чой-то ты не то говоришь:
> часть уходило в зомби и эти зомби приходилось добивать повторным киллом.
Зомби киллом не убить, он и так мертвый.

> если по Segmentation fault велетает один тред, то валются все треды сразу
ПОЧТИ верно. "Почти" - потому что
1. Ты всегда можешь переопределить обработчик SIGSEGV, и ничего никуда вылетать
не будет;
2. "манагер" не могет сегментатион свиолейтидь - он, типа, ничего не делает.
А если ему насильно в морду SIGSEGV плеснуть, он молча обтечет и ничего не
сделает.

> ...часть остальных тредов убивалось, часть уходило в зомби...
Еще раз:
В Линухе (в нарушение POSIX'а, BTW!) есть ТРИ ПРИНЦИПИАЛЬНО РАЗЛИЧАЮЩИХСЯ типа
тредов (речь идет о pthreads).
1. Начальный толстый тред
2. "Манагер"
3. Все остальные
Все треды типа 3 являются дочками "манагера". Если грохнуть киллом любой детачнутый
тред, кроме манагера, грохнется и все остальное. Если грохнуть
манагера, он уйдет в зомби, а остальные будут жить, но - на ушах.

Die-Hard ★★★★★
()

Re: pthread_create() откуда берется лишний процесс в списке процессов?

ok наверно я не корректно выразился. вот еще один реальный пример. есть апач, который в каждый момент времени имеет примерно 20-30 процессов + 10-15 процессов - это запущенные апачем перловые скрипты. даю команду ps и вижу, что часть из этих перловых скриптов - зомби. долблю киллом по этим зомби, нифига. долблю киллом по одному из рабочих процессов апача, и все процессы апача и в том числе зомби благополучно завершают свою работу. вот примерно такая же ситуация была с моей прогой. как это комментироваь, я не знаю.

NikZ
()

Re: Re: pthread_create() откуда берется лишний процесс в списке процессов?

2NikZ (*) (2003-02-13 16:31:58.073):
Ну, Апач (до недавнего времени) запускал пул процессов, а тредов там вообще не было.
И, потом, как Апач перл гоняет - через АПИ, или все же екзеком?


Die-Hard ★★★★★
()

Re: pthread_create() откуда берется лишний процесс в списке процессов?

2Die-Hard вот как апач гоняет перл я не знаю

NikZ
()

Re: pthread_create() откуда берется лишний процесс в списке процессов?

execом если без fastcgi

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