Параллельный Паскаль
Парадигмы | Императивный , структурированный , параллельный |
---|---|
Семья | Вирт Паскаль |
Разработано | Пер Бринч Хансен |
Впервые появился | апрель 1974 г |
Дисциплина набора текста | Статический и динамичный , сильный , безопасный |
Платформа | Декабрьский ПРП 11 |
Под влиянием | |
Алгол 60 , Симула 67, Паскаль |
Concurrent Pascal — это язык программирования , разработанный Пером Бринчом Хансеном для написания программ параллельных вычислений, таких как операционные системы и вычислений в реальном времени системы мониторинга на компьютерах с общей памятью . [1]
Отдельный язык Sequential Pascal используется в качестве языка прикладных программ, запускаемых операционными системами, написанными на Concurrent Pascal. Оба языка являются расширениями языка Вирта Паскаль Никлауса и используют общий интерпретатор многопоточного кода . [2] Ниже описывается, чем Concurrent Pascal отличается от Pascal Вирта.
Описание языка [ править ]
Некоторые конструкции Паскаля были удалены из Concurrent Pascal для простоты и безопасности: [2]
- Варианты записей
- Оператор Goto и метки
- Процедуры как параметры
- Упакованные массивы
- Типы указателей
- Типы файлов и связанные стандартные ввода/вывода. процедуры
Эти упущения позволяют гарантировать, посредством комбинации проверок во время компиляции и минимальной проверки во время выполнения в интерпретаторе многопоточного кода, что программа не может повредить себя или другую программу, обращаясь за пределами отведенного ей пространства.
Concurrent Pascal включает типы данных класса, монитора и процесса. Экземпляры этих типов объявляются как переменные и инициализируются в init
заявление.
Классы и мониторы схожи: как частные переменные, так и процедуры упаковываются в общедоступные процедуры (называемые записями процедур). Экземпляр класса может использоваться только одним процессом, тогда как экземпляр монитора может совместно использоваться процессами. Мониторы предоставляют единственный механизм межпроцессного взаимодействия в программе Concurrent Pascal.
В пределах данного экземпляра монитора одновременно может выполняться только один процесс. Встроенный тип данных, очередь, вместе с операциями. delay
и continue
, используются для планирования внутри мониторов. Каждая переменная типа очередь может содержать один процесс. Если в мониторе необходимо задержать большое количество процессов, необходимо предоставить несколько переменных очереди, обычно организованных в виде массива. Единственная переменная очереди процесса дает монитору полный контроль над среднесрочным планированием, но за разблокировку правильного процесса отвечает программист.
Процесс, такой как класс или монитор, имеет локальные переменные, процедуры и начальный оператор, но не имеет записей о процедурах. Исходный оператор обычно выполняется вечно, вызывая локальные процедуры, процедуры класса и процедуры мониторинга. Процессы взаимодействуют посредством процедур мониторинга. Языковые правила предотвращают тупиковую ситуацию, налагая иерархию на мониторах. Но ничто не может помешать монитору ошибочно забыть разблокировать отложенный процесс (не вызывая continue), поэтому система все равно может эффективно зависать из-за ошибок программирования.
Конфигурация процессов, мониторов и классов в программе Concurrent Pascal обычно устанавливается в начале выполнения и в дальнейшем не изменяется. Пути связи между этими компонентами устанавливаются переменными, передаваемыми в init
операторы, поскольку переменные экземпляра класса и монитора не могут использоваться в качестве параметров процедуры.
Пример [ править ]
В следующем примере показано объявление простого монитора и его использование двумя взаимодействующими процессами.
тип
«Монитор ограниченного буфера»
buffer = Монитор
var
сохранен : Integer ; «сохраненный элемент является целым числом»
fullq , пустойq : Queue ; «используется только двумя процессами»
full : Boolean ; "истина, если элемент сохранен:"
"Помещает элемент в буфер"
процедуры Запись put ( item : Integer );
начать
, если заполнено, затем
задержать ( fullq ); «блокировать, если заполнено»
сохранено : = item ; «сохранить элемент»
full : = true ; «отметить как заполненный»
continue ( emptyq ) «разблокировать потребителя»
end ;
«Получает элемент из буфера»
процедуры Запись get ( var item : Integer );
начать
, если не заполнено , то
задержать ( emptyq ); «блокировать, если пуст»
элемент : = сохранено ; «получить предмет»
полностью : = false ; «отметить как незаполненный»
continue ( fullq ) «разблокировать производителя»
end ;
«Инициализация монитора»
start
full : = false
end ;
«Производитель использует буфер»
Producer = Process ( pass : Buffer );
var элемент : целое число ;
начать
цикл «выполнять в цикле вечно»
«создать элемент»
pass . put ( item ) «передать элемент на монитор»
end
end ;
«Потребитель использует буфер»
потребитель = процесс ( pass : Buffer );
var элемент : целое число ;
начать
цикл
пройти . получить ( предмет ); "получить предмет с монитора"
"потребить предмет"
end
end ;
"объявить экземпляры монитора, производителя и потребителя"
"предоставить производителю и потребителю доступ к монитору"
вар
проход : Буфер ;
Продюсер : Продюсер ;
минусы : потребительский ;
начало
инициализации прохода , «инициализация монитора»
prod ( проход ), «запуск процесса производителя»
cons ( проход ) «запуск процесса потребителя»
end .
Ссылки [ править ]
- ^ Бринч Хансен, Пер (июнь 1975 г.). «Язык программирования Concurrent Pascal» (PDF) . Транзакции IEEE по разработке программного обеспечения (2): 199–207. дои : 10.1109/tse.1975.6312840 .
- ^ Перейти обратно: а б Бринч Хансен, Пер (1977). Архитектура параллельных программ . Прентис Холл. ISBN 978-0-13-044628-2 .