Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
shpory_sistemy_realnogo_vremeni_p.doc
Скачиваний:
64
Добавлен:
06.03.2016
Размер:
1.73 Mб
Скачать

81. Синхронизация доступа к классам

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

Отделив вопрос о том, что делает класс (спецификация операций), от того, как это делается (проект класса), мы можем изолировать пользователей от моди­фикаций внутреннего устройства класса. Допустимо следующее:

– трансформировать внутренние структуры данных, например применить связанный список вместо массива;

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

Описанные изменения влияют только на внутреннее устройство класса: на внутренние структуры данных и внутренние операции, которые имеют доступ к этим структурам.

82. Пример синхронизации доступа к классу

В качестве примера рассмотрим класс абстрагирования данных Хранилище Показаний Аналоговых Датчиков. При проектировании этого класса нужно принять решение о том, будет ли информация храниться в массиве или в связан­ном списке. Другое решение касается синхронизации: может ли к объекту такого класса осуществляться параллельный доступ и, если да, следует использовать ал­горитм взаимного исключения или алгоритм читателей и писателей. Оба реше­ния относятся только к проектированию класса, не затрагивая его пользователей.

Отделив вопрос о том, что делает класс (спецификация операций), от того, как это делается (проект класса), мы можем изолировать пользователей от моди­фикаций внутреннего устройства класса. Допустимо следующее:

– трансформировать внутренние структуры данных, например применить связанный список вместо массива;

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

Описанные изменения влияют только на внутреннее устройство класса: на внутренние структуры данных и внутренние операции, которые имеют доступ к этим структурам.

83. Синхронизация методом взаимного исключения.

Сначала рассмотрим решение, основанное на взаимном исключении. В таком случае используется предоставляемый операционной системой двоичный семафор, у которого есть операции acquire (запросить) и release (освободить). Чтобы гарантировать взаимное исключение, каждая задача должна вызвать операцию acquire семафора readWriteSemaphore (изначально он установлен в единицу) перед тем, как пытаться получить доступ к хранилищу. Закончив работу с храни­лищем, задача обращается к операции release. При выполнении операции обновить надо не только записать в хранилище новое значение датчика, но и проверить условие тревоги.

84. Синхронизация нескольких читателей и писателей

Применение указанного метода позволяет нескольким читателям одновре­менно обращаться к хранилищу, но любой писатель получает монопольный до­ступ. Для этого применяются два двоичных семафора: readerSemaphore и readWriteSemaphore, инициализированных значением 1. Кроме того, хра­нится текущее число Читателей, первоначально равное нулю. Семафор readerSemaphore используется читателями, чтобы гарантировать взаимно исключающее обновление счетчика читателей. Семафор readWriteSemaphore за­действован писателями для обеспечения взаимно исключающего доступа к хра­нилищу. Но к данному семафору обращаются также и читатели. Он захватывается первым читателем перед началом чтения из хранилища и освобождается послед­ним читателем, закончившим чтение.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]