Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

TMiYaP

.pdf
Скачиваний:
9
Добавлен:
01.06.2015
Размер:
508.85 Кб
Скачать

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

В приведенном примере реализация может иметь несколько вариантов. Подобная неоднозначность является опасной и должна устраняться.

Образец параллельного алгоритма.

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

Реентерабельность – повторная входимость. В приведенном примере опасность возникает в том случае, когда некоторые блоки алгоритма не допускают произвольное вхождение активности со стороны нескольких потоков. В примере, если блок Д является реентерабельным, возникает опасность одновременного вхождения в этот блок после завершения

действий В и С. При выполнении программы это приводит к оварийной ситуации.

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

Сети Петри.

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

1)Об устойчивости сети (наличие устойчивого состояния с разметкой) 2)О наличии дедлоков (блокировок) сеть переходит в устойчивое

состояние, которое не является допустимым конечным состоянием. 3)О критических состязаниях (в некоторых позициях маркеры

накапливаются)

4)Об избыточности сети (имеются переходы, которые не срабатывают ни при каких условиях)

Параллельные потоки.

Можно заставить заснуть программу на время t=500 Sleep(500).

Функции для порождения и управления потоками.

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

Среди параметров для запуска потока указывается размер стэка. Это значение многие библиотечные функции устанавливают по

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

Важнейшим ресурсом для потока является процессорное время. Потоки, не получающие время, фактически не исполняются.

<Windows.h>

CreateThread (…) – функция создания потока

Если в программе на с++ используются функции ADIWindows,для создания потока вызывается функция CreateTread.

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

Выполняющийся поток может приостанавливаться. Например, вызов функции Sleep, он уведомляет операционную систему о том, что что не

нуждается в течение определенного времени в выделении времени центрального процессора.

Sleepldотказ от продолжения текущего процесса на выделенного кванта времени.

Поток может завершаться естественным образом. Это обычная процедура завершения функции :return }

Винтерфейсе Windowsесть функция, позволяющая принудительно завершать одному потоку другой, если завершающему известен дестриптрор завершаемого потока.

{Suspend (HANDLE) – остановить}

Любой поток может приостанавливать другой поток самостоятельно активировать приостановленный поток не может. Продолжить приостановленный поток {Resume (HANDLE)}

Вбиблиотеке .NETфункции Windowsинкапсулированы в классах пространства временных SyStem::Threading

Имеющиеся классы позволяют выполнять более тонкие операции по управлению потоками. Например, изменять параметры исполнения, управлять безопасностью, влиять на распределение времени в Pool (пуле) потока. В последнем случае программа, создавая собственный Poolнабор потоков может создавать активные приостановленные потоки количество активных потоков и т.д. Тем самым возникает возможность управлять распределением ресурсов параллельно с операционной системой

Вклассе потоков меняется функция для синхронизации с другими потоками.

Например, метод Joinприостанавливает текущий поток до завершения потока, соответствующего возникновению объекта.

Критические ресурсы и синхронизация.

При разработке многопоточных программ их корректность и безопасность связывают с использованием критических ресурсов.

Критическими называются те ресурсы, которые в любой момент времени может использоваться ровно одним потоком. Практически все ресурсы вычислительных систем следует относить к критическим (клавиатура, мышь, экран). Критическими могут быть программные объекты. К ним относятся либо данные, либо программный код.

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

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

1)Критическая область каждого потока использует критический ресурс в течение ограниченного времени 2)Момент начала и завершения критической области не предсказуем

3)Количество вхождений в критическую область каждым потоком наперед не известно.

4)Один поток не может влиять на поведение другого потока ( приостанавливать и завершать) и т.д.

5)Потокам доступны общие переменные и объекты в памяти программы. Опасность варианта синхронизации с помощью общей переменной:

1)Если завершается 1 поток, второй входит в режим блокировки и не завершится никогда.

2)ждущие вершины означают потребление процессорного времени. С точки зрения потребности это неудовлетворимый режим.

Inter-Locked функции.Cr++

1)Read Cr 2)A=A+1 3)Write A

Корректность параллельной работы в потоках во многом зависит от того, изменяется ли содержимое общих переменных согласованно (синхронно). Некоторые, на первый взгляд, простые операции программ на самом деле выполняются в виде последовательности еѐ более простых операций. К таким действиям относят увеличение или уменьшение счетчиков, сложение двух значений, пересылку данных из одного места в другое. Чтобы сделать эти операции безопасными используют Inter-Locked функции. Вызов такой функции гарантирует, что соответствующее действие не будет прервано пока не завершится. Опасность прерывания состоит в том, что параллельно работающие потоки получат доступ (одновременный) к критическому ресурсу.

InterLockedAdd (a.6) a+6 и запишется в а

InterLockedInc (Cr) увеличение счетчика на 1

В библиотеке .NET существуют классы ля неделимых операций. Эти операции именуются, как атомарные.К атомарным кроме сложения и пересылки могут относиться даже более сложные операции. Например, сравнения и последующего копирования одной переменной в другую.

Критические секции.

Некорректности нельзя устранять с помощью trycatch/

