Как получить приоритет процесса?

Модератор: Модераторы разделов

Аватара пользователя
жучара
Сообщения: 132
ОС: minix 3.1.0

Как получить приоритет процесса?

Сообщение жучара » 23.05.2018 22:44

Друзья! То есть хочу напомнить нам, что такой вот вызов:

Код: Выделить всё

getpriority (PRIO_PGRP, 1005);
Должен среди всех процессов группы №1005 найти и вернуть наименьший в математическом смысле.

Итак, получим несколько процессов. Ниже код, который формирует несколько процессов ОДНОЙ группы. Все процессы работают 3 минуты, кроме процесса с нулевым приоритетом, он сразу отрабатывает. Каждый процесс выводит свой приоритет (случайное число от 0 до 19 и идентификатор группы процессов)

Код: Выделить всё

/* fork01.c */
#include <stdio.h>
#include <sys/resource.h>

//Количество процессов
#define COUNTPROCESS 16

int main (void)
{
	//создадим COUNTPROCESS процессов
	int i = 0;
	for (i = 0; i < COUNTPROCESS; i++)
		fork ();

	//каждый процесс устанавливает для себя приоритет
        setpriority (PRIO_PROCESS, getpid(), getpid()%20);

	//получим этот приоритет
	int pr = getpriority (PRIO_PROCESS, getpid());
	
	
	//выведем приоритеты всех процессов и идентификатор группы
	//если процесс имеет нулевой приорите, то он прекращает работу, 
	//остальные работают 3 минуты
	if (pr) 
	{	
		printf ("getpriority = %d\n", pr);
		printf ("getpgrp     = %d\n", getpgrp());
		sleep (180);
	}
	
	return 0;
}
Типичный вывод для 16-ти процессов. Процесс с нулевым приоритетом, напомню, отсутствует.
вывод

Код: Выделить всё

user@astra:~$ ./a.out
getpriority = 7
getpgrp     = 8727
getpriority = 11
getpgrp     = 8727
getpriority = 10
getpgrp     = 8727
getpriority = 9
getpgrp     = 8727
getpriority = 15
getpriority = 12
getpgrp     = 8727
getpriority = 14
getpriority = 13
getpriority = 8
getpgrp     = 8727
getpgrp     = 8727
getpgrp     = 8727
getpgrp     = 8727
getpriority = 18
getpgrp     = 8727
getpriority = 17
getpgrp     = 8727
getpriority = 16
getpgrp     = 8727
getpriority = 19
getpriority = 1
getpgrp     = 8727
getpgrp     = 8727
getpriority = 2
getpgrp     = 8727
++++++++++++++++++++++++++++++++++++++++

Итак, запустили все наши процессы, они работают. Найдём среди них процесс с наименьшим приоритетом в математическом смысле. Ниже код:

Код: Выделить всё

/*foo.c*/
#include <sys/resource.h>
#include <stdio.h>

//Здесь мы получаем приоритет процесса, который
//самый низкий в математичесом смысле в группе
int main (int argv, char* argc [])
{
        printf ("%d\n", getpriority (PRIO_PGRP, atoi (argc [1])));
}
Запускаем и смотрим, что получилось:

Код: Выделить всё

uгser@astra:~$ ./foo 8727
0
uгser@astra:~$ 
Видно, что он нашёл среди процессов группы №8727 процесс с нулевым приоритетом. И так происходит почти всегда! Но такого процесса нет в природе, вот в чём дело!

+++++++++++++++++++++++++++++++++++++++

код foo хорошо работает с четырьмя процессами, хуже с девятью, ещё хуже с 16-ю. Где он вытаскивает процесс с нулевым приоритетом- ума не приложу. Надеюсь на вашу помощь, друзья! Спасибо, кто откликнется.
Спасибо сказали:

Аватара пользователя
/dev/random
Администратор
Сообщения: 4575
ОС: Gentoo

Re: Как получить приоритет процесса?

Сообщение /dev/random » 23.05.2018 23:00

жучара писал(а):
23.05.2018 22:44

Код: Выделить всё

	//создадим COUNTPROCESS процессов
	int i = 0;
	for (i = 0; i < COUNTPROCESS; i++)
		fork ();
Эээ, что-то здесь не то. Этот код должен создать не COUNTPROCESS процессов, а 2 в степени COUNTPROCESS. После каждого fork() вызвавший его процесс раздваивается, и оба продолжают выполнение с этого места, так что оба потом вызывают следующий fork().
Спасибо сказали:

Аватара пользователя
жучара
Сообщения: 132
ОС: minix 3.1.0

Re: Как получить приоритет процесса?

Сообщение жучара » 23.05.2018 23:16

/dev/random писал:
23.05.2018 23:00
Эээ, что-то здесь не то.
, да, я ошибся. В данном случае нужно писать так:

Код: Выделить всё

//создадим COUNTPROCESS процессов
int i = 0;
	for (i = 0; i < 4; i++)
		fork ();
Так создастся 16 процессов. Соответственно for (i = 0; i < 2; i++) и for (i = 0; i < 3; i++) создаст 4 и 8 процессов. А так вопрос открыт.
Спасибо сказали:

Аватара пользователя
/dev/random
Администратор
Сообщения: 4575
ОС: Gentoo

Re: Как получить приоритет процесса?

Сообщение /dev/random » 23.05.2018 23:27

Подозреваю, что дело в зомби. Когда процесс завершается, запись о нём в таблице процессов остаётся до тех пор, пока родительский процесс не узнает об этом через вызов wait() или сам не завершится. Попробуйте выполнить

Shell

ps -eHo pid,pgid,nice,args
и посмотреть.
Спасибо сказали:

Аватара пользователя
жучара
Сообщения: 132
ОС: minix 3.1.0

Re: Как получить приоритет процесса?

Сообщение жучара » 26.05.2018 10:23

/dev/random писал:
23.05.2018 23:27
Подозреваю, что дело в зомби.
, похоже на то.
Спасибо сказали:

Вернуться в «Программирование для начинающих»