Ю. Вахалия - UNIX изнутри (2003) (1114670), страница 31
Текст из файла (страница 31)
Для совместного использования памяти между нитями применяются элементы виртуальной памяти, обеспечиваемые ядром МасЬ. Такой вариант используется только в случаях, когда необходима специализированная семантика разделения памяти.
132 Глава 3. Нити и легковесные процессы 3.8. 019йа! Ой!Х Операционная система Р!й!Га! 1ЛЧ1Х (ранее известная как РЕС ОЗР/1) основана на ядре МасЬ 2.5. С точки зрения разработчика приложений эта система предоставляет полньгй программный интерфейс 11Ы1Х. Однако внутренняя реализация многих возможностей традиционного варианта ПЧ1Х в этой системе опирается на базовые элементы ОС МасЬ. Эта реализация организована на уровне совместимости системы МасЬ с ОС 4.ЗВЗР, расширенного фондом Ореп Яо1тткаге Роппс!ас!оп до совместимости с ЯЧКЗ и ЗЧК4.
Это свойство существенно повлияло на устройство системы Р!фГа! РЫ1Х. Система предлагает изящный набор средств, расширяющих понятие процесса 119]. Многонитевые процессы поддерживаются как на уровне ядра, так и на уровне совместимых со стандартами РО51Х нитевых библиотек. Процесс 11Ы1Х реализован как верхний уровень задач и нитей системы МасЬ. 3.8.1. Интерфейс ОМ!Х Хотя задачи и нити достаточно адекватно обеспечивают интерфейс выполнения программ системы МасЬ, они не в полной мере описывают процесс ПЫ1Х. Процесс обеспечивает некоторые свойства, которые не отражены в МасЬ, такие как полномочия пользователя, дескрипторы открытых файлов, обработчики сигналов и группы процессов.
Более того, для предотвращения изменения традиционного интерфейса 1ЛЧ1Х был осуществлен перенос кода уровня, обеспечивающего совместимость МасЬ 2.5 с 4.ЗВЗР, который, в свою очередь, был перенесен из оригинальной реализации 4.ЗВЗР. Точно так же был произведен перенос многих драйверов устройств из системы Р!уса! 131.ТК1Х, также основанной на ОС ВЗР. Перенесенный код делает множественные ссылки на структуры ргос и цзег также для обеспечения совместимости. Применение оригинального варианта структур ршс и цзег является причиной возникновения двух проблем. Во-первых, некоторая информация из этих структур уже отражена в структурах 1ай и 1Ьгеаг!. Во-вторых, они не могут адекватно представлять многонитевые процессы.
Например, традиционная область и содержит блок угграелепил процессом, который хранит контекст регистров процесса. В случае многонитевости каждая нить обладает собственным контекстом регистров. Следовательно, обе структуры должны быть существенно изменены. Область ц заменена двумя объектами: единой структурой ц1ай, которая используется задачей целиком, и по одной структуре игйгеаг! выделено для каждой нити задачи. Новые структуры не занимают фиксированное адресное пространство процесса и не участвуют в его свопинге. Структура ц1азЬ содержит следующую информацию: + указатели на объекты тпог!е текущего и корневого каталогов; + указатель на структуру ргос; з.в. о!ойа! цы!х 133 + массив обработчиков сигналов и других полей, относящихся к сигналам; + таблицу дескрипторов открытых файлов; + маску создания файлов, используемую по умолчанию (свай); + данные об использовании ресурсов, квотах и информацию профиля.
Если одна из нитей открывает файл, то его дескриптор может быть использован совместно всеми нитями задачи. Также все нити будут иметь один и тот же текущий рабочий каталог. Структура ийгеао описывает ресурсы, относящиеся к каждой нити процесса ()Ь!1Х, и содержит следующую информацию: + указатель на сохраненные регистры прикладного уровня; + поля для просматриваемых путей; + текущие и ожидающие сигналы; + обработчики сигналов, определенные для данной нити. Для упрощения переноса ссылки на поля старой области и были преобразованы в ссылки на поля структуры и1ай или ийгеад. Такое преобразование можно осуществить при помощи макроса, например: Йег1ае и свай исай- ии свай Йеггае и рсЬ испгеай->ии рсЬ Структура ргос претерпела незначительные изменения, но большинство ее функций теперь возложено на структуры 1ай и Фсеай.
В результате большинство ее полей не используется, хотя они и сохранены из «исторических» соображений. Например, поля, относящиеся к расписанию и приоритету, не являются необходимыми, так как в ОС Ий!са! (ЛЧ1Х каждая нить планируется на выполнение индивидуально. Структура ргос операционной системы Ирта! 1)Ь!1Х содержит следующую информацию: + связи с очередью размещенных процессов, процессов-зомби или свободных процессов; + маски сигналов; + указатель на структуру полномочий процесса; + информацию об идентификации и иерархии процесса (Р10 процесса, РП) предка, указатели на процесс-предок, процессы-потомки, процессы того же уровня и т. д.); + группу процесса и информацию сеанса; + поля, относящиеся к расписанию (не используются); + поля для хранения состояния и использования ресурсов при выходе; + указатели на структуры тай и и~ай, а также на первую в списке структуру Фгеао. 134 Глава 3.
Нити и легковесные процессы На рис. 3.10 показана связь между структурами данных в системе МасЬ и традиционной 111х1Х. Структура 1аз!г содержит связанный список своих нитей. Структура 1ай указывает на и1ай, а каждая структура Фгеаг! указывает на соответствующую структуру и1!!геаг!. Структура ргос содержит указатели на структуры 1аз!г, и1ай и ссылается на первую в списке структуру 1!!геаг!. Структура и1ай содержит обратный указатель на ргос, а каждая йгеаг! включает в себя обратные указатели на 1ай и ц1ай. Такая организация взаимосвязей дает возможность быстрого доступа ко всем структурам.
Рис. 3.10. Структуры данных задач и нитей е системе О!0!та! О!Ч!Х Не всем нитям присваивается прикладной контекст. Некоторые могут создаваться непосредственно ядром для выполнения различных системных функций, таких как замена страниц памяти. Такие нити связаны с задачей ядра, которая не имеет прикладного адресного пространства. Задача ядра и нити ядра не имеют связанных с ними структур цвай, и1!!геаг! и ргос. 3.8.2. Системные вызовы и сигналы В операционной системе 0!я!~а! (ЛЧ1Х системный вызов 1ог!г создает новый процесс, обладающий единственной нитью, которая является точной копией нити, вызвавшей 1ог!г.
Система не поддерживает альтернативного варианта вызова, дублирующего все нити. Так же как и в ОС Бо1айз, все сигналы классифицируются на синхронные (системные прерывания, или ловушки, — Ггарз) или асинхронные сигналы (прерывания, тгепирЯ. Ловушка доставляется той нити, которая стала причиной ее срабатывания.
Сигналы прерываний доставляются любой нити, которая примет их. Однако, в отличие от операционной системы Зо1аг1з, все нити процесса используют единый набор масок сигналов, который хранится в структуре ргос. Каждая нить может создавать собственный набор обработчиков синхронных сигналов, но все нити процесса должны пользоваться единым набором обработчиков асинхронных сигналов. 3.8.3. Библиотека рФгеабв Библиотека р1!!геаг!з предлагает совместимый с РОЯ1Х программный интерфейс прикладного уровня для реализации нитей, являющийся более простым, чем 3.8. гз!у!а! О!ч!х 135 системные вызовы системы МасЬ. С каждой нитью рг!!геаг! библиотека связывает одну нить МасЬ.
Функционально рг!!геай подобны С-г!!геай или иной нитевой библиотеке, но именно в рг!!геай реализован интерфейс, принятый как стандарт. Библиотека рг1ггеаг!з реализует функции асинхронного ввода-вывода, определенные стандартом РОЯ1Х. Например, если нить вызывает определенную в Р081Х функцию а!огеадО, то библиотека создаст новую нить для синхронного чтения. Когда чтение завершится, ядро разбудит заблокированную на этой операции нить, которая, в свою очередь, уведомит вызывающую ее нить при помощи сигнала.
Асинхронный ввод-вывод проиллюстрирован на рис. 3.11. Продогсхвние других действий Рис. 3.11. Реализация асинхронного ввода-вывода при помощи создания отдельной нити Библиотека рт!!геай предоставляет полный программный интерфейс, включающий функции обработки сигналов и планирования, а также набор элементов синхронизации. Синхронизация между нитями может быть реализована на прикладном уровне, однако если требуется заблокировать ЕЖР, должно вмешаться ядро системы. Ж81са1 предлагает свою собственную библиотеку, сна г!ггеабз, поддерживающую некоторые дополнительные возможности 18~.
Программы, использующие эту библиотеку, будут работать только на платформах Р!811а! Ъ'М8 и %1пг1очгз, на других 13Х1Х-системах они функционировать не будут. 136 Глава 3. Нити и легковесные процессы 3.9. Продолжения в системе Масп Хотя нити ядра более легковесны, чем процессы, они все равно занимают больший объем памяти ядра, используя ее преимущественно для стека. Обычно стеки ядра занимают как минимум 4 Кбайт памяти, что составляет почти 90Угь пространства ядра, используемого нитью. В системах с большим количеством нитей (достигающим нескольких сотен) это может привести к уменьшению производительности. Одним из решений проблемы является мультиплексирование прикладных нитей в меньшее количество нитей Мас!т или легковесных процессов, что предотвратит потребность в стеке ядра для каждой прикладной нити.
Такой подход имеет свои минусы, так как прикладные нити не могут планироваться на выполнение независимо и, следовательно, не дают такого же уровня одновременности, как в случае соответствия каждой прикладной нити одной нити ядра. Более того, раз нити ядра не переходят границы задачи, соответственно каждая задача должна обладать по крайней мере одной нитью ядра, что создает проблемы на системах с большим количеством активных задач. В этом разделе описан подход к решению вышеописанных проблем, предлагаемый системой Мас!г 3.0, при помоши средства, получившего название продолжений (соль!ппаь!опз).