TryEnterпытается войти. Потом обязательно нужно вызвать Exit.

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

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

В библиотеке .NET существует класс критической секции (монитор), в котором метод TryEnterвызывается в момент входа, а метод Exitв момент выхода из критической секции.

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

С помощью критических секций допускается синхронизировать потоки только внутри одного приложения.

Сигналы (Event)

Семафоры и мьютексы.

Семафор – это объект для синхронизации, который может использоваться потоками разных приложений.

Объекты семафоры создаются при участии операционной системы. Семафорные переменные хранятся в системной области и доступны. Доступ со стороны отдельных потоков возможен через вызовы системных функций.

Компонентные технологии.

Любой сложный программный комплекс отличается тем, что состоит не только из большого объема кода, но тем, что программный код, возможно, написан на разных языках, отлаживался в разных системах программирования независимыми коллективами разработчиков. Результат работы каждого коллектива – это один или несколько компонентов, которые, являясь независимыми, могут повторно использоваться в разных проектах систем. Создание сложной системы в таком случае выглядит, как комбинирование компонентов. Компоненты являются «кубиками», из которых составляется система в целом. Чтобы сделать возможным такой процесс, необходимо построить специальную технологию построения и использования компонентов.

Проектирование с использованием компонентов особое внимание уделяет компоновке системы. Исторически первым способом компоновки была статическая компоновка.

exe=Source.obj+lib.obj

Основным достоинством статической компоновки является наличие в исполняемом модуле всех необходимых составных частей программы. Такой модуль легко переносится в любую версию операционной системы. Никаких других действий для исполнения (инсталляции) не требуется.

Недостатком статической компоновки является необходимость перекомпилировать и перекомпоновывать систему в целом при внесении любых изменений.

Source.Exe+lib.dll

Динамическая компоновка заключается в построении системы из небольшого по размеру исполняемого модуля и набора файлов динамически подключаемых библиотек. Достоинством динамической компоновки является добавление функциональности по мере необходимости (нужнаяDLLзагружается в нужный момент времени). Недостатком является то, что содержимое DLLзагружается в адресное пространство процессора. Любая ошибка в модуле DLLможет вывести из строя всю систему.

Основной причиной опасности использования DLLсчитается отсутствие механизма контроля соответствия исполняемого кода из exe – файла и кода, загружаемого из DLLфайла.

Использование программных компонентов позволяет повысить безопасность за счет контроля используемого в качестве компонента кода.

VoidMyFunction (inta)

{

}

Идентификация компонента. (GUID)

GUIDсоответствует

 

компонент

Версии компонента

 

COMCORBA

GUID 128 байт

21024

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

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

Специальные функции компонента. (интерфейс IunKnown)

Запросить интерфейс (QueryInterface) Добавить ссылку (AddReff ) Освободить интерфейс (Release)

Взаимодействие внешней системы и компонента описывается набором специальных функций , относящихся к конкретной компонентной технологии. Для технологии COMтребуется, чтобы компонент реализовал интерфейс IUnKnown, в интерфейсе должны быть три метода/три функции, которые вызываются перед исполнением программного кода компонента.

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

Функция AddReff вызывается внешней системой в том случае, когда решено использовать компонент. Компонент увеличивает собственный счетчик ссылок на единицу. Счетчик используется для оптимизации ресурсов. Если компонент имеет пользователей (клиентов), он занимает память и использует другие ресурсы. Если пользователи отсутствуют, компонент завершает свою работу, освобождая ресурсы.

Функция Release при вызове уменьшает счѐтчик использования на единицу.

Component

Client

Middle

 

ware

Component

 

 

 

 

 

Component

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

В операционной системе Windowsэто программное обеспечение встроено, для других операционных систем его необходимо устанавливать дополнительно.

Репозиторий компонентов.

Middle

ware

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

Реестр является информационной системой с БД, в которой на ровне с другой служебной информацией фиксируется соответствие GUIDкомпонента и путь Pathк каталогу, где размещен файл с программным кодом компонента. Эта функция попадает в реестр при инсталляции приложений. В других операционных системах промежуточная программная репозитория объекта. Это также специализированная ИС для хранения информации о компонентах. Компонент может находиться не обязательно в данном компьютере, а в произвольной точке глобальной сети интернет.

Хранение и запуск компонентов осуществляет сервер приложений. В Windowsон является частью самой операционной системы, а в общем случае входит в промежуточное ПО (Middleware). Основная задача сервера приложений – управление сервисом вычислений. Клиенты запрашивают сервис нужного компонента, а сервер приложений отыскивает нужный компонент, запускает необходимое число экземпляров компонента при необходимости приостанавливать работу других компонентов и т.д.

Внепроцессный сервер.

Исполнение компонента осуществляется одним из 2-х способов: 1-ый как внутри процессного сервера, 2-ой как вне процессного сервера.

1-ый вариант традиционно используется в случае динамической компоновки. Программный код компонента из DLLпомещается в адресное пространство основного процесса. Такой вариант опасен тем, что ошибка в программе компонента выводит из строя приложение в целом.

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

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