Автор работы: Пользователь скрыл имя, 21 Января 2011 в 18:07, курсовая работа
Данная работа состоит из двух основных частей. В теоретической части мы рассмотрим историю возникновения понятия алгоритма, узнаем определение алгоритма, виды и свойства алгоритмов.
В практической части мы выполним решение задачи «О спящем парикмахере» при помощи сети Петри и реализуем данную модель на языке высокого уровня с использованием семафоров (С++).
Введение 3
1 Мультипрограммный режим 4
1.1 Основные положения 4
1.2 Проблема критической секции 5
2 Мониторы хоара 8
2.1 История создания 8
2.2 Определения и основные характеристики 9
2.3 Принцип работы монитора 10
2.4 Условные переменные 11
2.5 Преимущества монитора 12
3 Задача о спящем парикмахере 14
3.1 Постановка задачи 14
3.2 Реализация задачи с помощью сетей Петри 15
3.3 Листинг программы 16
Заключение 22
Список использованных источников 23
Рисунок
2
Таким образом, монитор – такой механизм организации параллелизма, который содержит данные и процедуры, необходимые для реализации динамического распределения общих ресурсов.
Процесс,
желающий получить доступ к разделяемым
переменным, обращается к монитору,
который в свою очередь предоставляет
доступ или отказывает в нем. Вход
в монитор находится под
Условная переменная(conditional variable) – символизирует ожидание потоком, выполняющим метод монитора, наступления некоторого события.
Существует три операции:
Если процесс обращается к некоторой процедуре монитора и обнаруживается, что соответствующий ресурс уже занят, эта процедура монитора выдает команду WAIT с указанием условия ожидания. Процесс мог бы оставаться внутри монитора, но это противоречит принципам взаимоисключения, если в монитор бы затем вошел другой процесс. Поэтому процесс в режиме ожидания вне монитора ждет, пока требуемый ресурс освободится.
Доступ ко всем внутренним данным монитора возможен только изнутри монитора. При первом обращении монитор присваивает своим переменным начальные значения; при последующих обращениях используются сохраненные от предыдущего обращения значения. Для защиты каких-либо данных нужно просто поместить их в монитор.
Процесс, занимавший ресурс, со временем обратится к монитору, чтобы возвратить ресурс системе. Соответствующая процедура монитора может просто принять уведомление об освобождении ресурса и ждать очередного запроса на этот ресурс. Но может оказаться, что уже есть процессы, ожидающие освобождения этого ресурса. Тогда монитор выполняет команду извещения SIGNAL, чтобы один из ожидавших процессов мог получить ресурс и покинуть монитор. Если ресурс никому не требовался, то подобное оповещение не вызывает никаких последствий, а ресурс вносится в список свободных.
Чтобы
гарантировать получение
Для операционной системы реального времени можно организовать дисциплину обслуживания на основе абсолютных или динамически изменяемых приоритетов.
Пример монитора Хоара:
Monitor Resource;
condition free; {условие – свободный}
Var busy : Boolean;
Procedure Request; {запрос}
Begin
If busy then WAIT(free);
busy:=true;
TakeOff;
End;
Procedure Release;
Begin
TakeOn;
busy:=false;
SIGNAL(free)
End;
Begin
busy:=false;
End
Единственный ресурс динамически запрашивается и освобождается процессами, которые обращаются к процедурам REQUEST и RELEASE. Если процесс обращается к REQUEST в тот момент, когда ресурс используется, то значение busy=true, и REQUEST выполнит операцию монитора WAIT(free). Обратившийся процесс помещается в конец очереди процессов, ожидающих, пока не будет выполнено условие free.
Когда процесс, использующий ресурс, обращается к RELEASE, операция монитора SIGNAL(free) деблокирует процесс из начала очереди. Он готов сразу после операции WAIT(free), которая его и блокировала, возобновить выполнение процедуры REQUEST.
Если же SIGNAL(free) выполняется в то время, когда нет ожидающего условия free процесса, то никакие действия не выполняются.
Доступ к разделяемым переменным ограничен телом монитора, а мониторы входят в состав ядра ОС, поэтому разделяемые переменные становятся системными переменными, что автоматически исключает критические интервалы (два процесса никогда не смогут получить одновременного доступа к разделяемым переменным).
Процедуры монитора выполняются только по требованиям процесса.
Преимущества монитора перед другими средствами синхронизации:
Если несколько процессов совместно используют ресурс и работают с ним совершенно одинаково, то в мониторе нужна только одна процедура, в то время как решение с семафорами требует наличия КС в каждом процессе.
Таким образом, мониторы обеспечивают по сравнению с семафорами упрощение организации взаимодействующих вычислительных процессов и большую наглядность при незначительной потере эффективности.
Задача о парикмахере, который спит на работе, является аллегорической демонстрацией подсистемы управления процессами и была сформулирована Дейкстрой в 1968 г.
Парикмахерская состоит из комнаты ожидания О и комнаты, в которой стоит кресло парикмахера З. Через двери Д можно попасть из комнаты О в комнату З, а из комнаты З на улицу. Если парикмахер заходит в комнату ожидания и никого там не находит, то он идет спать. Если клиент заходит в парикмахерскую и находит спящего парикмахера, то он его будит. В комнате ожидания число мест ограничено и равно N.
Согласно
данной задаче необходимо определить
элементы который будут
Рисунок
3 – Задача о спящем
парикмахере
Сети Петри — математический аппарат для моделирования динамических дискретных систем. Впервые описаны Карлом Петри в 1962 году.
Сеть Петри представляет собой двудольный ориентированный граф, состоящий из вершин двух типов — позиций и переходов, соединённых между собой дугами, вершины одного типа не могут быть соединены непосредственно. В позициях могут размещаться метки (маркеры), способные перемещаться по сети.
Событием называют
Общий принцип работы сетей Петри:
Состояние сети определяется её разметкой. Места, из которых ведут дуги на данный переход, называются входными местами для данного перехода. Места, из которых выходят дуги, называются выходными. Выполнение условия обозначается на схеме сети изменением её разметки, т.е. помещением в данное место сети n фишек, где n- это емкость условия.
На
каждом из последующих шагов работы
мы переходим в следующее
Рисунок 4 - Реализация алгоритма с помощью сетей Петри
Для реализации на языке высокого уровня необходимо создать N потоков, которые будут моделировать действия клиентов. В решении предлагается использовать три семафора:
Также используется переменная waiting, предназначенная для подсчета ожидающих посетителей. Она является копией переменной customers. Присутствие в программе этой переменной связано с тем фактом, что прочитать текущее значение семафора невозможно. В этом решении посетитель, заглядывающий в парикмахерскую, должен сосчитать количество ожидающих посетителей. Если посетителей меньше, чем стульев, новый посетитель остается, в противном случае он уходит.
Семафор – это системное средство для синхронизации выполнения процессов, позволяющее войти в заданный участок кода не более чем заданному количеству потоков.
Далее
представим основные фрагменты кода
программы написанной на языке высокого
уровня (С++).
#include<windows.h>
//----------------------------
int yshed = 0; //кол-во ушедших без стрижки
int dovol = 0; //счетчик подстриженных
int count = 0; //ожидающие
int client; //счетчик клиентов
//для
реализации взаимного
HANDLE mutex;
HANDLE customerSemaphore;
//для подсчета ожидающих
//количество брадобреев (0 или 1),простаивающих в ожидании клиента
HANDLE barberSemaphore;
DWORD WINAPI customer(LPVOID); //посетитель
DWORD WINAPI barber(LPVOID); //парикмахер
void getPricheson(); //функция стрижки
randomize();
DWORD SLEEP_STR = rand()%200+250; // время стрижки
DWORDSLEEP_PRX = rand()%2000+2000; //время прихода клиента
void Zprint(AnsiString text) // печать
{