112 Глава3
ключительное управление; если в ресурсы не требуется вносить изменений, програм-
ме следует запросить разделяемое управление, позволяющее осуществлять доступ
совместно с другими программами, не требующими исключительного управления.
Если ресурс недоступен, система приостанавливает выполнение запрашивающей
программы до тех пор, пока ресурс не освободится. Когда программе больше не тре-
буется управление ресурсом, она использует макрос DEQ для его освобождения.
Что такое блокировка?
Посредством блокировки (locking) система осуществляет синхронизацию использо-
вания системных ресурсов авторизованными подпрограммами и (в Parallel Sysplex)
процессорами. Блокировка (lock) представляет собой именованное поле в памяти,
указывающее, используется ли ресурс и кто его использует. В z/OS существует два ти-
па блокировок: глобальные блокировки, предназначенные для ресурсов, связанных
с несколькими адресными пространствами, и локальные блокировки, предназначен
-
ные для ресурсов, назначенных определенному адресному пространству. Глобальные
блокировки накладываются для подпрограмм, не допускающих многократное или
совместное использование, и различных ресурсов.
Для того чтобы использовать ресурс, защищенный блокировкой, подпрограмма
должна сначала запросить блокировку для этого ресурса. Если блокировка недоступ-
на (другими словами, если она уже получена другой программой или процессором),
то программа или процессор, запросившие блокировку, предпринимают действие,
зависящее от того, используется ли спин-блокировка (spin lock) или отсроченная
блокировка (suspend lock):
• Если спин-блокировка недоступна, запрашивающий процессор продолжает
проверять доступность блокировки до тех пор, пока другой процессор ее не
освободит. Как только блокировка освобождена, запрашивающий процессор
может получить блокировку и таким образом получить управление защищен-
ным ресурсом. Большинство глобальных блокировок являются спин-блоки-
ровками. Держатель спин-блокировки должен быть недоступен для большинс-
тва прерываний (если прервать его выполнение, он может больше никогда
не получить управление, чтобы освободить блокировку).
• Если отсроченная блокировка недоступна, единица работы, запрашивающая
блокировку, приостанавливается до тех пор, пока блокировка не будет доступ-
на. На запрашивающий процессор передается другая работа. Все локальные
блокировки являются отсроченными.
Вам может быть интересно, что случится, если каждый из двух пользователей запро-
сит блокировку, удерживаемую другим? Если каждому из них придется ждать вечно, пока
другой не освободит блокировку первым, возникает тупиковая ситуация. В z/OS такая
ситуация называется тупиковой ситуацией (deadlock). К счастью, используемая в z/OS
методология блокировки не допускает возникновения тупиковых ситуаций.
Для того чтобы избежать тупиковой ситуации, блокировки организованы в иерар-
хию и процессор или подпрограмма может запросить только блокировки, располо-
женные выше по иерархии, чем блокировки, удерживаемые ей на данный момент.
Например, тупиковая ситуация может возникнуть, если процессор 1 удерживает бло-