stringtranslate.com

Libertad de interferencia

En informática , la libertad de interferencia es una técnica para demostrar la corrección parcial de programas concurrentes con variables compartidas. La lógica de Hoare se había introducido anteriormente para demostrar la exactitud de los programas secuenciales. En su tesis doctoral [1] (y los artículos derivados de ella [2] [3] ) bajo la dirección de David Gries , Susan Owicki amplió este trabajo para aplicarlo a programas concurrentes.

La programación concurrente se había utilizado desde mediados de la década de 1960 para codificar sistemas operativos como conjuntos de procesos concurrentes (ver, en particular, Dijkstra. [4] ), pero no existía ningún mecanismo formal para demostrar su corrección. El razonamiento sobre secuencias de ejecución entrelazadas de los procesos individuales era difícil, propenso a errores y no se ampliaba. La libertad de interferencia se aplica a las pruebas en lugar de a las secuencias de ejecución; Se muestra que la ejecución de un proceso no puede interferir con la prueba de corrección de otro proceso.

Se ha demostrado que una variedad de programas concurrentes complejos son correctos utilizando la libertad de interferencia, y la libertad de interferencia proporciona la base para gran parte del trabajo posterior para desarrollar programas concurrentes con variables compartidas y demostrar que son correctos. El artículo de Owicki-Gries Una técnica de prueba axiomática para programas paralelos I [2] recibió el premio ACM de 1977 al mejor artículo sobre lenguajes y sistemas de programación. [5] [6]

Nota. Lamport [7] presenta una idea similar. Escribe: "Después de escribir la versión inicial de este artículo, nos enteramos del trabajo reciente de Owicki. [1] [2] " Su artículo no ha recibido tanta atención como Owicki-Gries, tal vez porque utilizó diagramas de flujo en lugar de el texto de la programación se construye como la declaración if y el bucle while . Lamport estaba generalizando el método de Floyd [8] mientras que Owicki-Gries estaba generalizando el método de Hoare. [9] Básicamente, todo el trabajo posterior en esta área utiliza texto y no diagramas de flujo. Otra diferencia se menciona a continuación en la sección sobre variables auxiliares.

Principio de no interferencia de Dijkstra

Edsger W. Dijkstra introdujo el principio de no interferencia en EWD 117, "Programación considerada como una actividad humana", escrito alrededor de 1965. [10] Este principio establece que: La corrección del todo puede establecerse teniendo en cuenta sólo la especificaciones exteriores ( especificaciones abreviadas en todas partes) de las piezas, y no su construcción interior. Dijkstra describió los pasos generales para utilizar este principio:

  1. Proporcione una especificación completa de cada pieza individual.
  2. Verifique que el problema total esté resuelto cuando estén disponibles las piezas del programa que cumplan con sus especificaciones.
  3. Construya las piezas individuales para satisfacer sus especificaciones, pero independientemente unas de otras y del contexto en el que se utilizarán.

Dio varios ejemplos de este principio fuera de la programación. Pero su uso en programación es una preocupación principal. Por ejemplo, un programador que utiliza un método (subrutina, función, etc.) debe confiar únicamente en su especificación para determinar qué hace y cómo llamarlo, y nunca en su implementación.

Las especificaciones del programa están escritas en lógica Hoare , introducida por Sir Tony Hoare , [9] como se ejemplifica en las especificaciones de los procesos S1 y S2 :

  {pre-S1 } {pre-S2 } S1 S2 {post-S1 } {pre-S2 }     
                 
     

Significado: Si termina la ejecución de Si en un estado en el que la condición previa pre-Si es verdadera, al finalizar, la poscondición post-Si es verdadera.

Consideremos ahora la programación concurrente con variables compartidas. Las especificaciones de dos (o más) procesos S1 y S2 se dan en términos de sus condiciones previas y posteriores, y suponemos que se dan implementaciones de S1 y S2 que satisfacen sus especificaciones. Pero al ejecutar sus implementaciones en paralelo, dado que comparten variables, puede ocurrir una condición de carrera ; un proceso cambia una variable compartida a un valor que no se anticipa en la prueba del otro proceso, por lo que el otro proceso no funciona según lo previsto.

Por tanto, se viola el principio de no interferencia de Dijkstra.

En su tesis doctoral de 1975 [1] en Ciencias de la Computación , Universidad de Cornell , escrita bajo la dirección de David Gries , Susan Owicki desarrolló la noción de libertad de interferencia . Si los procesos S1 y S2 cumplen con la libertad de interferencia, entonces su ejecución en paralelo funcionará según lo planeado. Dijkstra calificó este trabajo como el primer paso significativo hacia la aplicación de la lógica de Hoare a procesos concurrentes. [11] Para simplificar las discusiones, restringimos la atención a sólo dos procesos concurrentes, aunque Owicki-Gries [2] [3] permite más.

