Ю. Вахалия - UNIX изнутри (2003) (1114670), страница 68
Текст из файла (страница 68)
7.2.2. Приостановка и пробуждение Во многих случаях нить должна использовать какой-либо ресурс системы эксклюзивно даже в том случае, если она приостанавливает выполнение. Например, нити необходимо прочесть блок информации с диска и записать ее в дисковый буфер. Для этого нить запрашивает буфер и начинает производить действия с диском. Ей необходимо дождаться завершения ввода-вывода, что означает возможность освобождения процессора на некоторое время для другой нити. Если новая текущая нить попытается получить доступ к тому же буферу и использовать его для своих целей, результатом может стать измененпе или повреждение данных, находящихся в нем.
Это означает, что система должна поддерживать некие методики защиты блокированных ресурсов. В ()1х!1Х зашита ресурсов реализована при помощи флагов !ослеп' (ресурс занят) и иаптео (ресурс необходим). Если нити необходимо получить доступ к рззделяемому ресурсу (например, буферу), то в первую очередь ей нужно проверить состояние флага !остей.
Если флаг не установлен, нить установит 290 Глава 7. Синхронизация. Многопроцессорные системы его и начнет манипуляции с ресурсом. Если другая нить попытается получить доступ к тому же ресурсу, опа обнаружит флаг (осМег! и приостановит работу («заснеть) до тех пор, пока ресурс нс станет доступным. Перед блокировкой нить установит для ресурса флаг вапгео. Приостановка работы нити означает помешение ее в очередь спящих нитей и изменение информации о ее статусе, оповещающей о приостановке работы в ожидании определенного ресурса. После этого нить освобождает процессор и передает его следуюшей работоспособной нити системы.
Через некоторое время первая нить закончит манипуляции с ресурсом, сбросит флаг 1ос1еб и проверит флаг ттапгео. Если флаг окажется установленным, то это означает, что по крайней мере еще одна нить находится в режиме ожидания того же ресурса. В этом случае текущая нить проверит очередь спящих нитей и разбудит все нити, ожидающие освобожденный ею ресурс. Пробуждение нити приводит к удалению ее из очереди спящих нитей, изменению ее статуса в состояние «работоспособная» и помещению ее в очередь нланировшика.
В какой-то момент времени нить станет текущей. Первым ег действием прн получении процессорного времени будет являться проверка флага 1ос1ег!. Если флаг це установлен, нить сможет продолжить манипуляции с необходимым ей ресурсом. 7.2.3. Ограничения традиционного ядра 0й!Х Традиционная модель синхронизации корректно работает на однопроцессорных машинах, но она, к сожалению, не избавлена от проблем, связанных с производительностью системы. В многопроцессорных системах использо. ванне традиционной модели невозможно, что и будет более подробно показе но в разделе 7.4.
Блокировка ресурсов и очереди приостановленных нитей В некоторых ситуациях организация очередей приостановленных нитей может являться причиной заметного ухудшения производительности систсмм В системах ())х)1Х нить блокируется при ожидании освобождения ресурса или возникновении определенного события. Каждый ресурс или события ассоциированы с каналом ожидания, представляющим собой 32-разрядную переменную, обычно указывающую па адрес ресурса. Система поддерживает набор очередей ожидания, соединение канала с одной из очередей реализовм но при помоши хэширования (рис. 7.1). Нить приостанавливает работу, помо щая себя в одну из очередей ожидания, при этом ссылка на соответствующий канал ожидания сохраняется в структуре ргос.
Применение такой методики блокировки приводит к двум последствиям. Во-первых, на каждый канал может ссылаться более чем одно событие. На. пример, одна из нитей может заблокировать буфер, инициализировать проведение над ним определенных действий и приостановить работу до тех пор, 7.2. Синхронизация в ядре традиционных реализаций 0Ы!Х 291 пока эти действия не будут закончены. Если другая нить попытается получить доступ к тому же буферу, то обнаружит его заблокированным. Следовательно, ей придется приостановить выполнение в ожидании освобождения ресурса.
Оба события ссылаются на один и тот же канал, указывающий на необходимый обеим нитям буфер. После завершения процедур ввода-вывода обработчик прерываний разбудит обе нити, несмотря на то, что последняя из них ожидает еще не произошедшее событие. Каналы Блоаироаанные ожидания нити Ресурсы Рт Рис.
7.1. Отображение ресурсов а глобальных очередях приостановленных нитей Во-вторых, количество структур хэширования обычно меныпе, чем различных каналов ожидания (то есть ресурсов и событий), следовательно, несколько каналов могут ссылаться на одно и то же место. Таким образом, оказаться хэшированными могут нити, ожидающие несколько различных каналов. Процедуре угахецр() необходимо проверять каждый из них и делать работоспособными только те нити, которые ожидают определенный ресурс. Общее время работы ттахецр() зависит не от количества процессов, находящихся в режиме ожидания данного канала, а от общего количества хэшированных процессов. Это приводит к непредусмотренным задержкам, появление которых нежелательно для систем, поддерживающих приложения реального времени, требующих соблюдения определенных верхних границ задержек планировщика (см.
раздел 5.5.4). Одним из решений проблемы является ассоциация отдельной очереди ожидания каждому ресурсу или событию (рис. 7.2), что позволит оптимипировать задержки при пробуждении процессов, но приведет к необходимости выделения большего объема памяти для хранения большего количества очередей. Обычный заголовок очереди наряду с другой информацией имеет два указателя (на предыдущую и следующую очереди). Общее количество объектов синхронизации может оказаться слишком большим, так что поддержка отдельной очереди ожидания для каждого из них является неприемлемой. 292 Глава 7. Синхронизация.
Многопроцессорные системы ~ф д РЗ Р4 Рис. 7.2. Отдельные очереди для каждого ресурса системы Турникеты 1:"1- Р1 2-и))~~~ РЗ Рис. Т.З. Блокировка нитей с применением турникетов В систел1е Во!апз 2.х представлено более эффективное решение 171: каждый объект синхронизации поддерживает двухразрядное поле, указывающее иа структуру турникета, которая содержит очередь ожидания и другую необходимую информацию (рис. 7.3).
Ядро выделяет турникеты только для тех ресурсов, которые ожидают заблокированные нити. Для ускорения процедуры выделения ядро поддерживает набор турникетов, размер которого больше, чем общее количество активных нитей в системе. Такой подход удобен для приложений реального времени, так как даст минимальные задержки. Более подробно технология синхронизации системы Бо!апз 2.х описана в разделе 5.6.7.
Разделяемый и эксклюзивный доступ Механизм приостановки и возобновления выполнения является удобным в том случае, если в один момент времени ресурс используется только одной нитью. Однако он не позволяет использовать более сложные протоколы, такие каи синхронизация читающих-пишущих нитей. Иногда необходимо предоставить ресурс сразу нескольким нитям на чтение, но потребовать для его изменения эксклюзивных полномочий. Некоторые ресурсы, такие как файлы илн каталоги, будут использоваться более эффективно при применении этой технологии. 7.3.
Многопроцессорные системы Многопроцессорные системы обладают тремя важнейшими свойствами. Вопервых, это модель памяти, определяющая способ ее разделения между всеми процессорами. Второй отличительной особенностью является аппаратная поддержка синхронизации.
Под третьим свойством подразумевается программ. ная архитектура, определяющая взаимодействие процессоров, подсистем ядоя и пользовательских процессов. 7.3. Многопроцессорные системы 293 7.3.1. Модель памяти С точки зрения аппаратуры многопроцессорные системы можно разделить на три категории в зависимости от доступа к памяти и взаимосвязи компонентов (рис.
7.4): + с унифицированным доступом к памяти (()п1топп Метогу Ассезз, () МА); + с неунифицированным доступом к памяти (Хоп-()п1гопп Мепюгу Ассезз, ЯШМА); + с невозможностью доступа к удаленной памяти (Хо Кепюге Мептогу Ассезз, ХОтсМА). ючатель тема сотной ацией Шина г" — — — - — — - — — --, Переключатель или система с перекрестной коммутацией Г" Рис. 7.4.
Категории систем: а — 0МА, б — МАМА, в — гибридная архитектура Ы0МА, г — МОЭМА 294 Глава 7. Синхронизация. Многопроцессорные системы Наиболее распространенные системы основаны на методе ()МА или разделяемой памяти (рис. 7А, а). В таких системах все процессоры обладают равнозначным доступом к основной памяти' и устройствам ввода-вывода, которые обычно соединяются между собой единой шиной.
С точки зрения разработки операционных систем эта модель является наиболее простой. Ее основным недостатком является масштабируемость. Архитектура ()МА поддерживает небольшое количество процессоров. При увеличении числа СРУ возникают конфликты в обшей для всех шине. Одной из самых крупных систем, основанных на ()МА, является ЯС! СЬа!1епяе, поддерживающая до 36 процессоров на одной шине. В системах )хП) МА (рис. 7.4, б) каждый процессор имеет некоторый объем локальной памяти и обладает возможностью доступа к памяти других СР(), Скорость доступа к удаленной памяти ниже, чем локальный обмен.