Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

La Cita en Ada

1,914 views

Published on

Presentación para la asignatura Programación Concurrente (curso 2008-2009)

Published in: Education
  • Be the first to comment

  • Be the first to like this

La Cita en Ada

  1. 1. Tipología de la Comunicación Basada en Mensajes & Cita con Ada Belén Albeza González Programación Concurrente 2008-2009
  2. 2. 1. Mensajes
  3. 3. Memoria Mensajes compartida
  4. 4. Modalidades de paso de mensajes Asíncrono Síncrono
  5. 5. Paso asíncrono Enviar Recibir
  6. 6. Paso síncrono Enviar Recibir Cita Enviar Recibir
  7. 7. 2. Cita en Ada
  8. 8. ACCEPT • Sirven para definir las citas (son el RECEIVE) • Están contenidas dentro de una tarea (task) • Al invocarlas desde otra tarea, se produce el envío del mensaje (SEND) • Cuando una tarea ha ejecutado un ACCEPT y otra lo ha llamado, se produce el rendez- vous
  9. 9. ACCEPT nombre_cita(args) DO --cuerpo END nombre_cita;
  10. 10. Consideraciones sobre ACCEPT • Garantiza la exclusión mutua (una tarea sólo puede aceptar las citas de una en una) • Evita interbloqueos (se sigue orden FIFO) • Espera simétrica (tanto emisor como receptor se esperan hasta la cita)
  11. 11. SELECT • Muy similar a un SWITCH en C • Sólo se ejecuta un caso si se cumple la condición y si hay una tarea esperando a dicha cita • Si hay varios casos en los que se cumplen ambas, se ejecuta sólo uno
  12. 12. SELECT WHEN condicion1 => ACCEPT cita1(args) DO --cuerpo1 END cita1; --otras sentencias1 OR WHEN condicion2 => --otra cita END SELECT;
  13. 13. 3. Ejemplo en Ada Productor-Consumidor
  14. 14. Tareas • Productor • Consumidor • Buffer
  15. 15. Tarea Buffer (I) • K: integer = 10 • items: array[0..K-1] • inicio, fin: integer = 0 • cantidad: integer = 0
  16. 16. Tarea Buffer (II) while TRUE loop select when cantidad < K => --producir or when cantidad > 0 => --consumir end select; end loop;
  17. 17. Tarea Buffer (III) when cantidad < K => accept Producir(x: in INTEGER) do items(fin) := x; end Producir; cantidad := cantidad +1; fin := (fin + 1) mod K;
  18. 18. Tarea Buffer (IV) when cantidad > 0 => accept Consumir(x: out INTEGER) do x := items(inicio); end Producir; cantidad := cantidad -1; inicio := (inicio + 1) mod K;
  19. 19. Tarea Consumidor while TRUE loop Buer.Consumir(n); Put(n); end loop;
  20. 20. Tarea Productor n := 0; while TRUE loop Buer.Producir(n); n := n + 1; end loop;
  21. 21. Preguntas (1) • ¿Cuál es la diferencia entre el paso de mensajes síncrono y el asíncrono? • ¿Qué pasa cuando una tarea llama a una cita pero la otra tarea no ha ejecutado un ACCEPT?
  22. 22. Preguntas (II) • En un SELECT, ¿Qué otra condición, aparte de la del WHEN a de cumplirse para que se ejecute el ACCEPT de un caso determinado? • ¿Qué pasa si en un SELECT varios casos cumplen las condiciones?

×