Возникновение взаимной блокировки при применении простых объектов синхронизации
Иногда возникают ситуации, при которых порядок блокировки требуется изменить. Представьте буферный кэш, который обслуживается при помощи двунаправленного связанного списка дисковых буферов.
Также может иметь смысл заглянуть на сайт air-ambulance.ru, ведь именно там можно узнать много нового на тему http://www.air-ambulance.ru/#!contact/crdp. Тема неотложка москва может показаться на первый взгляд незначительной и даже не тематичной. Но стоит посетить сайт air-ambulance.ru, и тема неотложка москва начинает проявлять себя с неожиданной стороны и вызывает всё больший интерес. Дело в том, что тема неотложка москва очень подробно представлена на сайте air-ambulance.ru. Трудно найти более детальное освещение темы неотложка москва чем это сделано на сайте air-ambulance.ru. Спасибо сайту air-ambulance.ru за такое доскональное преподнесение темы неотложка москва.
Список отсортирован в порядке «наиболее давно использовавшихся» (least recently used, LRU) элементов. Все буферы, не используемые в текущий момент времени, занесены в этот список. Защита заголовка очереди, а также указателей на предыдущий и последующий элементы поддерживается при помощи единственного объекта блокировки. Каждый буфер в отдельности использует еще один объект для защиты другой информации, содержащейся внутри буфера. Такой объект необходимо удерживать во время использования буфера.
Если нити необходимо загрузить один из дисковых блоков, сначала она запрашивает буфер (используя для этого хэширование или другие указатели), после чего блокирует его. Затем нить блокирует список LRU для удаления из него полученного блока. Следовательно, обычный порядок блокировки можно описать фразой: «сначала буфер, затем — список».
В некоторых случаях нити нужно получить любой свободный буфер, для чего она обращается к заголовку списка LRU. При этом нить сначала блокирует список и только затем блокирует буфер, оказавшийся в списке первым, после чего удаляет его из списка. Этот случай демонстрирует изменение порядка блокировка на противоположный: нить сначала блокирует список и только затем — буфер.
Можно заметить, что в этом случае возможно возникновение взаимоблокировки. Представьте, что одна нить захватывает буфер из заголовка списка и затем пытается заблокировать сам список. В тот же момент времени другая нить, которая уже заблокировала список, пытается занять буфер из его заголовка. Это приведет к тому, что каждая нить приостановит выполнение в ожидании освобождения блокировки, удерживаемой другой нитью.
Для предупреждения возникновения подобных ситуаций ядро системы использует методику вероятностной блокировки. Если нить пытается получить объект синхронизации в нарушение иерархии, она использует функцию try_lock() вместо lock(). Операция try_lock() применяется для получения объекта, но результатом ее работы в случае обнаружения занятости объекта окажется не блокировка нити, а выход с ошибкой. В приведенном выше примере нить, которой необходимо получить любой свободный буфер, сначала заблокирует список, а затем будет пытаться получить первый свободный объект при помощи операции try_lock(), перемещаясь по списку. Листинг 7.10 показывает пример применения функции try_lock() над простыми объектами синхронизации.
Рекурсивная блокировка
Блокировка называется рекурсивной, если попытка захвата объекта, которым уже обладает нить, окажется успешной и не повлечет приостановку ее выполнения. В каких случаях можно использовать эту возможность? В каких ситуациях нить пытается запросить объект, которым она уже обладает? Обычно такое происходит, если нить, удерживающая ресурс, вызывает процедуру низкого уровня, производящую какие-либо операции с этим ресурсом1. Процедуры могут быть вызваны и другими командами высшего уровня, не занявшими перед этим ресурс. Становится ясно: процедура низкого уровня может попросту не знать о том, что ресурс является заблокированным. Если процедура попытается произвести блокировку, результатом станет зависание процесса.
Опубликовал katy
July 06 2015 18:00:44 ·
0 Комментариев ·
2538 Прочтений ·
• Не нашли ответ на свой вопрос? Тогда задайте вопрос в комментариях или на форуме! •
Комментарии
Нет комментариев.
Добавить комментарий
Рейтинги
Рейтинг доступен только для пользователей.
Пожалуйста, залогиньтесь или зарегистрируйтесь для голосования.
Нет данных для оценки.
Гость
Вы не зарегистрированны? Нажмите здесь для регистрации.