Libertad de interferencia en términos de esquemas de prueba.

Owicki-Gries [2] [3] presentó el esquema de prueba para una triple {P}S{Q } de Hoare. Contiene todos los detalles necesarios para demostrar la exactitud de {P}S{Q } utilizando los axiomas y las reglas de inferencia de la lógica de Hoare . (Este trabajo utiliza la declaración de asignación x: = e , las declaraciones if-then y if-then-else y el bucle while ). Hoare aludió a los esquemas de prueba en sus primeros trabajos; para la libertad de injerencia, había que formalizarla.

Un esquema de prueba para { P}S{Q } comienza con la condición previa P y termina con la condición posterior Q. Dos afirmaciones entre llaves { y } que aparecen una al lado de la otra indican que la primera debe implicar la segunda.

Ejemplo: un esquema de prueba para {P} S {Q } donde S es:
x : = a; si e entonces S1 si no S2

  {P } {P1[x/a] } x : = a; {P1 } si e entonces {P1 ∧ e } S1 {Q1 } más {P1 ∧ ¬ e } S2 {Q1 } {Q1 } {Q }
  
  
  
  
                 
                 
        
                 
                 
  
  

P ⇒ P1[x/a] debe cumplirse, donde P1[x/a] representa P1 con cada aparición de x reemplazada por a . (En este ejemplo, S1 y S2 son declaraciones básicas, como una declaración de asignación, skip o una declaración de espera ).

Cada declaración T en el esquema de prueba está precedida por una precondición pre-T y seguida por una poscondición post-T , y {pre-T}T{post-T } debe ser demostrable usando algún axioma o regla de inferencia de la lógica de Hoare. Por lo tanto, el esquema de prueba contiene toda la información necesaria para demostrar que {P}S{Q } es correcto.

Ahora considere dos procesos S1 y S2 que se ejecutan en paralelo y sus especificaciones:

  {pre-S1 } {pre-S2 } S1 S2 {post-S1 } {post-S2 }     
                 
     

Para demostrar que funcionan adecuadamente en paralelo será necesario restringirlos de la siguiente manera. Cada expresión E en S1 o S2 puede referirse como máximo a una variable y que puede ser cambiada por el otro proceso mientras se evalúa E , y E puede referirse a y como máximo una vez. Una restricción similar se aplica a las declaraciones de asignación x: = E .

Con esta convención, la única acción indivisible debe ser la referencia a la memoria. Por ejemplo, supongamos que el proceso S1 hace referencia a la variable y mientras que S2 cambia y . El valor que S1 recibe para y debe ser el valor antes o después de que S2 cambie y , y no algún valor intermedio espurio.

Definición de libre de interferencias

La innovación importante de Owicki-Gries fue definir lo que significa que un enunciado T no interfiera con la prueba de {P}S{Q }. Si la ejecución de T no puede falsificar ninguna afirmación dada en el esquema de prueba de { P}S{Q }, entonces esa prueba aún es válida incluso frente a la ejecución concurrente de S y T.

Definición . La declaración T con precondición pre-T no interfiere con la prueba de {P}S{Q } si se cumplen dos condiciones:

