stringtranslate.com

Конкурентный Паскаль

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

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

Описание языка

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

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

Concurrent Pascal включает типы данных class, monitor и process. Экземпляры этих типов объявляются как переменные и инициализируются в операторе init.

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

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

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

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

Пример

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

тип  "Ограниченный монитор буфера"  буфер  =  Монитор  var  сохранено  :  Integer ;  "сохраненный элемент является целым числом"  fullq ,  emptyq  :  Queue ;  "используется только двумя процессами"  full  :  Boolean ;  "истина, если элемент сохранен:" "Помещает элемент в буфер"  запись процедуры  put ( item : Integer ); begin if full then delay ( fullq ); "блокировать, если полный" saved : = item ; "сохранить элемент" full : = true ; "отметить как полный" continue ( emptyq ) "разблокировать потребителя" end ;                     "Получение элемента из буфера"  запись процедуры  get ( var item : Integer ); begin if not full then delay ( emptyq ); "блокировка, если пустой" item : = saved ; "получить элемент" full : = false ; "отметить как не полный" continue ( fullq ) "разблокировать производителя" end ;                       "Инициализировать монитор"  begin  full  : =  false  end ; "Производитель использует буфер"  Producer  =  process ( pass  :  Buffer );  var  item  :  Integer ;  begin  cycle  "выполнять в цикле вечно"  "производить элемент"  pass . put ( item )  "передавать элемент монитору"  end  end ; "Потребитель использует буфер"  consumer  =  process ( pass  :  Buffer );  var  item  :  Integer ;  begin  cycle  pass . get ( item );  "получить элемент из монитора"  "потребить элемент"  end  end ;"объявить экземпляры монитора, производителя и потребителя" "предоставить производителю и потребителю доступ к монитору" var  pass  :  Buffer ;  prod  :  Producer ;  cons  :  Consumer ; begin  init  pass ,  "инициализировать монитор"  prod ( pass ),  "запустить процесс производителя"  cons ( pass )  "запустить процесс потребителя" end .

Ссылки

  1. ^ Brinch Hansen, Per (июнь 1975 г.). «Язык программирования Concurrent Pascal» (PDF) . IEEE Transactions on Software Engineering (2): 199–207. doi :10.1109/tse.1975.6312840.
  2. ^ ab Brinch Hansen, Per (1977). Архитектура параллельных программ . Prentice Hall. ISBN 978-0-13-044628-2.