Нить - это независимый поток управления, работающий в том же адресном пространстве, что и остальные независимые потоки управления в рамках процесса. В предыдущих версиях AIX и в большинстве систем UNIX характеристики нити и процесса объединены в объект, называемый процессом. В других операционных системах нити иногда называются "простыми процессами", а в некоторых системах принято несколько отличающееся понятие нити.
Ниже перечислены различия между нитью и процессом, а также пояснен смысл понятия "нить" в AIX.
Следующие разделы посвящены нитям в AIX:
В традиционных системах, применяющих процессы с одной нитью, у процесса есть набор свойств. В системах с несколькими нитями эти свойства распределены между процессами и нитями. Более подробная информация приведена в разделе Свойства нити.
Процесс в системе с несколькими нитями - это непостоянный объект. Его следует понимать как среду для выполнения действий. Процесс обладает всеми традиционными атрибутами:
Кроме того, у процесса есть общее адресное пространство и общие системные ресурсы:
Нить - это планируемая единица работы. Она обладает только свойствами, необходимыми для обеспечения независимости потока управления. К этим свойствам относятся следующие:
Пример данных, относящихся к конкретной нити, - это индикатор ошибки errno. В системах с несколькими нитями errno - это не глобальная переменная, а функция, возвращающая значение errno для конкретной нити. В разных системах errno может быть реализована по-разному.
Нити в рамках одного процесса не следует рассматривать как группу процессов. Все нити обрабатываются в одном и том же адресном пространстве. Это означает, что два указателя из различных нитей с одинаковыми значениями указывают на одни и те же данные. Кроме того, если нить изменяет какой-либо из общих ресурсов системы, изменения отражаются на всех остальных нитях процесса. Например, если нить закрывает файл, он становится закрытым для всех нитей.
При создании процесса автоматически создается одна нить, называемая главной нитью. Благодаря этому обеспечивается совместимость между старыми процессами с одной (неявной) нитью и новыми процессами с несколькими нитями. Главная нить обладает некоторыми особыми свойствами, невидимыми для программиста и предназначенными для обеспечения двоичной совместимости между старыми программами с одной нитью и новыми операционными системами, поддерживающими обработку нескольких нитей. В этой же нити выполняется основная процедура программы с несколькими нитями.
Нить - это единица планирования, то есть системный планировщик заданий работает именно с нитями. Разбиение процесса на нити, с которыми работает системный планировщик, в существенной степени зависит от реализации. В целях лучшей переносимости программ, в стандартных библиотеках нити реализованы по-другому.
Нить ядра - это элемент ядра, такой же, как процессы или обработчики прерываний. Подобными элементами управляет системный планировщик. Нить ядра обрабатывается в рамках процесса, но на нее может ссылаться любая другая нить в системе. Программист не может управлять такими нитями непосредственно, если только он не разрабатывает расширения ядра или драйверы устройств. Более подробная информация о программировании процессов ядра содержится в книге AIX 5L Version 5.1 Kernel Extensions and Device Support Programming Concepts.
Пользовательская нить - это элемент, применяемый программистами для параллельного выполнения различных операций в одной программе. API для обработки пользовательских нитей содержатся в специальной библиотеке нитей. Пользовательская нить существует только в рамках процесса; пользовательская нить из процесса А не может ссылаться на пользовательскую нить из процесса В. Библиотека нитей работает с нитями ядра с помощью собственного интерфейса, позволяющего запускать пользовательские нити. API для пользовательских нитей, в отличие от интерфейса нитей ядра, переносимы между платформами. Поэтому программы с несколькими нитями, разработанные в одной системе под управлением AIX, можно легко перенести в другую систему.
В других операционных системах применяется другая терминология: пользовательские нити называются простыми нитями, а нити ядра - простыми процессами.
Библиотека нитей устанавливает соответствие между пользовательскими нитями и нитями ядра. Способ установки такого соответствия называется моделью обработки нитей. Существует три различных модели обработки нитей, соответствующих трем различным способам установления соответствия между пользовательскими нитями и нитями ядра:
Соответствие между пользовательскими нитями и нитями ядра устанавливают виртуальные процессоры. Виртуальный процессор (VP) - это элемент библиотеки, как правило, неявный. Для пользовательской нити виртуальный процессор играет ту же роль, что и CPU для нити ядра. В библиотеке виртуальный процессор является нитью ядра или структурой, связанной с нитью ядра.
В модели M:1 всем пользовательским нитями ставится в соответствие одна нить ядра; все пользовательские нити выполняются на одном VP. Это соответствие устанавливает планировщик библиотеки. Все средства программирования пользовательских нитей используются только библиотекой. Эта модель допустима для любых систем, в частности, для традиционных систем, не предусматривающих обработки нескольких нитей.
В модели 1:1 для каждой пользовательской нити выделяется отдельная нить ядра; каждая пользовательская нить выполняется на отдельном VP. Большая часть средств программирования пользовательских нитей применяется непосредственно нитями ядра.
В модели M:N всем пользовательским нитям ставится в соответствие пул нитей ядра; все пользовательские нити выполняются пулом виртуальных процессоров. Отдельная пользовательская нить может быть связана с определенным виртуальным процессором, как в модели 1:1. Все несвязанные пользовательские нити совместно выполняются на оставшихся виртуальных процессорах. Эта модель обработки нитей самая эффективная и самая сложная; средства программирования пользовательских нитей используются как библиотекой нитей, так и нитями ядра.
Область действия определяет способ установки соответствия между пользовательской нитью и нитью ядра. Существуют следующие типы области действия:
Пользовательская нить системного уровня - это пользовательская нить, для которой выделена отдельная нить ядра. Все пользовательские нити в модели 1:1 - это нити системного уровня.
Пользовательская нить уровня процесса - это пользовательская нить, которая работает с нитью ядра совместно с другими пользовательскими нитями того же процесса (также уровня процесса). Все пользовательские нити в модели M:1 - это нити уровня процесса.
В модели обработки нитей M:N пользовательские нити могут соответствовать как процессу, так и системе. Поэтому модель обработки нитей M:N часто называют смешанной моделью.
Уровень параллелизма - это свойство библиотек нитей в модели M:N. Уровень определяет число VP, применяемых для обработки пользовательских нитей в области процесса. Это число не должно превышать число пользовательских нитей в области процесса, обычно оно динамически изменяется библиотекой нитей. Кроме того, количество доступных нитей ядра в системе также ограничено.
В AIX содержится библиотека нитей libpthreads.a, основанная на промышленном стандарте POSIX 1003.1c для переносимых API пользовательских нитей. Любая программа, рассчитанная на работу с библиотекой нитей POSIX, будет правильно работать с другой библиотекой нитей POSIX; от реализации зависят только производительность программы и две-три функции в библиотеке нитей. Поэтому программы с несколькими нитями, разработанные для данной версии AIX, будут работать во всех последующих версиях AIX.
Для повышения уровня переносимости библиотек нитей реализация некоторых средств программирования в стандарте POSIX объявлена необязательной. Дополнительная информация о проверке возможностей POSIX приведена в разделе Необязательные компоненты библиотеки работы с нитями.
В AIX обеспечивается двоичная совместимость с ранее созданными приложениями с несколькими нитями, соответствующими проекту 7 стандарта нитей POSIX. Эти приложения правильно работают без повторной компоновки.
Для этих целей предусмотрена библиотека libpthreads_compat.a. AIX версии 4.3 обеспечивает программную поддержку как для проекта 7 стандарта нитей POSIX, так и для стандарта Xopen версии 5, включающего в себя окончательный вариант стандарта нитей POSIX 1003.1c.
Дополнительная информация по этому вопросу приведена в разделе Создание программ с несколькими нитями.
Глава 9, Параллельное программирование
Рекомендации по созданию программ с нитями