- •Часть 1
- •Общая характеристика алгоритмов
- •Реализуемые алгоритмы
- •Порядок формирования индивидуальных заданий
- •Формирование индивидуального задания. Опорный пример
- •Запись комбинаций параметров настройки панели
- •Меню Настройки
- •Порядок записи комбинаций заданных параметров
- •Порядок загрузки параметров
- •Алгоритм a001: Пустой алгоритм - проходная интерпретация
- •Описание алгоритма
- •Исходный текст программной реализации
- •Алгоритм a101: Единичный алгоритм
- •Описание алгоритма
- •Исходный текст программной реализации
- •Алгоритм a211: Последовательность двух команд
- •Описание алгоритма
- •Исходный текст программной реализации
- •Исходное общее описание алгоритма
- •Многопоточные представления
- •Исходный текст программной реализации
- •Алгоритм a232: Параллельная конъюнкции трех команд
- •Исходное общее описание алгоритма
- •Многопоточные представления
- •Исходный текст программной реализации
Исходный текст программной реализации
ВИ: Вертикальное исполнение
def eA211(ccrt, hCycles): # alg A211( ):
hCycles.Zh(ccrt.techsys.head7) # Zh7( ) - типовой цикл СГ7
hCycles.Zh(ccrt.techsys.head6) # Zh6( ) - типовой цикл СГ6
РМУ 3.1 Текущее задание:
Алгоритм A222: Параллельная конъюнкция двух команд
Исходное общее описание алгоритма
СФА: Структурная формула алгоритма
Алгоритм этапа обработки (основного перехода тех. операции):
A222 = (Z7 &Z6) = (Z7 #&Z6) = #(Z7,Z6)& = #Z7,Z6 &
Алгоритм операционного цикла // включая загрузку и разгрузку
A = (Zz – A222 – Zr) = (Zz – (Z7 & Z6) – Zr)
ССА: Структурная схема алгоритма
Вариант 1 Вариант 2
ДИА: Диаграмма исполнения алгоритма: mz7 = 60,mz6 = 70
Многопоточные представления
ССА: Структурная схема алгоритма / Вариант 3
Дополнительный поток (thread):
команда Z6, упакованная в поток
Основной поток (Main)
Структурные операторы:
FZi = F(Zi) = Fork(Zi) – оператор узла вилки:
упаковка в поток и вызов команды Zi в потоке
JZi= J&Zi = J&(Zi) = Join_&(Zi) – оператор узла сборки:
ожидание (wait) завершения команды Zi
ВТА: Вербальный текст алгоритма / ПиПТ: Питон-подобный текст
ГИ: Горизонтальное исполнение
ШТА: Шаблон текста алгоритма
A222 = (Z7 &Z6) = (Z7 #&Z6) = #(Z7,Z6)& = #Z7,Z6 & =
= # Z7Z6 & =#Z7Z6&=#Z7Z6&=
= FZ6Z7JZ6 =FZ6–Z7–J&Z6
// Рабочий оператор Z6 связывают:
// слева вилка # – переходит в структурный оператор FZ6;
// справа сборка & – переходит в структурный оператор J&Z6.
РТА: Рабочий текст алгоритма
alg A222 ( ): Fork(Zh6( )); Zh7( ); Join_&(Zh6( ))
ВИ: Вертикальное исполнение
ШТА: Шаблон текста алгоритма РТА: Рабочий текст алгоритма
A222 = alg A222( ):
| FZ6 Fork(Zh6( ))
| Z7 Zh7( )
| J&Z6 Join_&(Zh6( ))
Исходный текст программной реализации
ВИ: Вертикальное исполнение
Простой вариант:
def eA222(ccrt, hCycles): // alg A222():
thread.start_new(hCycles.Zh, (ccrt.techsys.head6, )) // Fork(Zh6())
hCycles.Zh(ccrt.techsys.head7) // Zh7()
while not ccrt.techsys.head6.yzh: // Join(Zh6()): ожидание (head6.yzh = 1)
pass // пустой оператор тела цикла
// Выполняется активное ожидание события – процессор занят до конца цикл
Более рациональный вариант:
defeA222(ccrt,hCycles): //algA222():
thread.start_new(hCycles.Zh, (ccrt.techsys.head6, )) // Fork(Zh6())
hCycles.Zh(ccrt.techsys.head7) // Zh7()
while not ccrt.techsys.head6.yzh: // Join(Zh6()): ожидание (head6.yzh = 1)
time.sleep(0.1) // Задержка повторения цикла:
// Пассивное (почти пассивное) ожидание события:
// процессор освобождается на время задержки
Диспетчер задач ОС Windows
// начальный всплеск – загрузка конфигурации программы
Отработка цикла eA222
На графике отражается этап ожидания завершения параллельной конъюнкции в цикле while.
Реализуется активное ожидание в пустом цикле.
На время ожидания процессор загружается одним потоком на 100%.
Модификация 1 подпрограммы – ввод в цикл оператора задержка
// вместо пустого оператора pass
defeA222(ccrt,hCycles): //algA222():
thread.start_new(hCycles.Zh, (ccrt.techsys.head6, )) // Fork(Zh6())
hCycles.Zh(ccrt.techsys.head7) // Zh7()
while not ccrt.techsys.head6.yzh: // Join(Zh6(): ожидание (head6.yzh = 1)
time.sleep(0.1) // задержка для разгрузки процессора
Условие завершения проверяется в цикле whileчерез 0.1 сек.
Процессор практически полностью разгружается.
Модификация 2 подпрограммы – вывод сообщения из цикла
на этапе ожидания завершения параллельной дизъюнкции
def eA222(ccrt, hCycles): // alg A222():
thread.start_new(hCycles.Zh, (ccrt.techsys.head6, )) // Fork(Zh6())
hCycles.Zh(ccrt.techsys.head7) // Zh7()
while not ccrt.techsys.head6.yzh: // Join(Zh6(): ожидание (head6.yzh = 1)
time.sleep(0.1) // задержка для разгрузки процессора
print 'yzh6 = 0' // вывод сообщения - работа узла Join
Демонстрация работы цикла ожидания (аналога оператора Join)