Из Википедии, бесплатной энциклопедии
Перейти к навигации Перейти к поиску

Concurrent Pascal - это язык программирования, разработанный Пером Бринчем Хансеном для написания программ параллельных вычислений , таких как операционные системы и системы мониторинга вычислений в реальном времени на компьютерах с общей памятью . [1]

Отдельный язык, Sequential Pascal , используется в качестве языка для прикладных программ, выполняемых операционными системами, написанными на Concurrent Pascal. Оба языка являются расширениями Никлаус Вирт «s Паскаля , и имеет общий резьбовой код интерпретатор . [2] Ниже описывается, чем Параллельный Паскаль отличается от Паскаля Вирта.

Описание языка [ править ]

Несколько конструкций в Pascal были удалены из Concurrent Pascal для простоты и безопасности: [2]

Эти упущения позволяют гарантировать за счет комбинации проверок времени компиляции и минимальных проверок времени выполнения в интерпретаторе многопоточного кода, что программа не может нанести вред себе или другой программе, обращаясь за пределами выделенного ей пространства.

Параллельный Паскаль включает типы данных класса, монитора и процесса. Экземпляры этих типов объявляются как переменные и инициализируются в initоператоре.

Классы и мониторы похожи: как частные переменные, так и процедуры в пакете с общедоступными процедурами (называемые записями процедур). Экземпляр класса может использоваться только одним процессом, тогда как экземпляр монитора может совместно использоваться процессами. Мониторы предоставляют единственный механизм межпроцессного взаимодействия в программе Concurrent Pascal.

В данном экземпляре монитора одновременно может выполняться только один процесс. Встроенный тип данных, очередь, вместе с операциями delayи continueиспользуются для планирования в мониторах. Каждая переменная типа queue может содержать один процесс. Если в мониторе должно быть отложено много процессов, необходимо предоставить несколько переменных очереди, обычно организованных в виде массива. Переменная одиночной очереди процесса дает монитору полный контроль над среднесрочным планированием, но программист несет ответственность за разблокировку правильного процесса.

У процесса, такого как класс или монитор, есть локальные переменные, процедуры и начальный оператор, но нет записей процедур. Начальный оператор обычно выполняется бесконечно, вызывая локальные процедуры, процедуры класса и процедуры мониторинга. Процессы общаются через процедуры мониторинга. Языковые правила предотвращают тупик, налагая на мониторы иерархию. Но ничто не может помешать монитору ошибочно забыть разблокировать отложенный процесс (не вызвав continue), так что система по-прежнему может эффективно зависать из-за ошибок программирования.

Конфигурация процессов, мониторов и классов в программе Concurrent Pascal обычно устанавливается в начале выполнения и после этого не изменяется. Пути связи между этими компонентами устанавливаются переменными, переданными в initоператорах, поскольку переменные экземпляра класса и монитора не могут использоваться в качестве параметров процедуры.

Пример [ править ]

В следующем примере показано объявление простого монитора и его использование двумя взаимодействующими процессами.

type  «Монитор ограниченного буфера»  buffer  =  Монитор  сохранен var  : Integer ; "сохраненный элемент является целым числом" fullq , emptyq : Queue ; «используется только двумя процессами» full : Boolean ; "истина, если элемент сохранен:"             «Оферта элемент в буфере»  Процедура  вход  путы ( элемент  :  Целое число );  начать,  если  заполнено,  затем  задержка ( fullq );  "блокировать при заполнении"  сохранено  : =  item ;  "сохранить элемент"  полный  : =  true ;  «пометить как заполненный»  continue ( emptyq )  «разблокировать потребителя»  end ;  Запись процедуры  «Получает элемент из буфера» get ( var item : Integer ); начать, если не полный, то задержка ( emptyq ); элемент "блокировать, если пуст" : = сохранено ; "получить товар" полный : = false ; «пометить как неполный» продолжить ( fullq ) «разблокировать производителя» конец ;                       «Инициализировать монитор»  begin  full  : =  false  end ; «Производитель использует буфер»  производитель  =  процесс ( проход  :  Буфер );  var  item  :  Integer ;  begin  cycle  "выполнять в цикле навсегда"  "производить элемент"  проход . put ( item )  "передать элемент на монитор"  end  end ; «Потребитель использует буфер»  consumer  =  process ( pass  :  Buffer );  var  item  :  Integer ;  начать  цикл  прохода . получить ( элемент );  "получить предмет с монитора"  "потребить предмет"  end  end ;«объявить экземпляры монитора, производителя и потребителя» «предоставить производителю и потребителю доступ к монитору» var  pass  :  Buffer ;  prod  :  Продюсер ;  минусы  :  Потребительский ; начать  инициализации  пройти ,  «инициализировать монитор»  лезвие ( пропуск ),  «начать процесс производителя»  минусы ( передача )  «начать процесс потребительского» конец .

Ссылки [ править ]

  1. ^ Бринч Хансен, Per (июнь 1975). «Язык программирования Concurrent Pascal» (PDF) . IEEE Transactions по разработке программного обеспечения (2): 199–207. DOI : 10.1109 / tse.1975.6312840 .
  2. ^ a b Бринч Хансен, Пер (1977). Архитектура параллельных программ . Прентис Холл. ISBN 978-0-13-044628-2.