ПОД (пособие) (1184372), страница 45
Текст из файла (страница 45)
п.7.). В других ситуациях ее использование не допускается.Дополнительная спецификацияДополнительная спецификация ss и rs , как видно из синтаксиса, являетсянеобязательной.ss есть ERR = lи / или SRSTAT = iosгдеl - специфицирует метку, которой передается управление в случае ошибки припередаче сообщения;145ios - имя переменной или элемента массива целого типа; специфицирует статуссостояния (аналог спецификации IOSTAT в операторах ввода/вывода).В результате выполнения оператора, переменной ios присваиваетсязначение O , если не было обнаружено ошибки, и положительное значение,если обнаружена ошибка.
Классификация видов ошибок определяется реализацией языка.Если спецификация SRSTAT отсутствует, то значение статуса состояния присваиваетсясистемной переменной.Если спецификация ERR отсутствует, то в случае ошибки, задача (и вся программа)завершается выполнением стандартной процедуры ABORT.В качестве дополнительной спецификации rs для оператора RECEIVE, помимоаналогичных спецификаций ERR и SRSTAT, можно также использовать необязательнуюспецификацию SENDER, т.е.rs есть ERR = lи / или SRSTAT = iи / или SENDER = tгде t - переменная типа TASKID.Cпецификацию SENDER полезно использовать, если отсутствует имя процессаотправителя. Переменной t после выполнения оператора RECEIVE присваивается значениеимени процесса-отправителя.Замечание.1.Способ передачи сообщения и число элементов в списках оператора SEND исоответствующего оператора RECEIVE должны совпадать; для каждого элемента - тип, адля массивов также размерность и конфигурация должны соответствовать друг другу.Конфигурация массива - это одномерный массив целого типа, размер которого равенразмерности исходного массива, а элементы равны размерам соответствующих измерений.Несоответствие структуры данных при синхронной передаче считается ошибкой вобоих процессах , при других способах передачи - ошибкой в задаче-отправителе.2.
Если значение переменной адресата есть .NOTASKID. или ссылка на завершенныйпроцесс, оператор обмена для этого процесса не выполняется, а спецификация SENDERполучает значение .NOTASKID. .3.Не считается ошибкой наличие в почтовом ящике невостребованных сообщений призавершении процесса.Использование операторов передачи сообщенийСинхронный режим передачи сообщенийПо определению, синхронный режим передачи сообщений требует одновременноговыполнения в процессах соответствующих операторов, что при расслогласовании работыпроцессов может быть источником "зависания" программы. Достоинством данного методапередачи сообщений является принципиальная возможность проводить обмен данными безиспользования системных буферов, что может ускорить время обмена.Операторы передачи сообщений с пустым списком данных могут использоваться длясинхронизации вычислений программы.Для этого в процессе, управляющем синхронизацией, следует выполнить оператор:SEND(ALL), во всех процессах программы - RECEIVE (T1),где Т1 должен ссылаться науправляющую задачу.
Управляющий процесс продолжиться только после выполнения вовсех задачах оператора RECEIVE. Оператор SEND(А) требует синхронизации только отпроцессов, образованных по программе-задаче А, а SEND(ТМ) - от процессов, на которыессылаются элементы массива ТМ. Если процессам известно, что рандеву будет требоватьначальный процесс, то их синхронизирующий оператор может быть записан: RECEIVE(МАSТЕR()). Точная синтаксическая запись: Т1=МАSTER()RECEIVE (T1)146так как в параметрах операторов передачи сообщений не разрешается использованиявыражений.
Реализации могут иметь расширенное толкование семантики, в частности,допускать использование функций типа TASKID в позициях переменных этого типа.Некоторые реализации могут запрещать в операторах приема сообщений неявные циклы,управляемые параметром, находящимся в этом же списке ввода. Так, в Фортране МВКзапрещены такие конструкции: RECEIVE (<..>) N, (KM(I),I=1,N)Асинхронный режим передачи сообщенийИспользование данного способа обмена сообщениями делает программу еще менеекритичной к согласованию операторов обмена сообщениями, так как процесс-отправительпродолжает работу после передачи сообщения, не дожидаясь конца фактической передачисообщения (и даже начала, так как система интерпретации "должна" сразу же, скопировавпередаваемые данные в буфер, "отпустить" процесс) .
Получатель сообщений этого типаможет выдавать директиву приема сообщения, только удостоверившись в наличии нужногосообщениявпочтовомящикепроцессаприпомощифункций:TESTMSG,TESTTAG,PROBE. Выполнение оператора RECEIVE без проверки наличиясообщения в почтовом ящике процесса, по аналогии с синхронным способом обмена,приводит к задержки выполнения процесса до приема сообщения с заказанным тегом и,возможно, с заданным именем отправителя. Но в отличие от синхронного способа,асинхронный способ позволяют проводить селекцию поступающих сообщений при помощиконструкций выбора.
Пусть процесс может получать сообщения с тегом 1, но от процесса TI- скаляр целого типа, а от процесса TM(1) - массив из 100 целых чисел. Тогда,прием такихсообщений может быть запрограммированно так:IF (TESTTAG(1)) THENSELECT MESSAGECASE(1,TI)RECEIVE (1) KCASE(1,TM(1))RECEIVE (1) KMEND SELECTEND IF или:SELECT MESSAGECASE(1,TI)RECEIVE (1) KCASE(1,TM(1))RECEIVE (1) KMCASE DEFAULTGO TO 2END SELECT 2 CONTINUEОжидание этих сообщений, то есть, по аналогии с синхронной передачей сообщений,прерывание работы процесса до получения сообщения (в данном случае любого изожидаемого) записывается так:SELECT MESSAGECASE(1,TI)RECEIVE (1) KCASE(1,TM(1))RECEIVE (1) KMEND SELECTЕсли сообщения различаются тегами, то конструкция их ожидания может иметь вид:SELECT MESSAGECASE(1)RECEIVE (1) K147CASE(2,TM(1))RECEIVE (2) KMEND SELECTРежим передачи сообщений без ожиданияПередачи сообщений этого типа рекомендуется использовать для передачи данных"впрок", заблаговременно.
Если после операторов SEND / RECEIVE без ожидания,поместить операторы: CALL MSDONE(L),семантика операторов будет совпадать с семантикой асинхронных операторов. Следуетиметь ввиду, что при использовании операторов данного вида в цикле без использованияпроцедур ожидания фактической передачи сообщений возможно искажение передаваемыхданных; семантика функции TESTFLAG при этом будет двусмысленной.Структура элементов списка передаваемых сообщенийСтруктура элементов списка передаваемых (принимаемых) сообщений, как объявлено,совпадает с списком ввода вывода операторов обмена Фортрана. Широкие возможностипредоставляет аппарат неявных циклов.Пусть имеются описания: REAL A(10),B(5,5). Тогда оператор:SEND(ALL)A,(B(I),I=1,5),(B(I,1),I=1,5),(B(I,I),I=1,5) перешлет всем процессампрограммы следующие объекты: - массив А целиком, - первый столбец массива В, диагональные элементы массива В.Этим способом можно организовать не только передачу (прием) любых вырезок ихмассивов, но и множества одинаковых данных, например, переслать пять копий массива В:SEND(ALL)(B,I=1,5)Идентификация абонентов при передачи сообщений в языке ФортранGNS.Идентификация абонентовИдентификация абонентов при организации передачи сообщений может производится поимени процесса (массиву имен) или идентификатору задачи, по описанию которойобразован процесс.
Есть способы безадресных (широковещательных) посылок сообщений "всем", и приема от произвольного отправителя сообщений с заказанной "маркой" - тегом.Идентификация абонентов может быть произведена:а) По имени процессаОсновным способом идентификации абонентов при передаче сообщений являетсязадание имени процесса (системного идентификатора) переменными типа TASKID истандартными функциями этого типа MYTASKID, РАRENT и МАSTER. Использованиеэтих стандартных функций является единственным первоначальным способом сослаться изпорождаемых процессов на имена порождающих процессов, так как начальный диалогмежду процессами возможен только на уровне порожденный-порождаемый. Путем обменасообщениями можно организовать передачу имен процессов для организации произвольнойабонентской сети.Переменные типа TASKID - параметры операторов передачи сообщений могут:- ссылаться на функционирующий процесс,- ссылаться на завершенный процесс,- иметь значение .NOTASKID.,- быть не инициализированными.148Реакция программы на три последних случая не оговаривается в языке и определяетсяреализацией.
Одно из решений - игнорирование оператора обмена сообщениями с такимипараметрами (кроме синхронных операторов, для которых такой случай следует считать"авостом" в программе). Процесс-отправитель имеет возможность организоватьдублирование передаваемых сообщений для передачи их одновременно несколькимпроцессам-получателем. Для этого допускается задание абонентов в параметрах операторапередачи сообщений в виде массива типа TASKID. Сообщение будет передано при этомвсем процессам, на которые есть ссылки через элементы массива. Данная массоваяоперация предпочтительнее передачи сообщений, организованной по-элементнойциклической конструкцией. Цикл предписывает порядок перебора элементов массива абонентов передачи, а для синхронного обмена и завершение очередной передачи допосылки следующего сообщения. Массовая операция обмена может проводитьсяпараллельно и независимо для всех заказанных абонентов.
Массовые операцииассиметричны, нельзя заказать ожидание сообщения от нескольких процессов сразу.Теговая идентификация сообщений и конструкции выбора допускает некоторую вольностьв указаниях об именах отправителей.б) По имени программной единицы-задачиЗадание в операторе передачи сообщений в качестве адресата - получателя именипрограммной единицы-задачи означает рассылку сообщений всем процессам,образованным по описанию указанной задачи на момент выполнения оператора. Случай,когда к этому моменту не было образовано ни одного процесса по указанному образцу,можно рассматривать по аналогии с передачей сообщения процессу с "именем" .NOTASKID.
. Возможность задать в качестве адресата имя главного процесса уточняется вописаниях входных версий языка.в) Безымянные абонентыСпециальный идентификатор ALL в параметре адресата-получателя сообщенияпредписываетпередатьданноесообщениевсемпроцессампрограммы,инициализированным на данный момент.Передача сообщений двумя последними способами предполагает возможностьпараллельной рассылки сообщений и исключение процесса, выполняющего операторпередачи сообщения, из списка абонентов - получателей.г) Помеченные сообщенияПри передаче сообщений асинхронным способом сообщения при отправлениипомечаются целым числом - тегом. Эта разметка дает возможность абонентамидентифицировать сообщения от разных операторов передачи сообщений одного процесса.Получив сообщение с заданным тегом, процесс может узнать имя отправителя, черезаппарат SENDERов.