Область действия и уровень параллелизма
Область действия определяет способ установки соответствия между пользовательской нитью и нитью ядра.
- PTHREAD_SCOPE_PROCESS
- Процесс (или локальная область действия). Это означает, что при запуске нити учитываются все остальные нити процесса с локальной областью действия. Пользовательская нить уровня процесса - это пользовательская нить, которая работает с нитью ядра совместно с другими пользовательскими нитями того же процесса (также уровня процесса). Все пользовательские нити в модели M:1 - это нити уровня процесса.
- PTHREAD_SCOPE_SYSTEM
- Системная (или глобальная) область действия. Это означает, что при запуске нити учитываются все остальные нити в системе, и нить напрямую присваивается одной из нитей ядра. Все пользовательские нити в модели 1:1 - это нити системного уровня.
В модели обработки нитей M:N пользовательские нити могут соответствовать как процессу, так и системе. Поэтому модель обработки нитей M:N часто называют смешанной моделью.
Уровень параллелизма - это свойство библиотек нитей в модели M:N. Уровень определяет число виртуальных процессоров, применяемых для обработки пользовательских нитей в области процесса. Это число не должно превышать число пользовательских нитей в области процесса, обычно оно динамически изменяется библиотекой нитей. Кроме того, количество доступных нитей ядра в системе также ограничено.
Задание области действия
Область действия нити можно задать только до ее создания. Для этого следует установить соответствующее значение атрибута contention-scope в объекте атрибутов нити. Функция pthread_attr_setscope устанавливает значение этого атрибута, а функция pthread_attr_getscope возвращает его текущее значение.
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;
}Влияние области действия на планирование
Область действия нити влияет на параметры ее планирования. Каждая нить определенного уровня связана с отдельной нитью ядра. Поэтому при изменении стратегии планирования и приоритета глобальной пользовательской нити изменяются стратегия планирования и уровень приоритета соответствующей нити ядра.
schedparam.sched_priority = 3;
pthread_setschedparam(pthread_self(), SCHED_FIFO, schedparam);Для пользовательских нитей уровня процесса можно устанавливать любые допустимые стратегии и приоритеты. Однако способы планирования двух нитей с одинаковыми стратегиями и приоритетами, но с различными областями действия, будут различными. Нити уровня процесса выполняются нитями ядра, параметры планирования которых устанавливает библиотека.