stringtranslate.com

Pascal concurrente

Concurrent Pascal es un lenguaje de programación diseñado por Per Brinch Hansen para escribir programas informáticos concurrentes , como sistemas operativos y sistemas de monitoreo informático en tiempo real, en computadoras con memoria compartida . [1]

Un lenguaje separado, Sequential Pascal , se utiliza como lenguaje para los programas de aplicaciones ejecutados por los sistemas operativos escritos en Concurrent Pascal. Ambos lenguajes son extensiones de Pascal de Niklaus Wirth y comparten un intérprete de código común . [2] A continuación se describe en qué se diferencia Concurrent Pascal del Pascal de Wirth.

Descripción del idioma

Se eliminaron varias construcciones en Pascal de Concurrent Pascal por razones de simplicidad y seguridad: [2]

Estas omisiones hacen posible garantizar, mediante una combinación de comprobaciones en tiempo de compilación y comprobaciones mínimas en tiempo de ejecución en el intérprete de código de subprocesos, que un programa no pueda dañarse a sí mismo ni a otro programa dirigiéndose fuera de su espacio asignado.

Pascal concurrente incluye tipos de datos de clase, monitor y proceso. Las instancias de estos tipos se declaran como variables y se inicializan en una initdeclaración.

Las clases y los monitores son similares: ambos empaquetan variables privadas y procedimientos con procedimientos públicos (llamados entradas de procedimiento). Una instancia de clase solo puede ser utilizada por un proceso, mientras que una instancia de monitor puede ser compartida por procesos. Los monitores proporcionan el único mecanismo para la comunicación entre procesos en un programa Pascal concurrente.

Sólo se puede ejecutar un proceso dentro de una instancia de monitor determinada a la vez. Un tipo de datos integrado, la cola, junto con las operaciones delayy continue, se utilizan para la programación dentro de los monitores. Cada variable de tipo cola puede contener un proceso. Si se van a retrasar muchos procesos en un monitor, se deben proporcionar múltiples variables de cola, generalmente organizadas como una matriz. La variable de cola de proceso única le da al monitor control total sobre la programación a mediano plazo, pero el programador es responsable de desbloquear el proceso correcto.

Un proceso, como una clase o un monitor, tiene variables locales, procedimientos y una declaración inicial, pero no tiene entradas de procedimiento. La declaración inicial normalmente se ejecuta indefinidamente, llamando a procedimientos locales, procedimientos de clase y procedimientos de monitorización. Los procesos se comunican a través de procedimientos de seguimiento. Las reglas del lenguaje evitan el estancamiento al imponer una jerarquía a los monitores. Pero nada puede evitar que un monitor se olvide por error de desbloquear un proceso retrasado (al no llamar a continuar), por lo que el sistema aún puede bloquearse efectivamente debido a errores de programación.

La configuración de procesos, monitores y clases en un programa Pascal Concurrente normalmente se establece al inicio de la ejecución y no se modifica posteriormente. Las rutas de comunicación entre estos componentes se establecen mediante variables pasadas en las initdeclaraciones, ya que las variables de clase y de instancia de monitor no se pueden utilizar como parámetros de procedimiento.

Ejemplo

El siguiente ejemplo muestra la declaración de un monitor simple y su uso por dos procesos en comunicación.

escriba  "monitor de búfer limitado"  buffer  =  Monitor  var  guardado  :  entero ;  "El elemento guardado es un número entero"  fullq ,  vacíoq  :  cola ;  "utilizado sólo por dos procesos"  completo  :  booleano ;  "verdadero si se guarda un elemento:"  Entrada del procedimiento  "Pone el elemento en el búfer" put ( elemento : entero ); comenzar si está lleno y luego retrasar ( fullq ); "bloquear si está lleno" guardado : = elemento ; "guardar el elemento" completo : = verdadero ; "marcar como lleno" continuar ( vacíoq ) "desbloquear consumidor" fin ;                      Entrada del procedimiento  "Obtiene el elemento del búfer" get ( var elemento : entero ); comenzar si no está lleno entonces retrasar ( vacíoq ); Elemento "bloquear si está vacío" : = guardado ; "obtener el artículo" completo : = false ; "marcar como no completo" continuar ( fullq ) "desbloquear productor" fin ;                       "Inicializar el monitor"  comienza  completo  : =  final falso  ; "El productor utiliza un búfer"  productor  =  proceso ( pasar  :  búfer );  elemento var  : entero ; comenzar el ciclo "ejecutar en un bucle para siempre" "producir un elemento" pasar . put ( elemento ) "pasar un elemento al monitor" fin fin ;           "El consumidor utiliza un búfer"  consumidor  =  proceso ( pasar  :  búfer );  elemento var  : entero ; comenzar el pase del ciclo . obtiene el objeto ); "obtener un elemento del monitor" "consumir el elemento" fin fin ;         "declarar instancias del monitor, productor y consumidor" "dar acceso al monitor al productor y al consumidor" var  pass  :  Buffer ;  prod  :  Productor ;  desventajas  :  Consumidor ; comenzar  init  pasar ,  "inicializar el monitor"  prod ( pasar ),  "iniciar el proceso productor"  cons ( pasar )  "iniciar el proceso consumidor" finalizar .

Referencias

  1. ^ Brinch Hansen, Per (junio de 1975). "El lenguaje de programación Concurrent Pascal" (PDF) . Transacciones IEEE sobre ingeniería de software (2): 199–207. doi :10.1109/tse.1975.6312840.
  2. ^ ab Brinch Hansen, Per (1977). La arquitectura de los programas concurrentes . Prentice Hall. ISBN 978-0-13-044628-2.