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

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

речь пойдет о применении мониторов для решения проблемы несколь­ких читателей и писателей.

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

86. Синхронизация нескольких читателей и писателей без ущемления писателей

. Если от читателей постоянно поступают запросы на чтение, писателю в течение неопределенно долгого времени может быть отказано в доступе к хранилищу. Этот феномен на­зывается ущемлением писателя (writerstarvation). Ниже показано решение про­блемы путем введения дополнительного семафораwriterWaiting. ОперацияstartWriteтеперь должна захватить семафор writerWaiting до захвата се­мафораreadWriteSemaphore. ОперацияstartReadзахватывает (и освобож­дает) семафор writerWaiting перед тем, как захватитьreaderSemaphore.

Поясним, для чего нужны такие изменения. Предположим, что несколько чи­тателей заняты чтением, а писатель в этот момент пытается обновить данные. Он успешно захватывает семафор writerWaiting, но дальше вынужден ждать, пока читатели освободят семафор readWriteSemaphore. Если приходит новый чи­татель, то он вызывает startRead и приостанавливается, ожидая освобождения семафора writerWaiting. Тем временем уже имеющиеся читатели заканчивают свои операции, и последний освобождает семафор readWriteSemaphore, кото­рый тут же переходит в распоряжение ожидающего писателя, а тот освобождает семафор writerWaiting, позволяя занять его читателю или писателю.

87. Проектирование разъемов для межзадачных Коммуникаций

Классы-разъемы инкапсулируют детали межзадачных коммуникаций, например сильно и слабо связанный обмен сообщениями. Сервисы для межзадачных коммуникаций и синхронизации может предоставлять многозадачное ядро. По­добные механизмы есть также в некоторых языках параллельного программиро­вания, в частности Ada или Java. Но ни один из этих языков не поддерживает сла­бо связанный обмен сообщениями. Чтобы реализовать указанную возможность, необходимо спроектировать скрывающий информацию класс MessageQueue, инкапсулирующий очередь сообщений и предоставляющий операции для досту­па к ней. Классы такого вида называются разъемами.

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

88. Проектирование разъема, реализующего очередь сообщений.

Разъем, реализующий очередь сообщений, используется для инкапсуляции ме­ханизма слабо связанного обмена сообщениями. Это монитор, инкапсулирующий очередь, которая обычно существует в виде связанного списка. Разъем предостав­ляет синхронизированные операции send для отправки сообщения (вызывается за­дачей-производителем) и receive для получения сообщения (вызывается зада­чей-получателем)

Производитель приостанавливается, если очередь заполнена (messageCount=maxCount) и возобновляет работу, когда освобож­дается место для размещения нового сообщения. Поместив сообщение в очередь, производитель продолжает работать и в состоянии посылать новые сообщения. Потребитель приостанавливается, когда очередь пуста (messageCount = 0) и ак­тивизируется, как только в очередь поступит сообщение. Потребитель не при­останавливается, если в очереди есть сообщения. Предполагается, что может быть несколько производителей и один потребитель.

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