Documentos de Académico
Documentos de Profesional
Documentos de Cultura
PROGRAMACIÓN PARALELA
Introducción
• La exclusión mutua –o sección crítica– es un problema básico y
fundamental de sincronización entre procesos con memoria
compartida; se trata de asegurar el acceso ordenado a recursos
compartidos para impedir errores e inconsistencias.
• El problema de los trabajos de impresión.
Definición
• Un conjunto de procesos independientes que pueden ser
considerados cíclicos ejecutan en cada ciclo una parte de código que
accede y modifica recursos o zonas de memoria compartidas, la
sección crítica. La intercalación de instrucciones en esas secciones
críticas provocan condiciones de carrera que pueden generar
resultados erróneos dependiendo de la secuencia de ejecución.
• Debemos asegurar la exclusión mutua de la ejecución de esas
secciones críticas; mientras se ejecuta una de ellas no se debe
permitir la ejecución de las secciones críticas de otros procesos.
• El modelo separa al código en
secciones críticas y resto del
•while forever:
código. La solución se basa en • # ...
desarrollar los algoritmos que se
insertan justo antes y después • cs_entry()
de las secciones críticas: • critical_section()
• Pre-protocolo o entrada a la
sección crítica. • cs_exit()
• Pos-protocolo o salida de la
sección crítica. • # ...
Requisitos
• Exclusión mutua
• Se debe asegurar que solo uno de los procesos ejecuta instrucciones de la
sección crítica.
• Progreso o libre de interbloqueos (deadlock free o lock-free)
• Si varios procesos desean entrar a la sección crítica al menos uno de ellos
debe poder hacerlo.
• Espera limitada o libre de inanición (starvation free o wait-free)
• Cualquier proceso debe poder entrar a la sección crítica en un tiempo finito.
Esta condición es deseable pero no siempre se puede asegurar.
Requisitos de Dijkstra
• La solución debe ser simétrica: no se permiten soluciones que
cambien el comportamiento o la prioridad estática de algún proceso.
• No se deben hacer suposiciones de la velocidad relativa de los
procesos, ni se puede suponer que las velocidades sean constantes.
• Entrada inmediata o no interferencia: un proceso que se interrumpe
en el resto del código no debe interferir ni bloquear a los demás
procesos.
• Si varios procesos desean entrar simultáneamente, la decisión en la
entrada de la sección crítica debe tomar un número finito de pasos.
Concurrencia en competencia de recursos
Proceso 1 Proceso 2
• void P1( ) • void P2( )
{ {
• while(true){ • while(true){
• codigo antes de la SC • codigo antes de la SC
• enterCritical (Ra); • enterCritical (Ra);
• SC; • SC;
• exitCritical(RA); • exitCritical(RA);
• codigo despues de la SC • codigo despues de la SC
• } • }
} }
Algoritmos – Convenciones de prog.
• Los programas tienen secciones críticas y resto del código. No
podemos modificar las secciones críticas ni interesa lo que se hace en
el resto; de este último tampoco tenemos información del tiempo
que tarda o cómo se ejecuta.
• Finalmente, suponemos que el tiempo de ejecución de las secciones
críticas es finito.
• Nuestra responsabilidad será desarrollar los algoritmos para el pre y
pos protocolo.
Requerimientos para exclusión mutua
• bandera[0] = 1 • Bandera[1]=1
• turno = 1 • turno = 0
• while( bandera[1] && turno == 1 • while( bandera[0] && turno == 0
); );
• SC() • SC()
• bandera[0] = 0 • bandera[1] = 0