(1) {Q ∧ pre-T} T {Q }
(2) Sea S' cualquier declaración dentro de S pero no dentro de una declaración en espera (ver la sección posterior). Entonces {pre-S' ∧ pre-T} T {pre-S' }.

Lea el último triplete de Hoare así: Si el estado es tal que tanto T como S' pueden ejecutarse, entonces la ejecución de T no va a falsificar pre-S' .

Definición . Los esquemas de prueba para {P1}S1{Q1 } y {P2}S2{Q2 } están libres de interferencias si se cumple lo siguiente. Sea T una declaración de espera o asignación (que no aparece en una espera ) del proceso S1 . Entonces T no interfiere con la prueba de {P2}S2{Q2 }. De manera similar para T del proceso S2 y {P1}S1{Q1 }.

Las declaraciones comienzan y esperan

Se introdujeron dos declaraciones para abordar la concurrencia. Ejecución de la sentencia cobegin S1 // S2 coend ejecuta S1 y S2 en paralelo. Termina cuando tanto S1 como S2 han terminado.

La ejecución de la declaración de espera espera a B y luego S se retrasa hasta que la condición B sea verdadera. Entonces, la afirmación S se ejecuta como una acción indivisible: la evaluación de B es parte de esa acción indivisible. Si dos procesos están esperando la misma condición B , cuando se cumple, uno de ellos continúa esperando mientras el otro continúa.

La declaración de espera no se puede implementar de manera eficiente y no se propone insertarla en el lenguaje de programación. Más bien, proporciona un medio para representar varias primitivas estándar, como los semáforos: primero expresa las operaciones del semáforo como await s y luego aplica las técnicas descritas aquí.

Las reglas de inferencia para await y cobegin son:

espera
{P ∧ B} S {Q}/{P} espera B y luego S {Q}

comenzar
{P1} S1 {Q1}, {P2} S2 {Q2}
libre de interferencias
/{P1∧P2} cobegin S1//S2 coend {Q1∧Q2}

Variables auxiliares

Una variable auxiliar no aparece en el programa, pero se introduce en la prueba de corrección para simplificar (o incluso hacer posible) el razonamiento. Las variables auxiliares se utilizan sólo en asignaciones de variables auxiliares, por lo que su introducción no altera el programa para ninguna entrada ni afecta los valores de las variables del programa. Normalmente, se utilizan como contadores de programas o para registrar historiales de un cálculo.

Definición . Sea AV un conjunto de variables que aparecen en S' sólo en las asignaciones x: = E , donde x está en AV . Entonces AV es una variable auxiliar establecida para S' .

Dado que un conjunto AV de variables auxiliares se usa solo en asignaciones a variables en AV , eliminar todas las asignaciones a ellas no cambia la corrección del programa, y ​​tenemos la regla de inferencia de eliminación AV :

  {P}S'{Q}/{P} S {Q}

AV es una variable auxiliar establecida para S' . Las variables en AV no ocurren en P o Q. S se obtiene de S' eliminando todas las asignaciones a las variables en AV .

En lugar de utilizar variables auxiliares, se puede introducir un contador de programa en el sistema de prueba, pero eso añade complejidad al sistema de prueba.

Nota: Apt [12] analiza la lógica de Owicki-Gries en el contexto de aserciones recursivas , es decir, aserciones efectivamente computables . Demuestra que todas las afirmaciones en los esquemas de prueba pueden ser recursivas, pero que este ya no es el caso si las variables auxiliares se utilizan sólo como contadores de programas y no para registrar historias de cálculo. Lamport, en su trabajo similar, [7] utiliza afirmaciones sobre posiciones de tokens en lugar de variables auxiliares, donde un token en un borde de un diagrama de flujo es similar a un contador de programa. No existe la noción de una variable histórica. Esto indica que el enfoque de Owicki-Gries y Lamport no es equivalente cuando se limita a afirmaciones recursivas.

Punto muerto y terminación

Owicki-Gries [2] [3] trata principalmente de la corrección parcial: {P} S {Q } significa: Si S ejecutado en un estado en el que P es verdadero termina, entonces Q es verdadero en el estado al momento de la terminación. Sin embargo, Owicki-Gries también ofrece algunas técnicas prácticas que utilizan información obtenida de una prueba de corrección parcial para derivar otras propiedades de corrección, incluida la ausencia de punto muerto, la terminación del programa y la exclusión mutua.

Un programa está en punto muerto si todos los procesos que no han terminado están ejecutando declaraciones de espera y ninguno puede continuar porque sus condiciones de espera son falsas. Owicki-Gries proporciona condiciones bajo las cuales no puede ocurrir un punto muerto.

Owicki-Gries presenta una regla de inferencia para la corrección total del ciclo while . Utiliza una función vinculada que disminuye con cada iteración y es positiva siempre que la condición del bucle sea verdadera. Apt et al [13] muestran que esta nueva regla de inferencia no satisface la libertad de interferencia. El hecho de que la función ligada sea positiva siempre que la condición del bucle sea verdadera no se incluyó en una prueba de interferencia. Muestran dos formas de rectificar este error.

Un ejemplo sencillo

Considere la afirmación:
       {x=0}
       cobegin await true then x: = x+1
                  // await true then x: = x+2
       coend
        {x=3}

El esquema de prueba para ello:

{x=0}
S: cobegin {x=0} {x=0 ∨ x=2} S1: espera verdadero entonces x : = x+1 {Q1: x=1 ∨ x=3} // {x=0} {x=0 ∨ x=1} S2: espera verdadero entonces x : = x+2 {Q2: x=2 ∨ x=3} coend
       
       
       
       
     
       
       
       
       
     
{(x=1 ∨ x=3) ∧ (x=2 ∨ x=3)}
{x=3}

Demostrar que S1 no interfiere con la prueba de S2 requiere demostrar dos tripletas de Hoare:

(1) {(x=0 ∨ x=2) ∧ (x=0 ∨ x=1} S1 {x=0 ∨ x=1}
(2) {(x=0 ∨ x=2) ∧ (x= 2 ∨ x=3} S1 {x=2 ∨ x=3}

La condición previa de (1) se reduce a x=0 y la condición previa de (2) se reduce a x=2 . A partir de esto, es fácil ver que estas tripletas de Hoare se cumplen. Se requieren dos tripletas de Hoare similares para demostrar que S2 no interfiere con la prueba de S1 .

Supongamos que S1 se cambia de la declaración de espera a la asignación x: = x+1 . Entonces el esquema de prueba no satisface los requisitos, porque la asignación contiene dos apariciones de la variable compartida x . De hecho, el valor de x después de la ejecución de la declaración cobegin podría ser 2 o 3.

Supongamos que S1 se cambia a la declaración de espera await true y luego x: = x+2 , por lo que es lo mismo que S2 . Después de la ejecución de S , x debe ser 4. Para probar esto, debido a que las dos asignaciones son iguales, se necesitan dos variables auxiliares, una para indicar si S1 se ha ejecutado; el otro, si se ha ejecutado S2 . Dejamos el cambio en el esquema de prueba al lector.

Ejemplos de programas concurrentes formalmente probados

A. Encuentrapos . Escriba un programa que encuentre el primer elemento positivo de una matriz (si lo hay). Un proceso verifica todos los elementos de la matriz en posiciones pares de la matriz y finaliza cuando encuentra un valor positivo o cuando no se encuentra ninguno. De manera similar, el otro proceso verifica los elementos de la matriz en posiciones impares de la matriz. Por tanto, este ejemplo trata de bucles while . Tampoco tiene declaraciones de espera .

Este ejemplo proviene de Barry K. Rosen. [14] La solución en Owicki-Gries, [2] completa con programa, esquema de prueba y discusión sobre la libertad de interferencia, ocupa menos de dos páginas. La libertad de interferencia es bastante fácil de comprobar, ya que sólo hay una variable compartida. Por el contrario, el artículo de Rosen [14] utiliza Findpos como único ejemplo en este documento de 24 páginas.

Un resumen de ambos procesos en un entorno general:

productor de cobegin : ... espera entrada-salida < N y luego omite ; agregar: b[en mod N]:= siguiente valor; marca: en: = en+1; ... // consumidor: ... espera entrada-salida > 0 y luego omite ; eliminar: este valor:= b[out mod N]; marcado: fuera: = fuera+1;
     
     
     
     
  
     
     
     
       

     
coend
...

B. Problema del consumidor/productor del buffer acotado . Un proceso productor genera valores y los coloca en un búfer acotado b de tamaño N ; un proceso de consumo los elimina. Proceden a tipos variables. El productor debe esperar si el buffer b está lleno; el consumidor debe esperar si el buffer b está vacío. En Owicki-Gries [2] se muestra una solución en un entorno general; luego se incrusta en un programa que copia una matriz c[1..M] en una matriz d[1..M] .

Este ejemplo muestra un principio para reducir las comprobaciones de interferencia al mínimo: coloque la mayor cantidad posible en una afirmación que sea invariablemente cierta en todos lados en ambos procesos. En este caso, la aserción es la definición del búfer limitado y los límites de las variables que indican cuántos valores se han agregado y eliminado del búfer. Además del propio búfer b , dos variables compartidas registran el número de valores agregados al búfer y el número de valores eliminados del búfer.

C. Implementación de semáforos . En su artículo sobre EL sistema de multiprogramación, [4] Dijkstra presenta el semáforo sem como una primitiva de sincronización: sem es una variable entera a la que se puede hacer referencia sólo de dos maneras, como se muestra a continuación; cada una es una operación indivisible:

1. P(sem) : Disminuye sem en 1. Si ahora sem <0 , suspende el proceso y colócalo en una lista de procesos suspendidos asociados con sem .

2. V(sem) : aumenta sem en 1. Si ahora sem ≤ 0 , elimina uno de los procesos de la lista de procesos suspendidos asociados con sem , para que su progreso dinámico vuelva a ser permisible.

La implementación de P y V usando declaraciones de espera es:

P(sem): espera verdadero y luego comienza sem: = sem-1; si sem < 0 entonces w[este proceso]: = verdadero fin ; espere ¬w[este proceso] y luego salte
      
          
              
                
          
          
                

V(sem): espera verdadero y luego comienza sem: = sem+1; si sem ≤ 0 entonces comience a elegir p tal que w[ p ]; w[ p ]: = fin falso fin
      
          
              
                 
                                   
                            
                 
          

Aquí, w es una serie de procesos que están en espera porque han sido suspendidos; Inicialmente, w[p] = false para cada proceso p . Se podría cambiar la implementación para activar siempre el proceso suspendido más largo.

D. Recolección de basura sobre la marcha . En la Escuela de Verano de Marktoberdorf de 1975 , Dijkstra habló de un recolector de basura sobre la marcha como un ejercicio para comprender el paralelismo. La estructura de datos utilizada en una implementación convencional de LISP es un gráfico dirigido en el que cada nodo tiene como máximo dos bordes salientes, cualquiera de los cuales puede faltar: un borde izquierdo saliente y un borde derecho saliente. Se debe poder acceder a todos los nodos del gráfico desde una raíz conocida. Cambiar un nodo puede dar como resultado nodos inalcanzables, que ya no se pueden usar y se denominan basura . Un recolector de basura sobre la marcha tiene dos procesos: el programa en sí y un recolector de basura, cuya tarea es identificar los nodos de basura y colocarlos en una lista libre para que puedan usarse nuevamente.

Gries consideró que la libertad de interferencia podría usarse para demostrar que el recolector de basura sobre la marcha tenía razón. Con la ayuda de Dijkstra y Hoare, pudo hacer una presentación al final de la Escuela de Verano, que resultó en un artículo en CACM. [15]

E. Verificación de solución de lectores/escritores con semáforos . Courtois et al [16] utilizan semáforos para dar dos versiones del problema lectores/escritores, sin pruebas. Las operaciones de escritura bloquean tanto las lecturas como las escrituras, pero las operaciones de lectura pueden ocurrir en paralelo. Owicki [17] proporciona una prueba.

El algoritmo de F. Peterson , una solución al problema de exclusión mutua de dos procesos, fue publicado por Peterson en un artículo de dos páginas. [18] Schneider y Andrews proporcionan una prueba de corrección. [19]

Dependencias de la libertad de interferencia

La siguiente imagen, de Ilya Sergey, muestra el flujo de ideas que se han implementado en lógicas que tratan con la concurrencia. En la raíz está la libertad de interferencia. El archivo CSL-Family-Tree (PDF)contiene referencias. A continuación, resumimos los principales avances.

Gráfico histórico de lógicas de programa para la libertad de interferencias.
Gráfico histórico de lógicas de programa para la libertad de interferencias.

Textos que hablan de la libertad de injerencia

Implementaciones de la libertad de interferencia.

Referencias

  1. ^ abc Owicki, Susan S. (agosto de 1975). Técnicas de prueba axiomática para programas paralelos (tesis doctoral). Universidad de Cornell. hdl : 1813/6393 . Consultado el 1 de julio de 2022 .
  2. ^ abcdefghi Owicki, Susan ; Gries, David (25 de junio de 1976). "Una técnica de prueba axiomática para programas paralelos I". Acta Informática . 6 (4). Berlín: Springer (Alemania): 319–340. doi :10.1007/BF00268134. S2CID  206773583.
  3. ^ abcd Owicki, Susan ; Gries, David (mayo de 1976). "Verificación de propiedades de programas paralelos: un enfoque axiomático". Comunicaciones de la ACM . 19 (5): 279–285. doi : 10.1145/360051.360224 . S2CID  9099351.
  4. ^ ab Dijkstra, EW (1968), "La estructura del sistema de multiprogramación 'THE'", Comunicaciones del ACM , 11 (5): 341–346, doi : 10.1145/363095.363143 , S2CID  2021311
  5. ^ "Susan S. Owicki". Premios.acm.org . Consultado el 1 de julio de 2022 .
  6. ^ "David Gries". Premios.acm.org . Consultado el 1 de julio de 2022 .
  7. ^ ab Lamport, Leslie (marzo de 1977). "Demostrar la corrección de los programas multiproceso". Transacciones IEEE sobre ingeniería de software . SE-3 (2): 125–143. doi :10.1109/TSE.1977.229904. S2CID  9985552.
  8. ^ Floyd, Robert W. (1967). "Asignación de significados a programas" (PDF) . En Schwartz, JT (ed.). Aspectos matemáticos de la informática. Actas del Simposio sobre Matemáticas Aplicadas. vol. 19. Sociedad Matemática Estadounidense. págs. 19-32. ISBN 0821867288.
  9. ^ ab Hoare, CAR (octubre de 1969). "Una base axiomática para la programación informática". Comunicaciones de la ACM . 12 (10): 576–580. doi : 10.1145/363235.363259 . S2CID  207726175.
  10. ^ "Programación considerada como una actividad humana" (PDF) . Archivo EW Dijkstra . Universidad de Texas.
  11. ^ Dijkstra, Edsger W. (1982). "EWD 554: un resumen personal de la teoría de Gries-Owicki". Escritos seleccionados sobre informática: una perspectiva personal . Monografías en Informática. Springer-Verlag. págs. 188-199. ISBN 0387906525.
  12. ^ Apto, Krzysztof R. (junio de 1981). "Aserciones recursivas y programas paralelos". Acta Informática . 15 (3): 219–232. doi :10.1007/BF00289262. S2CID  42470032.
  13. ^ Apto, Krzysztof R.; de Boer, Frank S.; Olderog, Ernst-Rüdiger (1990). "Acreditación de la terminación de programas paralelos". En Gries, D.; Feijen, WHJ; van Gasteren, AJM; Misra, J. (eds.). La belleza es nuestro negocio. Monografías en Informática. Nueva York: Springer Verlag. págs. 0–6. doi :10.1007/978-1-4612-4476-9. ISBN 978-1-4612-8792-6. S2CID  24379938.
  14. ^ ab Rosen, Barry K (1976). "Corrección de los programas paralelos: el enfoque Church-Rosser". Informática Teórica . 2 (2): 183–207. doi : 10.1016/0304-3975(76)90032-3 .
  15. ^ Gries, David (diciembre de 1977). "Un ejercicio para demostrar que los programas paralelos son correctos". Comunicaciones de la ACM . 20 (12): 921–930. doi : 10.1145/359897.359903 . S2CID  3202388.
  16. ^ Courtois, PJ; Heymans, F.; Parnas, DL (octubre de 1971). "Control concurrente con" lectores "y" escritores"". Comunicaciones de la ACM . 14 (10): 667–668. doi : 10.1145/362759.362813 . S2CID  7540747.
  17. ^ Owicki, Susan (agosto de 1977). Verificación de programas concurrentes con clases de datos compartidos (PDF) (Reporte técnico). Laboratorio de Sistemas Digitales, Universidad de Stanford. 147 . Consultado el 8 de julio de 2022 .
  18. ^ Peterson, Gary L. (junio de 1981). "Mitos sobre el problema de la exclusión mutua". IPL . 12 (3): 115-116. doi :10.1016/0020-0190(81)90106-X.
  19. ^ Schneider, Fred B .; Andrews, Gregory R. (1986). "Conceptos de programación concurrente". En JW Bakker; WP de Roever; G. Rozenberg (eds.). Tendencias actuales en concurrencia . Apuntes de conferencias sobre informática. vol. 224. Noordwijkerhout, Países Bajos: Springer Verlag . págs. 669–716. doi :10.1007/BFb0027049. ISBN 978-3-540-16488-3.
  20. ^ Jones, CB (junio de 1981). Métodos de desarrollo de programas informáticos, incluida una noción de interferencia (PDF) (tesis de doctorado). Universidad de Oxford.
  21. ^ Jones, acantilado B. (1983). REA Mason (ed.). Especificación y diseño de programas (paralelos) . 9º Congreso Mundial de Informática IFIP (Procesamiento de información 83). Holanda Septentrional/IFIP. págs. 321–332. ISBN 0444867295.
  22. ^ Xu, Qiwen; de Roever, Willem-Paul; Él, Jifeng (1997). "El método Rely-Guarantee para verificar programas concurrentes de variables compartidas". Aspectos formales de la informática . 9 (2): 149-174. doi : 10.1007/BF01211617 . S2CID  12148448.
  23. ^ ab O'Hearn, Peter W. (3 de septiembre de 2004). "Recursos, Concurrencia y Razonamiento Local". En P. Gardner; N. Yoshida (eds.). CONCUR 2004 – Teoría de la Concurrencia . CONCUR 2004. Londres, Reino Unido: Springer Verlag Berlín, Heidelberg. págs. 49–67. doi :10.1007/b100113. ISBN 978-3-540-28644-8. Consultado el 6 de julio de 2022 .
  24. ^ O'Hearn, Peter (2007). «Recursos, Concurrencia y Razonamiento Local» (PDF) . Informática Teórica . 375 (1–3): 271–307. doi : 10.1016/j.tcs.2006.12.035 .
  25. ^ ab Van Gasteren, AJM; Feijen, WHJ (1999). Gries, David ; Schneider, Fred B. (eds.). Sobre un método de multiprogramación . Monografías en Informática. Springer-Verlag Nueva York Inc. pág. 370. doi :10.1007/978-1-4757-3126-2. ISBN 978-1-4757-3126-2. S2CID  13607884.
  26. ^ Dongol, Brijesh; Goldson, Doug (2006) [12 de enero de 2005]. "Ampliando la teoría de Owicki y Gries con una lógica del progreso". Métodos lógicos en informática . 2 . Centro para la Comunicación Científica Directa (CCSD). arXiv : cs/0512012v3 . doi :10.2168/lmcs-2(1:6)2006. S2CID  302420.
  27. ^ Goldson, Doug; Dongol, Brijesh (enero de 2005). "Diseño de programas concurrentes en la teoría extendida de Owicki y Gries". En Mike Atkinson; Frank Dehne (eds.). CATS '05: Simposio de Australasia Proc 2005 sobre teoría de la informática . vol. 41. Sociedad Australiana de Computación, Inc. págs. 41–50.
  28. ^ Dongol, Brijesh; Mooij, Arjan J (julio de 2006). "Avances en la derivación de programas concurrentes: enfatizando el papel de los guardias de cuadra". En Tarmo Uustalu (ed.). MPC'06: Procesamiento. 8vo Int. Conf. en Matemáticas de Construcción de Programas . vol. 41. Kuressaare , Estonia : Springer Verlag , Berlín, Heidelberg. págs. 14-161. doi :10.1007/11783596_11.
  29. ^ Dongol, Brijesh; Mooij, Arjan J (2008). "Simplificación de las derivaciones de programas concurrentes basadas en el progreso". Aspectos formales de la informática . 20 (2): 141–160. doi : 10.1007/s00165-007-0037-4 . S2CID  7024064.
  30. ^ Mooij, Arjan J. (noviembre de 2007). "Cálculo y composición de propiedades de progreso en términos de la relación de destino". En Michael mayordomo; Michael G. Hinchey; María M. Larrondo-Petrie (eds.). ICFEM'07: Proc. Métodos de Ingeniería Formal 9no Int. Conf. sobre Métodos Formales e Ingeniería de Software . Boca Ratón, Florida: Springer Verlag , Berlín, Heidelberg. págs. 366–386. ISBN 978-3540766483.
  31. ^ Dongol, Brijesh; Hayes, Ian (abril de 2007). Semántica de seguimiento para la teoría de Owicki-Gries integrada con la lógica de progreso de UNITY (PDF) (Reporte técnico). Universidad de Queensland . SSE-2007-02.
  32. ^ Lahav, Ori; Vafeiadis, Viktor (2015). "Razonamiento de Owicki-Gries para modelos de memoria débiles". En Halldórsson, M.; Iwama, K.; Kobayashi, N.; Speckmann, B. (eds.). Autómatas, Lenguajes y Programación. ICALP 2015 . ICALP 2015. Apuntes de conferencias en informática. vol. 9135. Berlín, Heidelberg: Springer. págs. 311–323. doi :10.1007/978-3-662-47666-6_25.
  33. ^ Ying, Mingsheng; Zhou, Li; Li, Yangjia (2018). "Razonamiento sobre programas cuánticos paralelos". arXiv : 1810.11334 [cs.LO].
  34. ^ Raad, Azalea; Lahav, Ori; Vafeiadis, Viktor (13 de noviembre de 2020). "Razonamiento persistente de Owicki-Gries: una lógica de programa para razonar sobre programas persistentes en Intel-x86". Actas de la ACM sobre lenguajes de programación . vol. 4. ACM . págs. 1–28. doi : 10.1145/3428219 . hdl : 10044/1/97398 .
  35. ^ Schneider, Fred B. (1997). Gries, David ; Schneider, Fred B. (eds.). Sobre programación concurrente . Textos de Posgrado en Informática. Springer-Verlag New York Inc. doi :10.1007/978-1-4612-1830-2. ISBN 978-1-4612-1830-2. S2CID  9980317.
  36. ^ Apto, Krzysztof R.; Olderog, Ernst-Rüdiger (1991). Gries, David (ed.). Verificación de Programas Secuenciales y Concurrentes . Textos en Informática. Springer-Verlag Alemania.
  37. ^ Apto, Krzysztof R.; Bóer, Frank S.; Olderog, Ernst-Rüdiger (2009). Gries, David ; Schneider, Fred B. (eds.). Verificación de Programas Secuenciales y Concurrentes. Textos de Informática (3ª ed.). Springer-Verlag Londres. pag. 502. Código Bib : 2009vscp.book.....A. doi :10.1007/978-1-84882-745-5. ISBN 978-1-84882-744-8.
  38. ^ de Roever, Willem-Paul; de Boer, Willem-Paul; Hanneman, Ulrich; Hooman, José; Lakhnech, Yassine; Poel, Mannes; Zwiers, Job (2012). Abramsky, S. (ed.). Verificación de concurrencia: introducción a los métodos compositivos y no compositivos . Tratados de Cambridge sobre informática teórica. Prensa de la Universidad de Cambridge EE.UU. pag. 800.ISBN 978-0521169325.
  39. ^ Nieto, Leonor Prensa (31 de enero de 2002). Verificación de programas paralelos con los métodos Owicki-Gries y Rely-Guarantee en Isabelle/HOL (tesis doctoral). Universidad Técnica de Múnich. pag. 198 . Consultado el 5 de julio de 2022 .
  40. ^ Nipkow, Tobías; Nieto, Leonor Prensa (22 de marzo de 1999). "Owicki/Gries en Isabelle/HOL". En JP Finance (ed.). Enfoques fundamentales de la ingeniería de software . FASE 1999. Apuntes de conferencias sobre informática. vol. 1577. Berlín Heidelberg: Springer Verlag . págs. 188-203. doi : 10.1007/978-3-540-49020-3_13 . ISBN 978-3-540-49020-3.
  41. ^ Abrahám, Erika (20 de enero de 2005). Un sistema de prueba afirmativa para Java multiproceso: soporte de teoría y herramientas (tesis doctoral). Universidad de Leiden. pag. 220. hdl : 1887/584. ISBN 9090189084. Consultado el 5 de julio de 2022 .
  42. ^ Abrahám, Erika; Boer, Frank, S., de; Roever, Willem-Paul, de; Martín, Steffen (25 de febrero de 2005). "Un sistema de prueba basado en afirmaciones para Java multiproceso". Informática Teórica . 331 (2–3). Elsevier : 251–290. doi : 10.1016/j.tcs.2004.09.019 .{{cite journal}}: Mantenimiento CS1: varios nombres: lista de autores ( enlace )
  43. ^ Denissen, PEJG (noviembre de 2017). Ampliación de Dafny a la concurrencia: verificación del programa estilo Owicki-Gries para el verificador del programa Dafny (tesis de maestría). Universidad Tecnológica de Eindhoven.
  44. ^ "Lenguaje de programación Dafny" . Consultado el 20 de julio de 2022 .
  45. ^ Amani, S.; Andrónico, J.; Bortín, M.; Lewis, C.; Rizkallah, C.; Tuong, J. (16 de enero de 2017). Yves Bertot; Viktor Vafeiadid (eds.). COMPLX: Un marco de verificación para programas imperativos concurrentes. CPP 2017: Proc 6ta Conferencia ACM SIGPLAN sobre Programas Certificados y Pruebas. París, Francia: ACM . págs. 138-150. doi :10.1145/3018610.3018627. ISBN 978-1-4503-4705-1.
  46. ^ Dalvandi, Sadegh; Dongol, Brijesh; Doherty, Simón; Wehrheim, Heike (febrero de 2022). "Integración de Owicki-Gries para modelos de memoria estilo C11 en Isabelle/HOL". Revista de razonamiento automatizado . 66 : 141-171. arXiv : 2004.02983 . doi : 10.1007/s10817-021-09610-2 . S2CID  215238874.
  47. ^ "Civl: un verificador de programas concurrentes" . Consultado el 22 de julio de 2022 .
  48. ^ Kragl, Bernhard; Qadeer, Shaz; Henzinger, Thomas A. (2020). "Refinamiento para programas concurrentes estructurados". En S. Lahiri; C. Wang (eds.). CAV 2020: Verificación asistida por computadora . Apuntes de conferencias sobre informática. vol. 12224. Springer Verlag . doi : 10.1007/978-3-030-53288-8_14 . ISBN 978-3-030-53288-8.
  49. ^ Esen, Zafer; Rümmer, Philipp (octubre de 2022). "TRICERA verifica programas C utilizando la teoría de montones". En A. Griggio; N. Rungta (eds.). Proc. 22ª Conferencia. sobre métodos formales en diseño asistido por computadora - FMCAD 2022 . Prensa académica de TU Wien . págs. 360–391. doi : 10.34727/2022/isbn.978-3-85448-053-2_45 .