Министерство образования и науки Российской Федерации
Федеральное агентство по образованию
Федеральное государственное бюджетное образовательное учреждение высшего профессионального образования Московский Государственный Технологический Университет
«СТАНКИН»
ФАКУЛЬТЕТ Информационные технологии и системы управления |
КАФЕДРА Компьютерные системы управления |
Курсовой проект по курсу «Операционные системы реального времени»
Тема: «Синхронизация потоков, проблема производителя – потребителя»
Среда разработки: VS2010
Среда исполнения: Windows RTX
Выполнил: |
|
|
|
|
|
| |
студент гр. ИДМ-11-05 |
|
|
|
|
|
Мельников К.О. | |
|
|
(дата) |
|
(подпись) |
|
| |
|
|
|
|
|
|
| |
Принял: |
|
|
|
|
|
| |
преподаватель |
|
|
|
|
Бондаренко А.И. |
| |
|
|
(дата) |
|
(подпись) |
|
|
Москва – 2012 год
Оглавление
1.Постановка задачи 2
2.Сигнал производителя – потребителя 4
3.Решение проблемы производителя потребителя 5
4.Deadlock #4 8
5.Производитель – потребитель с конечным буфером 8
6.Сигнал конечного буфера производителя потребителя 9
7.Конечный буфер производителя потребителя. Решение. 9
8.ОСРВ RTX 10
9.Постановка задачи 11
10.Листинг программы 11
11.Результаты работы 18
12.Список литературы 19
Постановка задачи
В многопоточных программах часто возникает разделение труда между потоками. В общей картине некоторые потоки являются производителями, а некоторые потребителями. Производители создают данные и помещают их в структуру данных, потребители забирают данные и обрабатывают их.
Хорошим примером являются программы, управляемые событиями. «Событие» это то, что происходит для того, что бы программа ответила: пользователь нажимает кнопку или перемещает мышь, блок данных поступает с диска, пакет данных приходит по сети, заканчивается выполняемая операция.
Всякий раз, когда происходит событие, поток-производитель создает объект события и добавляет его в буфер событий. Одновременно с этим, потребительские потоки принимают события из буфера и обрабатывают их. В этом случае потребителей называют «обработчиками событий»
Есть несколько ограничений синхронизации, которые нужны нам для того, что бы система функционировала корректно.
• В то время как элемент добавляется или удаляется из буфера, буфер находится в несогласованном состоянии. Таким образом, потоки должны иметь эксклюзивный доступ к буферу.
• Если поток-потребитель приходит, в то время, когда буфер пуст, происходит блокировка, пока производитель не добавляет новый элемент.
Предположим, что производители должны выполнить следующие операции многократно:
1 event = waitForEvent()
2 Buffer.Add(event)
Листинг. 1 Основной код производителя
Кроме того, предполагается, что потребители выполнят следующие операции:
1 event = buffer.get()
2 Event.Process()
Листинг. 2 Основной код производителя потребителя
Как было указано выше, доступ к буферу должен быть эксклюзивным, но waitForEvent и event.process могут сработать одновременно.
Задача: Добавить в код производителя и потребителя операторы синхронизации, для обеспечения ее корректной работы.
Сигнал производителя – потребителя
Переменные, которые мы могли бы использовать:
1 mutex = Semaphore(1)
2 items = Semaphore(0)
3 Local event
Листинг. 3 Инициализация производителя-потребителя
Взаимное исключение обеспечивает эксклюзивный доступ к буферу. Когда переменная положительна, это указывает число элементов в буфере, когда она отрицательна, это указывает число потребительских потоков в очереди.
Переменная event является локальной переменной, которая в данном контексте означает, что каждый поток имеет свою версию.
До сих пор мы предполагали, что у всех потоков есть доступ ко всем переменным, но мы назначим переменную к каждому потоку.
Есть несколько способов, как это может быть реализовано в различных условиях.
• Если каждый поток имеет свой собственный стек времени выполнения, то любые переменные, находящиеся в стеке, являются переменными конкретного потока.
• Если потоки представлены как объекты, мы можем добавить атрибут к каждому объекту потоку
• Если потоки имеют уникальные идентификаторы, мы можем использовать идентификаторы в качестве индекса массива или хеш-таблицы, и хранить там данные для каждого потока.
В большинстве программы переменные являются локальными, однако в нашем случае переменные будут общими, если они явно не обвялены как локальные.
Решение проблемы производителя потребителя
Код решения:
1 event = waitForEvent()