Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Архив2 / курсач docx283 / Kursach_Melnikov.docx
Скачиваний:
55
Добавлен:
07.08.2013
Размер:
79.59 Кб
Скачать

Министерство образования и науки Российской Федерации

Федеральное агентство по образованию

Федеральное государственное бюджетное образовательное учреждение высшего профессионального образования Московский Государственный Технологический Университет

«СТАНКИН»

ФАКУЛЬТЕТ

Информационные технологии

и системы управления

КАФЕДРА

Компьютерные системы управления

Курсовой проект по курсу «Операционные системы реального времени»

Тема: «Синхронизация потоков, проблема производителя – потребителя»

Среда разработки: 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. Постановка задачи

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

Хорошим примером являются программы, управляемые событиями. «Событие» это то, что происходит для того, что бы программа ответила: пользователь нажимает кнопку или перемещает мышь, блок данных поступает с диска, пакет данных приходит по сети, заканчивается выполняемая операция.

Всякий раз, когда происходит событие, поток-производитель создает объект события и добавляет его в буфер событий. Одновременно с этим, потребительские потоки принимают события из буфера и обрабатывают их. В этом случае потребителей называют «обработчиками событий»

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

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

• Если поток-потребитель приходит, в то время, когда буфер пуст, происходит блокировка, пока производитель не добавляет новый элемент.

Предположим, что производители должны выполнить следующие операции многократно:

1 event = waitForEvent()

2 Buffer.Add(event)

Листинг. 1 Основной код производителя

Кроме того, предполагается, что потребители выполнят следующие операции:

1 event = buffer.get()

2 Event.Process()

Листинг. 2 Основной код производителя потребителя

Как было указано выше, доступ к буферу должен быть эксклюзивным, но waitForEvent и event.process могут сработать одновременно.

Задача: Добавить в код производителя и потребителя операторы синхронизации, для обеспечения ее корректной работы.

  1. Сигнал производителя – потребителя

Переменные, которые мы могли бы использовать:

1 mutex = Semaphore(1)

2 items = Semaphore(0)

3 Local event

Листинг. 3 Инициализация производителя-потребителя

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

Переменная event является локальной переменной, которая в данном контексте означает, что каждый поток имеет свою версию.

До сих пор мы предполагали, что у всех потоков есть доступ ко всем переменным, но мы назначим переменную к каждому потоку.

Есть несколько способов, как это может быть реализовано в различных условиях.

• Если каждый поток имеет свой собственный стек времени выполнения, то любые переменные, находящиеся в стеке, являются переменными конкретного потока.

• Если потоки представлены как объекты, мы можем добавить атрибут к каждому объекту потоку

• Если потоки имеют уникальные идентификаторы, мы можем использовать идентификаторы в качестве индекса массива или хеш-таблицы, и хранить там данные для каждого потока.

В большинстве программы переменные являются локальными, однако в нашем случае переменные будут общими, если они явно не обвялены как локальные.

  1. Решение проблемы производителя потребителя

Код решения:

1 event = waitForEvent()

Соседние файлы в папке курсач docx283