Ю. Вахалия - UNIX изнутри (2003) (1114670), страница 67
Текст из файла (страница 67)
1987, рр. 63-76. Глава 7 Синхронизация. Многопроцессорные системы 7.1. Введение Желание увеличить производительность компьютерных систем привело к появлению новых аппаратных архитектур. Основным направлением развития вычислительной техники стало создание многопроцессорных систем. Такие системы могут содержать от двух и более центральных процессоров, при этом остальные ресурсы, такие как память, используются ими совместно. Многопроцессорные технологии обладают некоторыми бесспорными преимуществами, Они позволяют гибко расширять объем ресурсов, используемых программой, которая может начать выполнение на одном процессоре и в дальнейшем, при увеличении объема производимых вычислений, использовать другие процессоры системы.
Большинство вычислительных задач зависят, прежде всего, от производительности СРП. Для таких задач мощность процессора (или процессоров) является самым критичным параметром, в отличие от работы с шиной ввода-вывода или памятью, используемых менее интенсивно. Применение многопроцессорных систем позволяет увеличивать вычислительные мощности без дублирования остальных ресурсов. Следовательно, такое решение для вычислительных задач является самым эффективным по себестоимости.
Многопроцессорные системы обладают повышенной надежностью: если на одном из процессоров произойдет сбой, система сможет продолжать работу дальше. Но, с другой стороны, многопроцессорные архитектуры таят в себе и определенные проблемы, связанные с большим количеством потенциально опасных точек сбоев, Чтобы гарантировать определенное количество среднего времени наработки на отказ (шеап с!ше ЪеГоге Еайпге, МТВГ), многопроцессорные системы должны разрабатываться на основе отказоустойчивого оборудования и программного обеспечения.
В частности, многопроцессорные системы должны уметь восстанавливаться после сбоя одного из процессоров. 7Л. Введение 287 Существуют различные операционные системы, созданные с учетом многопроцессорных архитектур. Одна из первых многопроцессорных реализаций 1)Н1Х работала на машинах АТЬТ ЗВ20А и 1ВМ 370 11]. На сегодняшний день большинство вариантов систем 1Л~ПХ поддерживают многопроцессорную обработку изначально (1)ЕС 1Лч1Х, Бо1айз 2.х), либо для этой цели имеются специализированные версии ОС (3ЧК4/МР, 3СО/МРХ). Теоретически производительность системы должна увеличиваться пропорционально умножению числа процессоров. Однако в реальности все происходит немного иначе. На это существует несколько причин.
Так как остальные компоненты системы не дублируются, именно они и становятся узким местом, тормозящим ее работу. Доступ к разделяемым структурам данных требует определенной синхронизации. Для многопроцессорных систем необходимо обеспечивать синхронизацию при помощи дополнительных средств, увеличивающих загрузку процессоров и уменьшающих тем самым общую производительность. Операционная система обязана по возможности уметь минимизировать такие перегрузки и оптимизировать использование ресурсов СР1). Ядро традиционных вариантов 111ч1Х разрабатывалось для однопроцессорных машин.
Для того, чтобы такие системы работали на многопроцессорных архитектурах, требуется внести в дизайн их ядра значительные изменения. Необходимо заново переписать такие компоненты, как реализация синхронизации, параллельного выполнения задач и правил планирования. Синхронизация используется для управления доступом к разделяемым данным и ресурсам системы. Традиционный подход, основанный на приостановке и возобновлении работы процессов, совмещенный с блокировкой прерываний, является непригодным для многопроцессорных сред и должен быть заменен более производительными методиками.
Параллельность позволяет эффективно использовать объекты синхронизации для управления доступом к разделяемым ресурсам. Эта технология предлагает решения, позволяющие регулировать степень детализации и место блокировок, защищать от возникновения взаимоблокировок и т. д. Некоторые из перечисленных проблем будут описаны в разделе 7.10.
Для оптимизации использования всех процессоров системы необходимо разработать новые правила планирования. Некоторые аспекты реализации планирования в многопроцессорных системах будут обсуждаться в разделе 7А. Эта глава начинается с описания механизмов синхронизации традиционных систем 1)Н1Х и анализа их ограничений. Затем вы познакомитесь со многопроцессорными архитектурами. В конце главы приведено описание технологий синхронизации, применяемых в современных вариантах 1)1ч!Х. Эти кетоды работают одинаково хорошо как на однопроцессорных, так и на многопроцессорных системах.
В традиционных вариантах 111ч!Х базовым объектом диспетчеризации является процесс, который обладает единственным управляемой нитью. В главе 3 описывались современные системы 1ЛЧ1Х, которые позволяют процессу иметь 288 Глава 7. Синхронизация. Многопроцессорные системы несколько нитей выполнения, поддерживаемых на уровне ядра. Многонитевые системы существуют как для однопроцессорных, так и для многопроцес. сорных архитектур. В таких системах нити соревнуются за обладание разделяемыми ресурсами и блокируют их. В дальнейшем (до окончания главы) мы будем считать пить базовой единицей планирования.
Для однонитевых систем нить является синонимом процесса. 7.2. Синхронизация в ядре традиционных реализаций 0й!Х Ядро 13Н1Х является реентерабельным. Это означает, что в одно и тоже время в ядре системы могут работать сразу несколько процессов, иногда выполняя при этом одинаковые задачи.
На однопроцессорных системах в один момент времени может выполняться только один процесс. Система постоянно переключается от выполнения одного процесса к другому, создавая иллюзию параллельного функционирования. Такая возможность получила название мвогозадпчной работы. Так как все процессы используют единое ядро, ему необходимо как-то синхронизировать доступ к своим структурам данных для предупреждения возможности их повреждения. В разделе 2.5 подробно рассказывалось о технологиях синхронизации, применяемых в традиционньц системах 13М1Х. В этой главе мы подведем краткие итоги. Первым защитным механизмом традиционного ядра 13Х1Х является его невытесняемость. Любая нить будет продолжать работу в режиме ядра де тех пор, пока сама не будет готова освободить его либо приостановить выполнение в ожидании ресурса, даже в том случае, если эта нить исчерпала выделенный ей квант времени.
Такой подход дает возможность кодам ядри управлять различными структурами данных без обеспечения какой-либо защиты содержашейся в них информации, поскольку заранее известно, что никакая другая нить не сможет получить доступ к пим до тех пор, пока текущая нить не закончит манипуляции данными и не переведет ядро в непротиворечивое состояние. 7.2.1. Блокировка прерываний Непрерываемость ядра традиционных версий 11МХ является свойством, обеспечивающим мощный инструментарий синхронизации, но, к сожалению, она обладает и некоторыми ограничениями.
Текущую выполняемую нить невозможно вытеснить, по ее работу можно прервать. Прерывания являютсх внутренними событиями системы и должны обрабатываться как можно быстрее. Обработчик прерывания в состоянии манипулировать структурами данных, принадлежащих текущей нити, что может стать причиной их поврежде- 7.2.
Синхронизация е ядре традиционных реализаций ОМ!Х 28Я ния. Следовательно, ядро системы должно как-то синхронизировать доступ к данным, используемым его подпрограммами и обработчиками прерываний. В системе ()1х!1Х вышеописанная проблема решена при помощи блокировки (или маскирования) прерываний.
Каждому прерыванию присваивается уровень приоритета (!птеггорт рйогйу 1ече1, 1р1). Система поддерживает текущий уровень 1р! и проверяет его после возникновения прерывания. Если приоритет окажется выше текущего значения, то такое прерывание будет обработано незамедлительно (то есть будет приостановлена обработка прерывания с более низким уровнем 1р1). В противоположном случае ядро заблокирует прерывание до тех пор, пока текущий уровень 1р1 пе снизится до необходимого уровня. Сразу перед загрузкой обработчика ядро системы устанавливает 1р1 в значение текущего прерывания, после завершения его обработки ядро восстанавливает предыдущее сохраненное значение.
Ядро обладает возможностью установить значение 1р1 в принудительном порядке с целью временной блокировки прерываний в течение выполнения критических участков кода. Например, одной из процедур ядра необходимо удалить дисковый буфер пз очереди буферов. Эта очередь доступна и обработчику прерываний диска. Участок кода, производя|ций действия с очередью, является критическим. До начала его выполнения процедура поднимает уровень !р1 до значения, достаточного для блокировки дисковых прерываний. После завершения действий над очередью процедура восстановит предыдущее значение 1р1, разрешая тем самым обработку дисковых прерываний. Поддержка уровней !р1 позволяет эффективно решить проблему синхронизации ресурсов, используемых совместно ядром и обработчиками прерываний.