Concurrencia y Exclusión MutuaConcurrencia y Exclusión Mutua
AgendaAgenda
Procesos secuencialesProcesos secuenciales Procesos concurrentesProcesos concurrentes Multiprogramación, multiprocesamiento y Multiprogramación, multiprocesamiento y
procesamiento distribuidoprocesamiento distribuido Interacción y sincronización procesosInteracción y sincronización procesos Corutinas, fork-join y cobegin-coendCorutinas, fork-join y cobegin-coend Exclusión mutua, sección crítica y condición de Exclusión mutua, sección crítica y condición de
competenciacompetencia Soluciones problema exclusión mutuaSoluciones problema exclusión mutua
Programas secuencialesProgramas secuenciales
Especifica una ejecución secuencial de Especifica una ejecución secuencial de una lista de enunciadosuna lista de enunciados
La ejecución del programa da como La ejecución del programa da como resultado la creación de un procesoresultado la creación de un proceso
Procesos concurrentesProcesos concurrentes
Concurrencia: del verbo concurrir, asistir Concurrencia: del verbo concurrir, asistir o acudir al mismo lugar o tiempoo acudir al mismo lugar o tiempo
Especifica dos o más programas Especifica dos o más programas secuenciales ejecutados secuenciales ejecutados concurrentemente como procesos concurrentemente como procesos paralelosparalelos
Características procesos Características procesos concurrentesconcurrentes
Los procesos son concurrentes si Los procesos son concurrentes si existen simultáneamenteexisten simultáneamente
Pueden funcionar en forma totalmente Pueden funcionar en forma totalmente independiente, unos de otrosindependiente, unos de otros
Pueden ser asincronos lo cual significa Pueden ser asincronos lo cual significa que en ocasiones requieren cierta que en ocasiones requieren cierta sincronización y cooperaciónsincronización y cooperación
Clasificación procesos Clasificación procesos concurrentesconcurrentes
Podemos hablar de Podemos hablar de • multiprogramación, multiprogramación, • multiprocesamiento o multiprocesamiento o • procesamiento distribuido procesamiento distribuido
Multiprogramación Multiprogramación Los procesos son ejecutados, concurrentemente, Los procesos son ejecutados, concurrentemente,
compartiendo uno o más procesadores (c/u con su compartiendo uno o más procesadores (c/u con su memoria)memoria)
El kernel del sistema operativo multiplexa los El kernel del sistema operativo multiplexa los procesos en los procesadores procesos en los procesadores
ProcProc22
ProcProc55
ProcProc66
ProcProc33
MM11 CPUCPU11
MM22 CPUCPU22
ProcProc77
ProcProc44
ProcProc11
Multiprocesamiento Multiprocesamiento
Se ejecuta un proceso en cada Se ejecuta un proceso en cada procesador procesador
Los procesos comparten una memoria Los procesos comparten una memoria en común en común
CPUCPU11 CPUCPU22 CPUCPU33
Memoria comúnMemoria común
CPUCPU44
ProcProc11 ProcProc22 ProcProc44ProcProc33
Procesamiento distribuidoProcesamiento distribuido
Los procesos están conectados a Los procesos están conectados a través de una red de comunicacióntravés de una red de comunicación
Cada procesos cuenta con su memoriaCada procesos cuenta con su memoria
CPUCPU11 CPUCPU22 CPUCPU33
MM11
CPUCPU44
ProcProc11 ProcProc22 ProcProc44ProcProc33
MM22 MM33 MM44
red de comunicaciónred de comunicación
Interacción entre procesosInteracción entre procesos
Para poder cooperar, procesos Para poder cooperar, procesos concurrentes deben comunicarse y concurrentes deben comunicarse y sincronizarsesincronizarse
Comunicación permite ejecución de un Comunicación permite ejecución de un proceso para influenciar ejecución de otroproceso para influenciar ejecución de otro
Comunicación entre procesos esta Comunicación entre procesos esta basada en el uso de variables basada en el uso de variables compartidas o envío de mensajescompartidas o envío de mensajes
La sincronizaciónLa sincronización
Frecuentemente, la sincronización es Frecuentemente, la sincronización es necesaria cuando los procesos se necesaria cuando los procesos se comunican comunican
Procesos son ejecutados con Procesos son ejecutados con velocidades impredeciblesvelocidades impredecibles
Para comunicarse un proceso debe Para comunicarse un proceso debe realizar una acción que el otro pueda realizar una acción que el otro pueda detectardetectar
• la acción puede ser asignar un valor a una la acción puede ser asignar un valor a una variable o enviar un mensajevariable o enviar un mensaje
• esto solo trabaja si el “realizar una acción” esto solo trabaja si el “realizar una acción” es anterior al “detectar una acción”es anterior al “detectar una acción”
Entonces la sincronía puede verse como Entonces la sincronía puede verse como un conjunto de restricciones para el un conjunto de restricciones para el ordenamiento de eventosordenamiento de eventos
Programador usa un mecanismo de Programador usa un mecanismo de sincronía para retardar ejecución de un sincronía para retardar ejecución de un proceso para satisfacer una restricciónproceso para satisfacer una restricción
Notación expresar concurrenciaNotación expresar concurrencia
Como indicar una ejecución Como indicar una ejecución concurrenteconcurrente
Que modo de comunicación entre Que modo de comunicación entre procesos se va a utilizarprocesos se va a utilizar
Cual mecanismo de sincronización se Cual mecanismo de sincronización se va a usarva a usar
Especificando ejecución Especificando ejecución concurrenteconcurrente
Existen varias notacionesExisten varias notaciones Importante diferenciar: Importante diferenciar:
• la definición del proceso la definición del proceso • de la sincronización del procesode la sincronización del proceso
Proposiciones recientes separan estos Proposiciones recientes separan estos conceptos diferentes y contienen conceptos diferentes y contienen restricciones sintácticas, que imponen restricciones sintácticas, que imponen una estructura del programa concurrenteuna estructura del programa concurrente
La estructura del programa permite La estructura del programa permite localizar los segmentos que pueden localizar los segmentos que pueden ejecutarse concurrentementeejecutarse concurrentemente
Entre las más comunes:Entre las más comunes:• corutinascorutinas• fork-joinfork-join• el enunciado co-beginel enunciado co-begin
Pueden usarse para especificar un Pueden usarse para especificar un número estático o dinámico de procesosnúmero estático o dinámico de procesos
CorutinasCorutinas Propuestas por Conway en 1963Propuestas por Conway en 1963 Corutinas son subrutinas que permiten una Corutinas son subrutinas que permiten una
transferencia de control de una forma transferencia de control de una forma simétrica más que jerárquicasimétrica más que jerárquica
Cada corutina puede ser vista como la Cada corutina puede ser vista como la implementación de un proceso implementación de un proceso
Bien usadas, son un medio para organizar Bien usadas, son un medio para organizar programas concurrentes que comparten un programas concurrentes que comparten un mismo procesadormismo procesador
Elementos corutinasElementos corutinas
El enunciado resumeEl enunciado resume• transfiere control a la corutina mencionadatransfiere control a la corutina mencionada• guarda información necesaria para controlar la guarda información necesaria para controlar la
ejecución de regresoejecución de regreso El enunciado callEl enunciado call
• inicializa el cálculo de la corutinainicializa el cálculo de la corutina El enunciado returnEl enunciado return
• transfiere el control de regreso al procedimiento transfiere el control de regreso al procedimiento que realizó un callque realizó un call
Ejemplo corutinasEjemplo corutinas
Program P;Program P; -------------------------- -------------------------- call A;call A; -------------------------- --------------------------endend
corutina Acorutina A -------------------------- -------------------------- resume Bresume B;; -------------------------- -------------------------- resume B;resume B;
corutina Bcorutina B -------------------------- -------------------------- resume Aresume A;; -------------------------- -------------------------- return;return;
La ejecuciónLa ejecución
PP Corutina ACorutina A Corutina BCorutina B
call Acall A
resume Bresume B
resume Bresume B
resume Aresume A
returnreturn
endend
Comentarios corutinasComentarios corutinas La ejecución, por parte de un proceso, de La ejecución, por parte de un proceso, de
resume provoca una sincronizaciónresume provoca una sincronización No son adecuadas para un verdadero No son adecuadas para un verdadero
procesamiento paraleloprocesamiento paralelo Son procesos concurrentes en el que el Son procesos concurrentes en el que el
“switcheo de procesos” ha sido “switcheo de procesos” ha sido completamente especificado y no dejado al completamente especificado y no dejado al kernel o a la implementaciónkernel o a la implementación
Lenguajes: SIMULA I y SL5Lenguajes: SIMULA I y SL5
Enunciados fork-joinEnunciados fork-join
Enunciado fork especifica que una rutina Enunciado fork especifica que una rutina puede empezar su ejecuciónpuede empezar su ejecución
La rutina invocada y la rutina invocadora La rutina invocada y la rutina invocadora proceden concurrentementeproceden concurrentemente
Para sincronizar invocada e invocadora, esta Para sincronizar invocada e invocadora, esta última puede ejecutar un joinúltima puede ejecutar un join
Enunciado join retrasa ejecución rutina Enunciado join retrasa ejecución rutina invocadora hasta que la rutina invocada invocadora hasta que la rutina invocada terminetermine
Ejemplo fork-joinEjemplo fork-join
program Pprogram P11
-------------------------- <codigo 1><codigo 1> fork P2fork P2;; -------------------------- <codigo 2><codigo 2> join P2;join P2; -------------------------- <codigo 3><codigo 3>
program Pprogram P22
-------------------------- -------------------------- -------------------------- -------------------------- -------------------------- --------------------------endend
La ejecución La ejecución
PP11 PP22
fork Pfork P22
join Pjoin P22
código 1código 1
código 2código 2
código 3código 3
endend
Comentarios fork-joinComentarios fork-join
Enunciados fork-join puede aparecer en Enunciados fork-join puede aparecer en condicionales y cicloscondicionales y ciclos• es necesario entender bien la ejecución del programa, es necesario entender bien la ejecución del programa,
para saber que rutinas se van a ejecutar para saber que rutinas se van a ejecutar concurrentementeconcurrentemente
Cuando se usa de forma disciplinada los Cuando se usa de forma disciplinada los enunciados son prácticos y poderososenunciados son prácticos y poderosos• fork proporciona un mecanismo para la creación dinámica fork proporciona un mecanismo para la creación dinámica
de procesosde procesos• enunciados similares también están incluidos en PL/I y enunciados similares también están incluidos en PL/I y
MesaMesa
El enunciado cobeginEl enunciado cobegin
Es una forma estructurada de denotar una Es una forma estructurada de denotar una ejecución concurrente ejecución concurrente
Por ejemplo:Por ejemplo:
• denota una ejecución concurrente de Sdenota una ejecución concurrente de S11, ,
SS22, … S, … Snn
• cada uno de los Scada uno de los Sii’s puede ser cualquier ’s puede ser cualquier
enunciado incluyendo un cobegin o un bloque enunciado incluyendo un cobegin o un bloque con declaraciones localescon declaraciones locales
cobegin Scobegin S11 || S || S22 || … || S || … || Sn n coendcoend
Características cobeginCaracterísticas cobegin
La ejecución de un cobegin solo termina La ejecución de un cobegin solo termina cuando la ejecución de todos los Scuando la ejecución de todos los S ii’s terminó’s terminó
No es tan potente como fork-join, pero es No es tan potente como fork-join, pero es suficiente para especificar la mayor parte de suficiente para especificar la mayor parte de los cálculos concurrenteslos cálculos concurrentes
Sintaxis hace explícito cuales rutinas son Sintaxis hace explícito cuales rutinas son ejecutadas concurrentementeejecutadas concurrentemente
Variantes implementadas en ALGOL68, CSP, Variantes implementadas en ALGOL68, CSP, Edison y ArgusEdison y Argus
Comunicación y sincronización Comunicación y sincronización procesosprocesos
Procesos requieren comunicación entre Procesos requieren comunicación entre ellos.ellos.
Procesamiento distribuidoProcesamiento distribuido• envío/recepción de mensajesenvío/recepción de mensajes
Multiprocesamiento:Multiprocesamiento:• pipes: salida proceso es entrada de otropipes: salida proceso es entrada de otro• uso de variables compartidas o de algún uso de variables compartidas o de algún
espacio en común donde puedan leer o escribir espacio en común donde puedan leer o escribir los procesoslos procesos
Ejemplo: spooler impresiónEjemplo: spooler impresión
Cuando un proceso desea imprimir un Cuando un proceso desea imprimir un archivo escribe el nombre de este en un archivo escribe el nombre de este en un directoriodirectorio
Otro proceso, demonio impresión (lpd) Otro proceso, demonio impresión (lpd) verifica si existen archivos por imprimir, verifica si existen archivos por imprimir, los imprime y elimina sus nombres del los imprime y elimina sus nombres del directoriodirectorio
Elementos spooler impresiónElementos spooler impresión
toto.ctoto.cprog.cprog.ctarea.txttarea.txt
44556677
PPaaout = 4out = 4
in = 7in = 7
PPbb
PPa a desea imorimir tdesea imorimir t11
PPb b desea imorimir tdesea imorimir t22
::::
::::
Pasos en impresión archivosPasos en impresión archivos
Proceso AProceso A Proceso BProceso B
lee valor in y almacena en siglee valor in y almacena en sigsig := 7sig := 7actualiza valor in (in = 8)actualiza valor in (in = 8)escribe tescribe t22 en localidad 7 en localidad 7
sale y hace otras cosassale y hace otras cosas
lee valor in y almacena en nextlee valor in y almacena en nextnext := 7next := 7
actualiza valor in (in = 8)actualiza valor in (in = 8)escribe tescribe t11 en localidad 7 en localidad 7
sale y hace otras cosassale y hace otras cosas
termina quantumtermina quantum
termina quantumtermina quantum
Condición de competenciaCondición de competencia
Dos o más procesos leen y/o escriben Dos o más procesos leen y/o escriben en ciertos datos compartidos y el en ciertos datos compartidos y el resultado final depende de quien resultado final depende de quien ejecuta qué y en qué momentoejecuta qué y en qué momento
Solución:Solución:• prohibir que uno o más procesos escriba prohibir que uno o más procesos escriba
en los datos compartidos a la vezen los datos compartidos a la vez
La exclusión mutuaLa exclusión mutua
Garantizar que si un proceso utiliza una Garantizar que si un proceso utiliza una variable o algún recurso compartido, los variable o algún recurso compartido, los demás no podrán usarlos al mismo tiempodemás no podrán usarlos al mismo tiempo
Conocida como mutexConocida como mutex Cada proceso debe verificar que durante Cada proceso debe verificar que durante
cierta parte del tiempo, puede tener acceso a cierta parte del tiempo, puede tener acceso a la memoria compartida de archivos o la memoria compartida de archivos o realizando labores críticas que pueden llevar realizando labores críticas que pueden llevar a conflictosa conflictos
Sección críticaSección crítica
Parte del código en el cual se tiene Parte del código en el cual se tiene acceso a una variable o archivo acceso a una variable o archivo compartido compartido
Corolario:Corolario:• si dos procesos no están al mismo tiempo si dos procesos no están al mismo tiempo
en sección crítica, podemos evitar las en sección crítica, podemos evitar las condiciones de competenciacondiciones de competencia
Asignación recursosAsignación recursos
Sean n procesos que entran en conflicto por Sean n procesos que entran en conflicto por el acceso a un recurso único no compartibleel acceso a un recurso único no compartible
Recurso a usar en sección críticaRecurso a usar en sección crítica Necesario usar un protocolo formado de tres Necesario usar un protocolo formado de tres
partes:partes:
protocolo de adquisiciónprotocolo de adquisición<uso del recurso en sección crítica><uso del recurso en sección crítica>
protocolo de liberaciónprotocolo de liberación
Posibles problemasPosibles problemas
Interbloqueo: los procesos se bloquean entre Interbloqueo: los procesos se bloquean entre si y nadie tiene acceso al recurso, no hay si y nadie tiene acceso al recurso, no hay actividad en ninguno de los procesos actividad en ninguno de los procesos • si estoy solo pasosi estoy solo paso• si no: dejo pasar a los demássi no: dejo pasar a los demás
Hambruna (starvation)Hambruna (starvation)• sean tres procesos: Psean tres procesos: P11 P P22 y P y P33
• si el recurso siempre se le asigna, alternativamente, si el recurso siempre se le asigna, alternativamente, a Pa P11 y P y P22, P, P33 no tendrá acceso a él no tendrá acceso a él
Condiciones solución mutexCondiciones solución mutex
Dos procesos no deben encontrarse al mismo Dos procesos no deben encontrarse al mismo tiempo dentro de sus secciones críticastiempo dentro de sus secciones críticas
No se deben hacer hipótesis sobre la velocidad No se deben hacer hipótesis sobre la velocidad o el número de CPUso el número de CPUs
Ninguno de los procesos que estén en ejecución Ninguno de los procesos que estén en ejecución fuera de su SC puede bloquear a otros procesosfuera de su SC puede bloquear a otros procesos
Ningún proceso debe esperar eternamente para Ningún proceso debe esperar eternamente para entrar a su SCentrar a su SC
Posibles soluciones Posibles soluciones
Des-activación de interrupcionesDes-activación de interrupciones Variables de cerraduraVariables de cerradura Alternancia estrictaAlternancia estricta Esperando que el otro termineEsperando que el otro termine Cediendo el lugar al otro Cediendo el lugar al otro Esperando un tiempo aleatorioEsperando un tiempo aleatorio Algoritmo de DekkerAlgoritmo de Dekker Algoritmo de PetersonAlgoritmo de Peterson
Des-activación interrupcionesDes-activación interrupciones
Solución más simple: cada proceso desactivará Solución más simple: cada proceso desactivará todas sus interrupciones justo antes de entrar todas sus interrupciones justo antes de entrar en sección crítica y las activará al salir de ellaen sección crítica y las activará al salir de ella
Con las interrupciones desactivadas no puede Con las interrupciones desactivadas no puede ocurrir una interrupción de relojocurrir una interrupción de reloj
Problema: un proceso (usuario) podría Problema: un proceso (usuario) podría desactivarlas y nunca activarlas de nuevodesactivarlas y nunca activarlas de nuevo
Si hay más de dos CPUs, la desactivación sólo Si hay más de dos CPUs, la desactivación sólo afecta a uno de ellos afecta a uno de ellos
Variables de cerraduraVariables de cerradura
Antes proceso entre a su sección crítica se hace Antes proceso entre a su sección crítica se hace prueba a una variable tipo cerradura:prueba a una variable tipo cerradura:• si esta es 0: proceso la cambia a 1 y entra a su sección si esta es 0: proceso la cambia a 1 y entra a su sección
críticacrítica• si esta es 1: espera hasta que la variable cambie su valor a si esta es 1: espera hasta que la variable cambie su valor a
00 ProblemaProblema
• proceso P1 lee un valor de 0proceso P1 lee un valor de 0• antes modifique el valor se le acaba el quatumantes modifique el valor se le acaba el quatum• proceso P2 también va a leer un valor de 0proceso P2 también va a leer un valor de 0• se van a tener dos procesos en S.C.se van a tener dos procesos en S.C.
Alternancia estrictaAlternancia estricta
void proc1()void proc1(){{ while (TRUE) {while (TRUE) {
while (turno != 0);while (turno != 0);seccion_critica(P1);seccion_critica(P1);turno=1;turno=1;fuera_sec_crit(P1);fuera_sec_crit(P1);
}}}}
void proc2()void proc2(){{ while (TRUE) {while (TRUE) {
while (turno != 1);while (turno != 1);seccion_critica(P2);seccion_critica(P2);turno=0;turno=0;fuera_sec_crit(P2);fuera_sec_crit(P2);
}}}}
main(){ main(){ turn=1; turn=1; cobegin proc1 || proc2() coend cobegin proc1 || proc2() coend }}
Detalles alternacia estrictaDetalles alternacia estricta
La prueba de una variable, en espera de que La prueba de una variable, en espera de que tome cierto valor se conoce como espera activatome cierto valor se conoce como espera activa• esto provoca un desperdicio del CPUesto provoca un desperdicio del CPU
¿Qué pasa cuando uno de los procesos es más ¿Qué pasa cuando uno de los procesos es más lento que el otro?lento que el otro?• en lo que proc1 ejecuta fue_sec_crit(p1) el proceso en lo que proc1 ejecuta fue_sec_crit(p1) el proceso
proc2 ejecuta sec_crit(p2), cambia valor a turno, proc2 ejecuta sec_crit(p2), cambia valor a turno, ejecuta fue_sec_crit(p2) y regresa al whileejecuta fue_sec_crit(p2) y regresa al while
• se van a tener un proceso bloqueado por otro que no se van a tener un proceso bloqueado por otro que no esta en su sección críticaesta en su sección crítica
Esperando que el otro termineEsperando que el otro termine
int p1in, p2in;int p1in, p2in;
void proc1()void proc1()
{{
while (TRUE) {while (TRUE) {
while (p2in == 1); while (p2in == 1);
p1in = 1;p1in = 1;
sección_critica_P1();sección_critica_P1();
p1in = 0;p1in = 0;
out_sec_critica_P1();out_sec_critica_P1();
}}
}}
ComentariosComentarios
Dos variablesDos variables• p1in: proceso 1 en sección críticap1in: proceso 1 en sección crítica• p2in: proceso 2 en sección críticap2in: proceso 2 en sección crítica
¿Qué pasa si se ejecuta en tandem?¿Qué pasa si se ejecuta en tandem?• se van a tener dos procesos en sección se van a tener dos procesos en sección
críticacrítica
Cediendo el lugar al otroCediendo el lugar al otroint p1deseaentar, p2deseaentrar;int p1deseaentar, p2deseaentrar;
void proc1()void proc1()
{{
while (TRUE) {while (TRUE) {
p1deseaentrar = 1;p1deseaentrar = 1;
while (p2deseaentrar == 1);while (p2deseaentrar == 1);
sección_critica_P1();sección_critica_P1();
p1deseaentrar = 0;p1deseaentrar = 0;
out_sec_critica_P1();out_sec_critica_P1();
}}
}}
ComentariosComentarios
El proceso indica su deseo de entrar a sección El proceso indica su deseo de entrar a sección crítica crítica
Si el otro proceso también quiere entrar le Si el otro proceso también quiere entrar le cede el pasocede el paso
Problema ejecución tandem:Problema ejecución tandem:• si cada proceso asigna un 1 a su bandera antes de si cada proceso asigna un 1 a su bandera antes de
verificar, cada proceso encontrará la bandera del verificar, cada proceso encontrará la bandera del otro con valor 1 los dos entrarán en un ciclo infinito otro con valor 1 los dos entrarán en un ciclo infinito
• se da un bloqueo mutuo (interbloqueo o deadlock)se da un bloqueo mutuo (interbloqueo o deadlock)
Esperando un tiempo aleatorioEsperando un tiempo aleatorioint p1deseaentar, p2deseaentrar;int p1deseaentar, p2deseaentrar;
void proc1() {void proc1() {
while (TRUE) {while (TRUE) {
p1deseaentrar = 1;p1deseaentrar = 1;
while (p2deseaentrar == 1) {while (p2deseaentrar == 1) {
p1deseaentrar = 0;p1deseaentrar = 0;
retraso(aleatorio, algunosciclos);retraso(aleatorio, algunosciclos);
p1deseaentrar = 1;p1deseaentrar = 1;
}}
sección_critica_P1();sección_critica_P1();
p1deseaentrar = 0;p1deseaentrar = 0;
out_sec_critica_P1(); }out_sec_critica_P1(); }
}}
ComentariosComentarios
Se obliga a cada proceso a asignar Se obliga a cada proceso a asignar repetidamente el valor falso a su bandera por repetidamente el valor falso a su bandera por periodos cortos, calculados de forma periodos cortos, calculados de forma aleatoriaaleatoria
Problema: una ejecución tandem y que el Problema: una ejecución tandem y que el valor aleatorio será el mismo para los dos valor aleatorio será el mismo para los dos procesosprocesos
Situación muy poco probable pero posibleSituación muy poco probable pero posible