Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология
Образование Политология Производство Психология Стандартизация Технологии


Синхронизация доступа задач к общему ресурсу



Ресурс – это общий термин, описы­вающий физическое устройство или область памяти, которые могут одно­временно использоваться только од­ной задачей. Процессорное время тоже представляет собой своеобразный кон­курентно используемый ресурс вычис­лительной системы. Примерам физических устройств могут служить кла­виатура, дисплей, дисковый накоп­итель, принтер и т. п. Представим, на­пример, что несколько задач пытаются одновременно выводить данные на принтер. На распечатке в результате ничего, кроме странной мешанины символов, мы не увидим.

Второй пример, думаю, можно не писать.

В качестве другого примера рассмотрим ситуа­цию, когда в бортовом компьютере мирно летящего самолета МИГ-29 сре­ди прочих работают две задачи. Одна из них, взаимодействуя с радиолокаци­онной системой, выдаст удаление и на­правление до цели, а другая задача ис­пользует эти данные для пуска ракет класса «воздух-воздух». Не исключено, что первая задача, записав в глобаль­ную структуру данных удаление до це­ли, будет прервана второй задачей, не успев записать туда направление до це­ли. В результате вторая задача считает из этой структуры ошибочные данные, что может привести к неудачному пус­ку со всеми вытекающими отсюда не­приятными последствиями. Прервись первая задача чуть позже, и все было бы нормально.

 

Упомянутые здесь пробле­мы обусловлены времязависимыми ошибками (time dependent error), или «гонками» и характерны для многоза­дачных ОС, применяющих алгоритмы планирования с вытеснением (кстати, системы с разделением времени также относятся к категории «вытесняющих»).

Приведенный пример показывает, что ошибки, обусловленные «гонками», а) характерны для работы с любыми ресурсами, доступ к которым имеют несколько задач, и б) происходят толь­ко в результате совпадения определен­ных условий, а потому с трудом обна­руживаются на этапе отладки.

Вот возможные пути решения проб­лемы.

1.He использовать алгоритмы плани­рования задач с вытеснением. Это ре­шение, правда, не всегда приемлемо.

2. Использовать специальный сервер ресурса, то есть задачу ответствен­ную за упорядочивание доступа к ре­сурсу. В этом случае запрос на изме­нение значения глобальных данных посылается этому серверу в виде со­общения. Аналогичный подход при­меним и для физических устройств. Так, например, задача может послать данные на печать в виде сообщения, направленного к серверу принтера.

3. Запретить прерывания на время до­ступа к разделяемым данным. Карди­нальное решение, которое, впрочем, не приветствуется в системах реаль­ного времени.

4. Использовать для упорядочивания доступа к глобальным данным сема­форы. Наиболее часто применяемое решение, которое, впрочем, может привести в некоторых случаях к «ин­версии приоритетов».


15. Семафоры

Семафор – это то средство, которое часто используется для син­хронизации доступа к ресурсам. В про­стейшем случае семафор представляет собой байтовую переменную, прини­мающую значение 0 или 1. Задача, пе­ред тем как использовать ресурс, захва­тывает семафор, после чего остальные задачи, желающие использовать тот же ресурс, должны ждать, пока семафор (ресурс) освободится. Существуют так­же так называемые счетные семафоры, где семафор представляет собой счет­чик. Пусть к системе подключено три принтера. Семафор, отвечающий за до­ступ к функциям печати, инициализи­руется со значением 5, а затем каждый раз, когда какая-либо задача запраши­вает семафор для осуществления печа­ти, его значение уменьшается на 1. После завершения печати задача осво­бождает семафор, в результате чего значение последнего увеличивается на 1. Если текущее значение семафора равно 0, то ресурс считается недоступ­ным, и задачи, запрашивающие печать, должны ждать, пока не освободится хо­тя бы один принтер. Таким образом мо­жет производиться синхронизация до­ступа множества задач к группе из 3 принтеров.

 Работа с семафорами происходит на уровне системных вызовов.


16. Критические секции, мутексы

Участки кода программ, где проис­ходит обращение к разделяемым ре­сурсам, называются критическими секциями.

Так как процессы обычно не имеют доступа к данным друг друга, а ресурсы физических устройств, как правило, управляются специальными задачами-серверами (драйверами), наиболее ти­пична ситуация, когда «гонки» за до­ступ к глобальным переменным устраивают различные потоки, исполняе­мые в рамках одного программного модуля. Для того чтобы гарантировать, что критическая секция кода исполня­ется в каждый момент времени только одним потоком, используют механизм взаимоисключающего доступа, или попросту мутексов ( Mutual Exclusion Locks , Mutex). Практически мутекс представляет собой разновидность се­мафора, который сигнализирует дру­гим потокам, что критическая секция кода кем-то уже выполняется.

Критическая секция, использующая мутекс, должна иметь определенные суффиксную и префиксную части.

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


Поделиться:



Последнее изменение этой страницы: 2019-04-21; Просмотров: 174; Нарушение авторского права страницы


lektsia.com 2007 - 2024 год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! (0.01 с.)
Главная | Случайная страница | Обратная связь