УПРАВЛЕНИЕ ПАРАЛЛЕЛЬНЫМИ ПРОЦЕССАМИ |
Параллельные процессы в CAPER обеспечены разнообразными средствами управления
и взаимного воздействия. Помимо тех очевидных средств, которые возможно организовать с помощью общих переменных и которые будут рассмотрены далее в примерах, имеются прямые средства воздействия на ход параллельных процессов. STOP <номер процесса 1>, <номер процесса 2>, . . . , <номер процесса N> или функцией StopProcess( <номер процесса 1>, <номер процесса 2>, . . . , где <номер процесса i> - число – числовой идентификатор параллельно запущенного процесса. ACTIVATE <номер процесса 1>, <номер процесса 2>, . . . , <номер процесса N> или функцией ActivateProc( [{ <номер процесса > } ] ), где <номер потока> - число. Функция активизирует приостановленные ранее параллельные процессы;
если параметры отсутствуют, то активизируются все параллельные ветки.Остановленные процессы могут и не возобновиться. Если завершат работу все BreakProc( <номер процесса 1>, <номер процесса 2>, . . . , осуществляет выборочное принудительное завершение процессов.Полное принудительное завершение параллельных процессов осуществляется командой PARABREAK [ TO <номер процесса> ] Данный оператор для синхронного и асинхронного режимов ведет себя по разному: Пример: В то же время do asynch bL1( p1), bL2, bL3( p31, p32, p33 ) block bL2 block bL3( fp31, fp32, fp33 ) В данном примере в bL2 асинхронный параллельный процесс прерывается, машина CAPER переводится в режим последовательного выполнения программы, активным остается bL3. do asynch bL1( p1 ), bL2, bL3( p31, p32, p33 ) * Если выполнено условие, останавливаем два процесса CAPER позволяет контролировать ход управления параллельными вычислениями с
помощью вызова блока команд в момент переключения с одного параллельного процесса на другой. В вызванном блоке можно переопределить схему выполнения параллельных процессов. FreezeNext() "замораживает" запуск Next-блока, а NEXT-блоки должны быть откомпилированы в режиме flow, ибо в противном случае
после вызова такого блока и выполнения его первой команды виртуальный процессор
попытается переключить параллельную ветвь и вновь вызовет NEXT-блок, и т.д., что приведет к забиванию стека вызовов. PASS [ TO <арифметическое выражение> ] Если просто PASS, то управление передается очередному по порядку параллельному процессу. Если указан номер процесса - число, как значение арифметическоговыражения, - то машина CAPER переключит на параллельную ветвь с указанным номером. С помощью функции SetQuant( <квант>, <номер процесса> [ {, <номер процесса i>} ]) можно в ходе вычислений изменять кванты времени процессов. |
АДРЕСОВАНИЕ И ИСПОЛНЕНИЕ ОТДЕЛЬНЫХ КОМАНД |
CAPER позволяет адресовать отдельные команды блоков. С этой возможностью связаны несколько дополнительных нетрадиционных средств управления ходом вычислений и выполнения команд. Эти средства обеспечены, в основном, функциями среды и методами компиляции. Address() возвращает указание (адрес) команды, в которой присутствует данная функция. ElementCnt( <указание блока> ) - возвращает количество элементов в блоке;если это блок команд, то количество команд блока, если блок данных, то количество данных блока, если блок типа TEXT, то количество строк. GetAddr( <имя блока> ) - возвращает указание на начало блока. GetElement( <указание блока>, <номер элемента> ) - возвращает адрес элемента блока или сам элемент; <указание блока> - символическое имя блока или указатель блока. см. в "Динамическая компиляция и загрузка" |