Главная страница
Навигация по странице:

  • Пример задания

  • Дополнительные пояснения

  • Parenttask

  • – экземпляр класса критическая секция } …Cs . Enter ; { начать критическую секцию } CsB ; Cs .

  • ); /* выделение критической секции между фигурными скобками */ { CsB ; }

  • ОС. Зад _ОС. Общие требования к заданию 2


    Скачать 80 Kb.
    НазваниеОбщие требования к заданию 2
    Дата05.05.2021
    Размер80 Kb.
    Формат файлаdoc
    Имя файлаЗад _ОС.doc
    ТипДокументы
    #201917

    Общие требования к заданию №2


    « Программирование параллельных процессов»
    Необходимо написать и отладить программу, которая реализует параллельное выполнение нескольких задач, каждая из которых решает некоторую заданную функцию. Задан граф задач, т. е. определена последовательность их выполнения, а также необходимость параллельного выполнения некоторых задач относительно друг друга. В соответствии с видом графа одни задачи могут инициировать выполнение других. Задачи могут использовать общие (разделяемые) объекты и данные, поэтому в проектируемой программе необходимо предусмотреть синхронизацию доступа к таким объектам и данным. Следовательно, общие требования к разрабатываемому ПО можно сформулировать следующим образом:

    • программа должна функционировать в мультизадачной (мультипрограммной) среде (Windows- 7, 8 и т. д. , UNIX и т.п.);

    • язык программирования – по усмотрению разработчика. Рекомендуемые языки – Delphi, Visual C++, C#, Java;

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

    • при проектировании программы необходимо обязательно использовать средства синхронизации доступа к разделяемым объектам и данным;

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

    Теоретический материал находится в четвёртом разделе пособия , “Основы организации мультипрограммных вычислительных систем”.

    Содержание отчёта



    1. Описание задания с указанием конкретного графа задач, функций каждой задачи.

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

    3. Текст программы с содержательными и обязательными комментариями на русском языке.

    4. Протокол выполнения задач (результат выполнения программы).



    Протокол выполнения задач включает следующую информацию (по каждой задаче):

    • время начала выполнения задачи;

    • имя задачи, которая инициировала выполнение данной задачи;

    • результат выполнения заданной функции;

    • имя задачи, которую инициирует данная задача;

    • время окончания выполнения задачи.




    Пример задания:

    B F

    A

    C E G K

    D H
    Имя задачи L(длительность) P(приоритет) Функция

    A

    1

    0

    Генерирует массив M[1..n,1..n] - integer

    B

    2

    2

    F1(M)

    C

    1

    1

    F2(M)

    D

    2

    2

    F3(M)

    E

    1

    2

    F4(F2)

    F

    1

    3

    F5(F1,F3,F4)

    G

    1

    3

    F6(F1,F3,F4)

    H

    1

    3

    F7(F1,F3,F4)

    K

    1

    4

    F8(F5,F6,F7)



    Примечания:

    Значения L и P носят условный характер, и определяются в задании только для того , чтобы разработчик программы заранее не мог знать какая задача сможет закончить своё выполнение раньше, например параллельные задачи B,D или E. Любая из этих задач может инициировать запуск задач F,G,H, причём, это должна сделать та задача, которая реально будет заканчиваться последней. Для того, чтобы задача В могла инициировать запуск задач F,G и H , она должна точно определить , что задачи D и Е уже закончили своё выполнение. Следовательно, перед своим окончанием, задача В должна определить состояние задач D и Е. Тоже самое можно сказать относительно задач D и Е. Определение состояния задачи можно организовать с помощью

    1. введения общих ( разделяемых) переменных, которые по смыслу могут быть счётчиками числа задач или флагами задач.

    2. Размерность массивов определяется разработчиком (рекомендуемые размерности 3<=n<=6 ).

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


    Рекомендации


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

    2. Синхронизация параллельных процессов (потоков), при доступе к общим разделяемым ресурсам, может быть программно реализована с помощью использования классов синхронизирующих объектов типа – TcriticalSection или TMutex, TEvent, использования функции Lock() и соответствующих методов указанных классов объектов...

    3. Динамика выполнения параллельных процессов (потоков) в рамках пользовательского интерфейса может быть программно реализована с помощью классов TProgressBar или TGauge.

    Дополнительные пояснения
    Рассмотрим следующий граф задач:



    Заданы следующие характеристики задач:


    Имя задачи

    Длительность выполнения в условных единицах

    Приоритет задачи в условных единицах

    Выполняемая функция

    A

    1

    0

    Генерация M[1..n]

    B

    1

    1

    F1(M)

    C

    1

    1

    F2(M)

    D

    1

    2

    F3(F1,F2)


    Длительности и приоритеты задач заданы таким образом, чтобы нельзя было заранее считать, какая из двух параллельных задач B или C закончат своё выполнение раньше. В соответствии с графом, B и C активизируются одновременно задачей A, а также имеют одинаковую длительность и значение приоритета.

    Задача D должна активизироваться той задачей, которая будет заканчиваться последней по времени. Поэтому задача B, прежде чем закончить своё выполнение должна определить состояние задачи C. Ecли, задача C закончилась, то B является последней и она активизирует задачу D. В противном случае она этого не делает, а просто заканчивается. Аналогично действует задача С, проверяя состояние задачи B. Для проверки состояния задач при программировании удобно использовать специальные переменные – флаги задач, показывающие их состояние.

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

    1. Обращение к таймеру ( определение времени начала выполнения задачи).

    2. Вывод в поле вывода – какой задачей была активизирована данная.

    3. Определение значения функции задачи.

    4. Отображение динамики выполнения задачи.

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

    6. Обращение к таймеру (определение времени окончания задачи) с соответствующем выводом в поле вывода.


    Для задачи A пятый пункт алгоритма упрощается до безусловной активизации с помощью соответствующих вызовов задач B и C, а для задачи D этот пункт будет вообще отсутствовать.

    Примерный программный код (нотация Pascal) для 5-го пункта задачи В будет выглядеть следующим образом:

    If ThrC.fininised then { если задача С уже закончилась, проверка флага задачи С}

    Begin

    Parenttask:=’B’; { запускающей задачей для задачи D будет задача В }

    ThrD.resume; { запуск задачи D }

    Text:= ‘ Задача B запустила задачу D‘;

    Synchronize(Wr); { метод вывода в общее поле, Wr – имя процедуры с кодом операций вывода }

    End;

    ThrB.finished:=true; { B заканчивает своё выполнение, флаг задачи в истину }
    Здесь: ThrA, ThrB, ThrC, ThrD – экземпляры класса TTread, finished – поле флагов задач, resume – метод запуска потока. Программный код 5-го пункта задачи С имеет аналогичный вид (но не тождественный).

    В вышеуказанном фрагменте программного кода ( обозначим его CsB) используются несколько видов критических ресурсов – флаги задач ThrC.fininised, ThrB.finished, переменная для определения запускающей задачи – Parenttask ( она общая для задач В и С ), а также переменная Text. Поэтому данный программный фрагмент представляет критическую секцию, доступ к которой должен быть синхронизирован со стороны параллельных потоков. Для этого нужно использовать программные средства синхронизации типа семафорных операций:

    P(S); { закрыть семафор S }

    CsB; { критическая секция задачи В }

    V(S); { открыть семафор S }
    Можно использовать аналоги семафорных операций, например:
    Var

    Cs: TCriticalSection; { Cs – экземпляр класса критическая секция }



    Cs.Enter; { начать критическую секцию }

    CsB;

    Cs.Leave; { закончить критическую секцию }
    Или для языков программирования на основе C:

    Lock(locker); /* выделение критической секции между фигурными скобками */

    {

    CsB;

    }
    Аналогично используются средства синхронизации для задачи С и её критической секции CsC.
    Литература.

    1. Н. В. Кучин А. Ю. Молчанов, Основы организации мультипрограммных вычислительных систем, учебн. пособие, Спб.: ГУАП, 2017. – 103с.

    ЗАДАНИЕ № 5




    Имя задачи

    Длительность

    Приоритет

    Функция

    A

    1

    0

    Генерирует М [1..n, 1..n] - integer

    B

    1

    0

    Генерирует R [1..n ] - Boolean

    C

    1

    1

    f1 (M, R)

    D

    1

    1

    f2 (M, R)

    E

    1

    1

    f3 (M, R)

    F

    1

    1

    f4(M, R)

    G

    1

    1

    f5(M, R)

    H

    1

    2

    f6(f1, f2, f3, f4, f5)

    K

    1

    2

    f7(f1, f2, f3, f4, f5)


    написать администратору сайта