Синхронизация методом взаимного исключения.
Сначала рассмотрим решение, основанное на взаимном исключении. В таком случае используется предоставляемый операционной системой двоичный семафор, у которого есть операции acquire (запросить) и release (освободить). Чтобы гарантировать взаимное исключение, каждая задача должна вызвать операцию acquire семафора readWriteSemaphore (изначально он установлен в единицу) перед тем, как пытаться получить доступ к хранилищу. Закончив работу с хранилищем, задача обращается к операции release. При выполнении операции обновить надо не только записать в хранилище новое значение датчика, но и проверить условие тревоги.
Синхронизация нескольких читателей и писателей
Применение указанного метода позволяет нескольким читателям одновременно обращаться к хранилищу, но любой писатель получает монопольный доступ. Для этого применяются два двоичных семафора: readerSemaphore и readWriteSemaphore, инициализированных значением 1. Кроме того, хранится текущее число Читателей, первоначально равное нулю. Семафор readerSemaphore используется читателями, чтобы гарантировать взаимно исключающее обновление счетчика читателей. Семафор readWriteSemaphore задействован писателями для обеспечения взаимно исключающего доступа к хранилищу. Но к данному семафору обращаются также и читатели. Он захватывается первым читателем перед началом чтения из хранилища и освобождается последним читателем, закончившим чтение.
|
|
Синхронизация нескольких читателей и писателей с помощью монитора.
речь пойдет о применении мониторов для решения проблемы нескольких читателей и писателей.
к задаче посредством алгоритма читателей и писателей мониторы напрямую применяться не могут, так как операция читатьАналоговый Датчик должна одновременно выполняться несколькими читателями. Поэтому мы поступим иначе: инкапсулируем аспекты алгоритма читателей и писателей, касающиеся синхронизации, в монитор и перепроектируем класс Хранилище Показаний Аналоговых Датчиков.
Синхронизация нескольких читателей и писателей без ущемления писателей
. Если от читателей постоянно поступают запросы на чтение, писателю в течение неопределенно долгого времени может быть отказано в доступе к хранилищу. Этот феномен называется ущемлением писателя (writer starvation). Ниже показано решение проблемы путем введения дополнительного семафора writer Waiting. Операция startWrite теперь должна захватить семафор writerWaiting до захвата семафора readWrite Semaphore. Операция startRead захватывает (и освобождает) семафор writerWaiting перед тем, как захватить reader Semaphore.
Поясним, для чего нужны такие изменения. Предположим, что несколько читателей заняты чтением, а писатель в этот момент пытается обновить данные. Он успешно захватывает семафор writerWaiting, но дальше вынужден ждать, пока читатели освободят семафор readWriteSemaphore. Если приходит новый читатель, то он вызывает startRead и приостанавливается, ожидая освобождения семафора writerWaiting. Тем временем уже имеющиеся читатели заканчивают свои операции, и последний освобождает семафор readWriteSemaphore, который тут же переходит в распоряжение ожидающего писателя, а тот освобождает семафор writerWaiting, позволяя занять его читателю или писателю.
|
|
Проектирование разъемов для межзадачных Коммуникаций
Классы-разъемы инкапсулируют детали межзадачных коммуникаций, например сильно и слабо связанный обмен сообщениями. Сервисы для межзадачных коммуникаций и синхронизации может предоставлять многозадачное ядро. Подобные механизмы есть также в некоторых языках параллельного программирования, в частности Ada или Java. Но ни один из этих языков не поддерживает слабо связанный обмен сообщениями. Чтобы реализовать указанную возможность, необходимо спроектировать скрывающий информацию класс MessageQueue, инкапсулирующий очередь сообщений и предоставляющий операции для доступа к ней. Классы такого вида называются разъемами.
Каждый разъем представляет собой монитор, одновременно обеспечивающий синхронизацию и скрывающий информацию о том, как это делается. В разъемах применяется синхронизация по условию. Такие мониторы могут использоваться как в однопроцессорной так и в многопроцессорной системе с разделяемой памятью.
Дата добавления: 2018-08-06; просмотров: 248; Мы поможем в написании вашей работы! |
Мы поможем в написании ваших работ!