Главная страница

РГР №5 (готово). Параллельные логикоалгоритмические системы


Скачать 213.5 Kb.
НазваниеПараллельные логикоалгоритмические системы
Дата22.11.2019
Размер213.5 Kb.
Формат файлаdoc
Имя файлаРГР №5 (готово).doc
ТипПояснительная записка
#96492
страница2 из 2
1   2

Специальная подготовка алгоритма




          1. ССА: Структурная схема алгоритма. Вариант 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. Итоговая СФА: Структурная формула алгоритма:

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

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

          1. Вербальные (словесные) тексты алгоритма

Промежуточные Питон-подобные формы записи алгоритма

ВТА: Вербальный текст алгоритма

ГИ: Горизонтальное исполнение

ШТА: Шаблон текста алгоиртма

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( ))

ВИ: Вертикальное исполнение

ШТА:

Шаблон текста алгоритма

РТА:

Рабочий текст алгоритма

A40 =

Z5

A40 =

Z5

A40 =

| Z5

A40 =

| Z5

Alg40:

Zh5()

A30 =

Z7



FA40



Z4



JA40



Z7

A30 =

Z7 –

FA40 –

Z4 –

JA40 –

Z7



A30 =

| Z7 –

| FA40 –

| Z4 –

| JA40 –

| Z7


A30 =

| Z7

| FA40

| Z4

| JA40

| Z7

alg A30():

Zh7( )

Fork(A40( ))

Zh4

Join_&(A40( ))

Zh7( )

A20 =

Z3



Z6

A20 =

Z3–

Z6

A20 =

| Z3–

| Z6

A20 =

| Z3

| Z6

Alg20:

Zh3()

Zh6()

A10 =

Z6



FA20



Z0



JA20

A10 =

Z6 –

FA20–

Z0 –

JA20


A10 =

| Z6 –

| FA20–

| Z0 –

| JA20


A10 =

| Z6

| FA20

| Z0

| JA20


alg A10():

Zh6( )

Fork(A20( ))

Zh0

Join_&(A20( ))

A581= FA30



FA10



Z1



JA10



JA30

A581= FA30 –

FA10–

Z1–

JA10 –

JA30–


A581=

| FA30 –

| FA10–

| Z1–

| JA10 –

| JA30–


A581=

| FA30

| FA10

| Z1

| JA10

| JA30


alg A581():

Fork(A30())

Fork(A10())

Zh1()

Join_&(A10())

Join_&(A30())




    1. Многопоточная программная реализация алгоритма

          1. Реализация компонент алгоритма

Далее представлена многопоточная программная реализация заданных фрагментов исходного параллельного алгоритма.

Язык программирования: Питон (Python)

РТА:

Рабочий текст
алгоритма

ИТП:

Исходный текст подпрограмм

Alg40:

Zh5()

def A40(ccrt, hCycles):

hCycles.za40 = 0

# Переменная индикации окончания A40

hCycles.Zh(ccrt.techsys.head5)

hCycles.za40 = 1

# Индикация окончания процесса A40

alg A30():

Zh7( )

Fork(A40( ))

Zh4

Join_&(A40( ))

Zh7( )

def A30(ccrt, hCycles):

hCycles.za30 = 0

# Переменная индикации окончания A30

hCycles.Zh(ccrt.techsys.head7)

thread.start_new(expSub.A40, (ccrt, hCycles, ))

hCycles.Zh(ccrt.techsys.head4)

while not hCycles.za40:

time.sleep(0.1)

hCycles.Zh(ccrt.techsys.head7)

hCycles.za30 = 1

# Индикация окончания процесса A30


alg20:

Zh3()

Zh6()

def A20(ccrt, hCycles):

hCycles.za20 = 0

# Переменная индикации окончания A20

hCycles.Zh(ccrt.techsys.head3)

hCycles.Zh(ccrt.techsys.head6)

hCycles.za20 = 1

# Индикация окончания процесса A20

alg A10():

Zh6( )

Fork(A20( ))

Zh0

Join_&(A20( ))

def A10(ccrt, hCycles):

hCycles.za10 = 0

# Переменная индикации окончания A10

hCycles.Zh(ccrt.techsys.head6)

thread.start_new(expSub.A20, (ccrt, hCycles, ))

hCycles.Zh(ccrt.techsys.head0)

while not hCycles.za20:

time.sleep(0.1)

hCycles.za10 = 1

# Индикация окончания процесса A10

alg A581():

Fork(A30())

Fork(A10())

Zh1()

Join_&(A10(

))

Join_&(A30(

))

def eA581(ccrt, hCycles):

thread.start_new(expSub.A30, (ccrt, hCycles, ))

thread.start_new(expSub.A10, (ccrt, hCycles, ))

hCycles.Zh(ccrt.techsys.head1)

while not hCycles.za10:

while not hCycles.za30:

time.sleep(0.1)




          1. Исходный текст программной реализации

ВИ: Вертикальное исполнение

Первичное решение

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


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