Область действия и уровень параллелизма

Область действия определяет способ установки соответствия между пользовательской нитью и нитью ядра.

. В библиотеке нитей определены следующие возможные области действия:
PTHREAD_SCOPE_PROCESS
Процесс (или локальная область действия). Это означает, что при запуске нити учитываются все остальные нити процесса с локальной областью действия. Пользовательская нить уровня процесса - это пользовательская нить, которая работает с нитью ядра совместно с другими пользовательскими нитями того же процесса (также уровня процесса). Все пользовательские нити в модели M:1 - это нити уровня процесса.
PTHREAD_SCOPE_SYSTEM
Системная (или глобальная) область действия. Это означает, что при запуске нити учитываются все остальные нити в системе, и нить напрямую присваивается одной из нитей ядра. Все пользовательские нити в модели 1:1 - это нити системного уровня.

В модели обработки нитей M:N пользовательские нити могут соответствовать как процессу, так и системе. Поэтому модель обработки нитей M:N часто называют смешанной моделью.

Уровень параллелизма - это свойство библиотек нитей в модели M:N. Уровень определяет число виртуальных процессоров, применяемых для обработки пользовательских нитей в области процесса. Это число не должно превышать число пользовательских нитей в области процесса, обычно оно динамически изменяется библиотекой нитей. Кроме того, количество доступных нитей ядра в системе также ограничено.

Задание области действия

Область действия нити можно задать только до ее создания. Для этого следует установить соответствующее значение атрибута contention-scope в объекте атрибутов нити. Функция pthread_attr_setscope устанавливает значение этого атрибута, а функция pthread_attr_getscope возвращает его текущее значение.

Область действия нитей имеет значение только в реализации библиотеки для смешанной модели обработки нитей M:N. Процедура TestImplementation может выглядеть так:
int TestImplementation()
{
        pthread_attr_t a;
        int result;

        pthread_attr_init(&a);
        switch (pthread_attr_setscope(&a, PTHREAD_SCOPE_PROCESS))
        {
                case 0:          result = LIB_MN; break;
                case ENOTSUP:    result = LIB_11; break;
                case ENOSYS:     result = NO_PRIO_OPTION; break;
                default: result = ERROR; break;
        }

        pthread_attr_destroy(&a);
        return result;
}

Влияние области действия на планирование

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

В AIX стратегии планирования с постоянным приоритетом (FIFO и round-robin) могут применяться только для нитей ядра с правами root. Следующий код возвратит код ошибки EPERM (при условии, что вызывающая нить относится к системной области, но не имеет прав доступа root). Если же область действия вызывающей нити - процесс, то ошибка не возникнет.
schedparam.sched_priority = 3;
pthread_setschedparam(pthread_self(), SCHED_FIFO, schedparam);
Прим.: Для управления параметрами планирования пользовательских нитей уровня процесса права доступа root не требуются.

Для пользовательских нитей уровня процесса можно устанавливать любые допустимые стратегии и приоритеты. Однако способы планирования двух нитей с одинаковыми стратегиями и приоритетами, но с различными областями действия, будут различными. Нити уровня процесса выполняются нитями ядра, параметры планирования которых устанавливает библиотека.