РГР №5 (готово). Параллельные логикоалгоритмические системы
Скачать 213.5 Kb.
|
1 2 Специальная подготовка алгоритмаССА: Структурная схема алгоритма. Вариант 2. Мозаичный стильСФА: Структурная формула алгоритма ИнПрПоФ: Инфиксно-префиксно-постфиксная форма A581 = #(Z7 - (#(Z1 , (Z6 – #(Z0 , (Z3 - Z6))&))& , (Z7 - #(Z4 , Z5)& - Z7)))& ШСА: Штрих-схема алгоритма Связный вариант ИнПрПоФ: Инфиксно-префиксно-постфиксная форма A581 = #(Z7 - (#(Z1 , (Z6 – #(Z0 , (Z3 - Z6))&))& , (Z7 - #(Z4 , Z5)& - Z7)))& = = #(Z7 - (#(Z1 , (Z6 – #(Z0 , (Z3 - Z6))&))& , -------------------------))& = (Z7 - #(Z4 , Z5)& - Z7) = #(Z7 - (#(Z1 , ---------------------------)& , -------------------------))& = (Z6 – #(Z0 , (Z3 - Z6))&) , (Z7 - #(Z4 , Z5)& - Z7) = #(Z7 - (#(Z1 , ---------------------------)& , -------------------------))& = (Z6 – #(Z0 , ---------)&) , (Z7 - #(Z4 , ---)& - Z7) (Z3 - Z6) Z5 Разделение потоков команд алгоритма: A10: A20: A10: A20: Замена обозначений A10: A40: A30: A20: Итоговая СФА: Структурная формула алгоритма:Исходный параллельный алгоритм представлен системой линейных последовательных алгоритмов, взаимосвязанных командами узловой передачи-приемки управления: 1) Дополнительные алгоритмы (подалгоритмы), выделяемые в дополнительные потоки (упаковываются в треды): A40 = Z5 A30 = Z7 – FA40 – Z4 – JA40 – Z7 A20 = Z3 – Z6 A10 = Z6 – FA20 – Z0 – JA20 2) Основной алгоритм (в основном потоке): A581 = FA30 – FA10 – Z1 – JA10 – JA30 Структурные операторы: FZi = F(Zi) = Fork(Zi) – оператор узла вилки: упаковка в поток и вызов команды Zi в потоке J&Zi = J&(Zi) = Join_&(Zi) – оператор узла сборки: ожидание (wait) завершения команды Zi Вербальные (словесные) тексты алгоритмаПромежуточные Питон-подобные формы записи алгоритма ВТА: Вербальный текст алгоритма ГИ: Горизонтальное исполнение ШТА: Шаблон текста алгоиртма A40 = Z5 A30 = Z7 – FA40 – Z4 – JA40 – Z7 A20 = Z3 – Z6 A10 = Z6 – FA20 – Z0 – JA20 A581 = FA30 – FA10 – Z1 – JA10 – JA30 РТА: Рабочий текст алгоритма alg A40( ): Zh5( ) alg A30( ): Zh7; Fork(A40( )); Zh4; Join_&(A40( ));Zh7 alg A20( ): Zh3( );Zh6 alg A10( ): Zh6; Fork(A20( )); Zh0; Join_&(A20( )) alg A581( ): Fork(A30( )); Fork(A10( )); Zh1( ); Join_&(A10( )); Join_&(A30( )) ВИ: Вертикальное исполнение
Многопоточная программная реализация алгоритмаРеализация компонент алгоритмаДалее представлена многопоточная программная реализация заданных фрагментов исходного параллельного алгоритма. Язык программирования: Питон (Python)
ВИ: Вертикальное исполнение Первичное решение def A40(ccrt, hCycles): # подпрограмма дополнительного потока hCycles.za40 = 0 # Введение индикации окончания A40 hCycles.Zh(ccrt.techsys.head5) # СГ5 - типовой цикл hCycles.za40 = 1 # Окончание процесса A40 def A30(ccrt, hCycles): # подпрограмма дополнительного потока hCycles.za30 = 0 # Введение индикации окончания A30 hCycles.Zh(ccrt.techsys.head7) # СГ7 - типовой цикл thread.start_new(expSub.A40, (ccrt, hCycles, )) # поток A40 hCycles.Zh(ccrt.techsys.head4) # СГ4 - типовой цикл while not hCycles.za40: # Контроль окончания A40 time.sleep(0.1) # задержка в цикле ожидания hCycles.za30 = 1 # Окончание процесса A30 def A20(ccrt, hCycles): # подпрограмма дополнительного потока hCycles.za20 = 0 # Введение индикации окончания A20 hCycles.Zh(ccrt.techsys.head3) # СГ3 - типовой цикл hCycles.Zh(ccrt.techsys.head6) # СГ6 - типовой цикл hCycles.za20 = 1 # Окончание процесса A20 def A10(ccrt, hCycles): # подпрограмма дополнительного потока hCycles.za10 = 0 # Введение индикации окончания A10 hCycles.Zh(ccrt.techsys.head6) # СГ6 - типовой цикл thread.start_new(expSub.A20, (ccrt, hCycles, )) # поток A20 hCycles.Zh(ccrt.techsys.head0) # СГ0 - типовой цикл while not hCycles.za20: # Контроль окончания A20 time.sleep(0.1) # задержка в цикле ожидания hCycles.za10 = 1 # Окончание процесса A10 def eA581(ccrt, hCycles): # alg A581() программа основного потока thread.start_new(expSub.A30, (ccrt, hCycles, )) # поток A30 thread.start_new(expSub.A10, (ccrt, hCycles, )) # поток A10 hCycles.Zh(ccrt.techsys.head1) # СГ1 - типовой цикл while not hCycles.za10: # Контроль окончания A10 while not hCycles.za30: # Контроль окончания A30 time.sleep(0.1) # задержка в цикле ожидания 1 2 |