Понимание планирования Linux, когда задействованы pthreads - PullRequest
6 голосов
/ 24 мая 2011

в обсуждении другой проблемы см. Отладка странной ошибки, которая зависит от выбранного планировщика , я столкнулся с некоторыми вопросами о планировании моих потоков. Я работаю в Linux 2.6.x, работаю с правами root и использую pthreads для параллельных действий в приложении, критичном по времени, написанном на C / C ++.

Я попытаюсь дать несколько коротких отрывков, чтобы объяснить мой вопрос:

В основном я где-то в начале делаю:

struct sched_param sp;
memset(&sp, 0, sizeof(sched_param));
sp.sched_priority = 99;
sched_setscheduler(getpid(), SCHED_RR, &sp);

Я понимаю, что это код, который переключает мою программу на использование RR-планировщика, работающего на макс. приоритет.

При запуске pthread я делаю:

sched_param param;
pthread_attr_setinheritsched(&attr, PTHREAD_EXPLICIT_SCHED);
pthread_attr_getschedparam(&attr, &param);
param.sched_priority = priority;
pthread_attr_setschedpolicy(&attr, SCHED_RR);
pthread_attr_setschedparam(&attr, &param);

Я понимаю, что это код, который переключает поток, который будет запущен, в RR-планировщик, используя приоритет, заданный в 'priority'. Будет ли это работать аналогично, если main не переключит планировщик?

Чего я не понимаю, так это того, нужно ли вызывать этот код в main? (Основная функция ничего не делает, кроме как запустить все, а затем заблокировать ввод с клавиатуры.) Где я могу найти точную документацию о том, как это работает. Я не думаю, что man-страницы хорошо объясняют фон.

Заранее спасибо.

Ответы [ 2 ]

3 голосов
/ 24 мая 2011

В Linux по умолчанию используется реализация ntpl (Native POSIX Thread Library) , которая рассматривает поток как легкий процесс, поэтому планировщик планирует потоки с другими процессами.

Во FreeBSD у вас есть «оригинальная» реализация pthread , которая позволяет вам указать политику планирования потоков, но потоки не планируются как процессы по умолчанию (если не установлен параметр PTHREAD_SCOPE_SYSTEM)

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

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

Я нашел сравнение между PThreads и NTPL здесь .

0 голосов
/ 15 декабря 2016

Реализация NPTL - модель 1: 1; поток в пространстве пользователя и процесс в пространстве ядра, который называется LWP. LWP, запланированный ядром, имеет область содержимого PTHREAD_SCOPE_SYSTEM.

...