Операционная система UNIX. Руководство программиста


Блокировка и разблокирование сегментов


Блокировка сегментов осуществляется практически тем же способом, что и блокировка файлов. Различие состоит только в начальной точке и длине блокируемого участка. Далее мы рассмотрим интересную и практически важную задачу. Есть два сегмента (в одном или двух файлах), которые должны быть изменены одновременно таким образом, чтобы другие процессы не могли получить доступ к промежуточному состоянию изменяемой информации. (Подобные задачи встречаются, например, при необходимости изменить указатели в двунаправленных списках.) Чтобы решить нашу задачу, необходимо ответить на следующие вопросы:

  • Что нужно блокировать?
  • Если сегментов для блокировки много, в каком порядке блокировать и разблокировать их?
  • Что делать в случае удачной блокировки всех нужных сегментов?
  • Что делать в случае неудачи при попытке блокировки некоторого сегмента?

При управлении блокировкой сегментов мы должны планировать свои действия на случай неудачной попытки блокировки. Эти действия в первую очередь зависят от характера информации, хранящейся в тех сегментах, которые мы пытаемся блокировать. Возможны, например, следующие действия:

  • Подождать некоторое время и повторить попытку.
  • Аварийно завершить процедуру и предупредить пользователя.
  • Перевести процесс в состояние ожидания до тех пор, пока не поступит сигнал о снятии блокировки.
  • Скомбинировать перечисленные выше действия.

Теперь рассмотрим пример включения элемента в двунаправленный список. Допустим, что сегмент, после которого мы хотим включить новый элемент, уже заблокирован на чтение. Чтобы этот сегмент можно было корректировать, блокировка должна быть снята и уста- новлена снова или ее уровень повышен до блокировки на запись.

Повышение уровня блокировки (обычно от блокировки на чтение до блокировки на запись) разрешается в том случае, если нет других процессов, заблокировавших на чтение ту же часть файла. Наличие процессов, ожидающих возможности заблокировать на запись ту же часть файла, не мешает повышению уровня: эти процессы останутся в состоянии ожидания. Понижение уровня блокировки с блокировки на запись до блокировки на чтение возможно всегда. В обоих случаях просто изменяется значение вида блокировки. По той причине, что функция lockf(3C) (в соответствии со стандартом /usr/group) не устанавливает блокировки на чтение, изменение уровня блокировки в случае использования этой функции невозможно. Ниже приведен пример блокировки сегмента с последующим изменением ее уровня:




- Начало -  - Назад -  - Вперед -



Книжный магазин