Ю. Вахалия - UNIX изнутри (2003) (1114670), страница 75
Текст из файла (страница 75)
Например, ядро может хранить в памяти некий список свободных дисковьц блоков. Если список становится пустым, его необходимо заполнить новыми данными о свободных блоках. В большинстве случаев список блокируется на небольшие интервалы времени, в течение которых происходит добавление или удаление его элементов. Если при этом необходимо производить операции ввода-вывода, список окажется заблокированным на большой период времени. Следовательно, ни ждуший цикл, ни блокировка не окажется в данном случае идеальным выходом.
Одним из вариантов решения проблемы является использование двух объектов синхронизации. При этом блокирующий объект применяется только в случае необходимости пополнения списка. Однако наиболее предпочтительным вариантом в этом случае является использвание другого, более гибкого элемента синхронизации. Один из наиболее приемлемых вариантов решения проблемы заключается в сохранении в объекте синхронизации указания, по которому и опреде. ляется, как нужно поступать нити: приостанавливать работу или выполнять цикл ожидания. Указание устанавливается обладателем ресурса и проверяется при неудачном завершении попытки получения объекта синхронизации.
Указание может иметь как рекомендательный, так и директивный характер. Альтернативное решение под названием адаптивной блокировки (адарцче 1оскз) представлено в системе Яо!апв 2.х [7]. Если нити Т1 необходимо получить адаптивный объект, удерживаемый нитью Т2, то сначала производится проверка выполнения Т2 на одном из процессоров системы. Если Т2 выполняется в текущий момент времени, нить Т1 перейдет в режим циклического ожидания; если Т2 окажется заблокированной, Т1 также приостановит свою работу, 7.10.4. Объекты блокировки Блокировка применяется для защиты различных типов объектов: данных, логических выражений, инвариантных выражений или операций.
К примеру, объекты блокировки чтения-записи используются для защиты данных. Условные переменные обычно ассоциируются с логическими выражениями. Инвариантное выражение имеет определенные сходства с логическим выражением, но отличается в семантике. Если объект защищен инвариантом, то это означает, что его значение будет равно ТКО2 всегла, кроме случаев удержания объекта кем-либо. В качестве примера можно привести связанный список, который использует единственный объект блокировки при добавлении или удалении записей.
Инвариантным выражением, защищающим список, может быть целостность его состояния. АЛО. Другие проблемы, возникающие при синхронизации 321 Объекты блокировки можно применять для управления доступом к определенной операции или функции. При этом устанавливается ограничение на код программы, который может выполняться одновременно только на одном процессоре системы. На этом свойстве построена модель синхронизации управляющих программ (шошгогз) [91. Во многих реализациях ПЫХ один из процессоров используется для выполнения участков ядра, не поддерживающих параллельность.
Такой метод применяется для последовательного выполнения кода, не рассчитанного для работы на многопроцессорных машинах, Это часто приводит к возникновению эффекта «бутылочного горлышка»вЂ” следовательно, по возможности от него следует отказаться, 7.10.5. Степень разбиения и длительность Производительность системы сильно зависит от степени разбиения объектов синхронизации.
С одной стороны, в некоторых асимметричных многопроцессорных ОС коды ядра выполняются только на одном процессоре, называемом главным. В этом случае для всего ядра достаточно одного объекта блокировки. С другой стороны, система может применять большое количество таких объектов, предоставляя их каждой переменной данных. Понятно, что ви первое, ни второе решение не является идеальным. Объекты блокировки занимают большие объемы памяти.
Производительность системы может снизиться из-за необходимости постоянного получения и освобождения блокировки. Повышается вероятность возникновения взаимоблокировки нитей, так как при большом количестве синхронизируемых ресурсов трудно поддерживать определенный порядок их блокировки. Идеальное решение, как обычно, находится в районе золотой середины.
По этому вопросу до сих пор не достигнут консенсус среди разработчиков ОС. Приверженцы методики крупногранулированной блокировки предлагают использовать сначала небольшое количество объектов, защищающих основные подсистемы, и добавлять их при возникновении эффекта «бутылочного горлышка». Однако в ОС Масп и некоторых других применяется структура с подробной детализацией, в которой блокируются отдельные объекты данных.
Длительность блокировки также требует тщательного анализа. Оптимальным вариантом является удержание ресурса на короткие промежутки времени, что минимизирует степень соперничества при попытке обладания им. Однако в некоторых случаях такой подход может привести к дополнительным операциям занятия и освобождения ресурса. Представьте, что нити требуется произвести две операции над одним и тем же объектом, каждая из которых требует его блокировки. После окончания первой операции нити необходимо совершить некоторое действие, не связанное с объектами.
Нить может освободить ресурс после завершения первой операции и снова занять его при проведении второй. В такой ситуапии лучшим решением может оказаться блокировка ресурса на весь промежуток времени, особенно если промежу- 322 Глава 7. Синхронизация. Многопроцессорные системы точное действие производится быстро. Решения о длительности блокировки объекта должны приниматься в индивидуальном порядке.
7.11. Реализация объектов синхронизации в различных ОС При описании различных методик синхронизации в разделах 7.5 — 7.8 было показано, что операционная система может использовать объекты совместно друг с другом, предлагая тем самым комплексный интерфейс синхронизации ресурсов. В этом разделе будут описаны средства синхронизации в основных многопроцессорных вариантах системы СЛ41Х. 7.11.1. ЗЧВ4.2/МР 8ЧК4.2/МР— это версия системы 8Ъ'К4.2, поддерживающая многопроцессорные архитектуры. ОС обеспечивает четыре типа синхронизации: простую блокировку, блокировку сна, блокировку чтения-записи и переменные синхронизации 117~.
Каждый объект должен запрашиваться или освобождаться явно при помощи операций ххх АЛСОС и ххх ОСАССОС, где ххх — это префикс, зависящий от типа используемого объекта. Операции получения объекта имеют входные аргументы, которые могут быть использованы для отладки. Простые объекты блокировки Простой блокировкой называется нерекурсивный объект тцгех, позволяющий производить краткосрочную блокировку ресурсов. Он не может удерживаться при операциях блокировки нитей. Объект задается переменной типа 1асК г. Для его получения и освобождения используются следующие операции; р1 г СОСК (1осК г *1осКр.
р! г пен )р1); ННСОСК ()осК г )осКр, р) г о)4 1рТ); Вызов СОСК перед запросом объекта изменяет уровень приоритета до пеи 1р1 и возвращает предыдущий уровень )р!. Эта переменная передается операции 0)тСОСК для восстановления предыдущего уровня приоритета. Блокировка чтения-записи Блокировка чтения-записи — это нерекурсивный метод синхронизации, основанный на семантике одного отправителя и нескольких получателей данных. Он не может удерживаться при операциях блокировки нитей. Объект задается переменной типа пе1ос)г г и поддерживает следующие операции: р1 г кн кССОСК 1гн1осК г *!осКр.
р1 г пен 1р1); р1 г кн' ИКСОСК (гн!осК г *1осКр. р1 г пен 1р1); а аи ОНСОСК < )осК г *)осКр, р! г о)П р!); тл 1. Реализация объектов синхронизации в различных ОС 323 Действия с приоритетами прерываний идентичны приведенным для простой блокировки. Операции блокировки изменяют уровень (р! до указанного и возвращают предыдущий уровень. Операция РЧЧ ()(ЧСОСК восстанавливает предыдущее значение уровня (рй Объект блокировки чтения-записи также поддерживает операции РЧЧ ТРЧРОСОСК и РЧЧ ТРЧЧЧРСОСК, це приостанавливающие работу нити.
Блокировка сна Блокировкой сна является применение нерекурсивных взаимных исключений, поддерживающих длительное удержание ресурсов. Такой объект может удерживаться при операциях блокировки нитей. Он реализован в виде переменной типа ь(еер г и поддерживает следующие операции: чщп' 5СЕЕР СОСК (ь1еер ( *1осКр, 1пг рг1), Ьоо1 2 5СЕЕР СОСК 516 (ь1еер г *1оскр, (пь рг1'); чо1п 5СЕЕР ОКСОСК (ь1еер т ~ТасКр); Параметр рп' используется для указания приоритета планирования, который буде~ присвоен процессу после его пробуждения, В случае, когда процесс блокируется в результате вызова 5(ЕЕР СОЕК, он не может прерываться сигналом.
Если процесс блокируется в результате вызова 5СЕЕР СОЕК 516, поступивший сигнал разбудит процесс. Функция возвратит ТППЕ, когда объект будет получен, или РАББЕ, если сон процесса окажется прерванным. Объекты блокировки сна поддерживают и другие операции, такие как 5(ЕЕР 10СК АНА1( (проверка доступных объектов), 5(ЕЕР СОСКОЧЧМЕО (проверяет, не является ли вызывающий процесс обладателем объекта), 5(ЕЕР ТРЧСОСК (возвращает ошибку вместо блокировки процесса в случае невозможности получения объекта). Переменные синхронизации Переменные синхронизации идентичны условным переменным, описанным в разделе 7.7.
Они реализованы в виде переменных типа ьч ~. Условие, которое должно быть защищено простым объектом блокировки, проверяется отдельно пользователями переменной синхронизации. Поддерживаются следующие операции: чтс 5Ч ЫЯП (ьч ь *ьчр, 1п( рщ, 1осК 1 *1осКр): Ьоо1 Г 5Ч йА!Т 516 (ьч Ь *ьчр, 1пг рг1, 1оск т *1осКр): чспд 5Ч 516ИА (ьч ( ьчр, 1п( (1адь); ча(() 5Ч ВРОАОСА51 (ьч Г *ьчр 1'пг Падь>: Так же как и в предыдущем случае, аргумент рп' указывает на приоритет диспетчеризации, который будет присвоен процессу после его пробуждения, а операция 5Ч ЧЧА1Т 516 позволяет прерывание сна по сигналу.