ВЫЗОВЫ БЛОКОВ КОМАНД И ИНИЦИАЦИЯ ПАРАЛЛЕЛЬНЫХ ВЫЧИСЛЕНИЙ |
Ниже приводятся основные операторы управления запуском (DO-запись).Форма 1 (запуск перечислением блоков с параметрами): Форма 2 (запуск перечислением массивов): DO [ SEQ | SYNCH | ASYNCH ] [ ARRAY ] aname1, aname2,..., anameK и обусловленного запуска для обеих форм: IF <условие> <DO-запись> bl1,bl2,...,blk - список дескрипторов вызова блоков команд, имеющие следующие возможные формы: <указатель блока >[( [ <параметр 1>, <параметр 2>, . . . , <параметр N> ] ) ] либо (<указатель блока 1 > , <указатель блока 2 >, . . . , <указатель блока K >) В первом случае указывается указатель блока и, возможно, параметры вызова в
скобках. Во втором случае в круглых скобках перечисляются имена боков, после чего в круглых же скобках - параметры. Эта запись предписывает запуск перечисленных блоков с общими параметрами. В форме 2 anamei ( 1<= i <= K ) – имя переменной – массива, элементами которого являются структуры порожденного по описаниям в internal блоков или их прототипами. quant1,quant2,...,quantk - список квантов времени в миллисекундах, выделяемых
на исполнение блока - перечень числовых значений. Опция SEQ требует последовательного исполнения списка блоков команд, т.е.
перечисленные в списке блоки запускаются последовательно; выполнение процедуры
(блока), инициировавшей данный вызов, приостанавливается до тех пор, пока список
не будет исчерпан. Опции квантования и распределения по компьютерам (или WAIT <событие> либо WAIT IsSynch() (подробнее см. ниже). DO ASYNCH b1,...,bk WITH q1,...,qk+1 (qk+1 - квант времени для работы вызвавшего процесса). Примеры: do Block1 ;* Пример 1 do &var1( ) ;* Пример 2 ******************** Пример 3 ******************* do synch Block1, Block2(parm21, parm22), => ******************** Пример 4 ******************* ******************* Пример 5 ******************* или do Block1, Block2(parm1, null , parm2), Block3 Первые два примера описывают т.н. простой вызов блоков: блок запускается,
вызвавший его блок приостанавливает свое выполнения до завершения вызванного.
причем во втором примере блок запускается через его указание в переменной. DO ASYNCH . . . то текущий режим будет изменен на ASYNCH, в то время как обратное не действует, т.е. вызов DO SYNCH . . . не приведет к изменению режима ASYNCH. Механизм вызовов базируется на стековом управлении: информация о вызвавшем блоке команд записывается в стек, а после возвращения в него удаляется. Возможны прямые способы управления стеком.Для обычного вызова блока в языке присутствует функция CallBlock( <указание блока>, <параметр 1> , . . . , <параметр N> ) где <указание блока> - это либо строка - имя блока, или адрес блока; RETURN [<выражение>] [TO <имя блока>] Если фрагмент с TO опущен, то возврат осуществляется в вызвавший блок. В случае, если текущим (исполняемым) является MAIN, то осуществляется выход из
программы. Если указан иной, чем вызвавший блок, то в стеке вызовов осуществляется поиск атрибутов указываемого блока. Если такие атрибуты существуют (возможно, их несколько), то возврат осуществляется по атрибутам последнего вызова. Поясним. RETURN [<выражение>] - возврат в вызвавший блок. Для параллельно запущенных процессов создается массив возвращаемых значений.
Возвращаемое значение размещается в элемент массива, соответствующего номеру
параллельно исполняемого блока. Т.е. в CAPER создается общее поле результатов
различных вычислений. DO SYNCH bL1, bL2( pVar11, pVar12 ), Block1( pVar21, pVar22 ) Кроме приведенной формы возврата существует оператор обусловленного возврата: IF <выражение0> RETURN [<выражение1>] [TO <имя блока>] Безусловный возврат в операционную среду с прерыванием всех текущих процессов и закрытием всех файлов осуществляется по команде QUIT Кроме того, виртуальной машиной будут выгружены из памяти все загруженные модули. EraseStack( <указание блока> [, <стиль> ] ) <указание блока> - адрес или имя блока; a1, a2, ..., B, aI, ... , B, ... При <стиль> TO_LAST стек сбрасывается до B, помеченного L, при TO_FIRST - BreakStack() - сбрасывает стек полностью. |