[ Страница назад | Страница вперед | Содержание | Индекс | Библиотека | Юридическая информация | Поиск ]

Программирование: Разработка и отладка программ


Основные сведения о нитях

Нить - это независимый поток управления, работающий в том же адресном пространстве, что и остальные независимые потоки управления в рамках процесса. В предыдущих версиях 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. Все несвязанные пользовательские нити совместно выполняются на оставшихся виртуальных процессорах. Эта модель обработки нитей самая эффективная и самая сложная; средства программирования пользовательских нитей используются как библиотекой нитей, так и нитями ядра.

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

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

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

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

Библиотека POSIX libpthreads.a

В AIX содержится библиотека нитей libpthreads.a, основанная на промышленном стандарте POSIX 1003.1c для переносимых API пользовательских нитей. Любая программа, рассчитанная на работу с библиотекой нитей POSIX, будет правильно работать с другой библиотекой нитей POSIX; от реализации зависят только производительность программы и две-три функции в библиотеке нитей. Поэтому программы с несколькими нитями, разработанные для данной версии AIX, будут работать во всех последующих версиях AIX.

Для повышения уровня переносимости библиотек нитей реализация некоторых средств программирования в стандарте POSIX объявлена необязательной. Дополнительная информация о проверке возможностей POSIX приведена в разделе Необязательные компоненты библиотеки работы с нитями.

Библиотека проекта POSIX 7 libpthreads_compat.a

В AIX обеспечивается двоичная совместимость с ранее созданными приложениями с несколькими нитями, соответствующими проекту 7 стандарта нитей POSIX. Эти приложения правильно работают без повторной компоновки.

Для этих целей предусмотрена библиотека libpthreads_compat.a. AIX версии 4.3 обеспечивает программную поддержку как для проекта 7 стандарта нитей POSIX, так и для стандарта Xopen версии 5, включающего в себя окончательный вариант стандарта нитей POSIX 1003.1c.

Дополнительная информация по этому вопросу приведена в разделе Создание программ с несколькими нитями.

Связанная информация

Прим.:
Примечание: в этой книге и связанных публикациях термин нить по умолчанию означает пользовательская нить. Это утверждение не распространяется на разделы, посвященные программированию ядра.

Глава 9, Параллельное программирование

Рекомендации по созданию программ с нитями

Достоинства нитей


[ Страница назад | Страница вперед | Содержание | Индекс | Библиотека | Юридическая информация | Поиск ]