Tema3 - COMUNICACION Y SINCRONIZACION DE PROCESOS

Tema3 - COMUNICACION Y SINCRONIZACION DE PROCESOS - Tema 3:...

Info iconThis preview shows page 1. Sign up to view the full content.

View Full Document Right Arrow Icon
This is the end of the preview. Sign up to access the rest of the document.

Unformatted text preview: Tema 3: Sincronizacin y Comunicacin de Procesos 08/02/2006 1. 2. 3. 4. 5. 6. 7. Introduccin Exclusin mutua Semforos Monitores Mensajes Interbloqueos Ejercicios propuestos Bibliografa A. Silverschatz, J. Peterson, P. Galvin. Sistemas Operativos. Conceptos fundamentales. 4 Edicin. Tema 5 W. Stalling. Sistemas Operativos. 4 Edicin. Captulo 5. A.S. Tanenmbaum. Sistemas Operativos Modernos. Temas 2, 11 y 12. Introduccin Multiprogramacin, multiprocesamiento y procesamiento distribuido Necesidad de sincronizar y comunicar procesos Mtodos bsicos de comunicar procesos Comparticin de datos Intercambio de informacin SECCION CRITICA Se denomina Seccin Crtica (SC) de un proceso a aquellas partes de su cdigo que no pueden ejecutarse de forma concurrente Protocolo: Cdigo dedicado a asegurar que la seccin crtica se ejecuta de forma exclusiva Requisitos a satisfacer por cualquier solucin: Exclusin Mutua. Slo un proceso debe tener permiso para entrar en la SC en un momento dado. Espera limitada. Un proceso permanece en su SC slo por un tiempo finito. No puede demorarse un proceso indefinidamente en una seccin crtica. Progresin. Cuando ningn proceso est en su SC, cualquier proceso que solicite entrar debe hacerlo sin dilacin Seccin Crtica: Soluciones por Software La responsabilidad de mantener la Exclusin Mutua recae sobre los procesos. Es necesaria una memoria principal compartida accesible a todos los procesos. Existe una exclusin mutua elemental en el acceso a la memoria. Algoritmo de Peterson Algoritmo de Dekker Inconvenientes: La espera de acceso a un recurso se realiza de forma ocupada. Presentan dificultades ante una cantidad elevada de procesos concurrentes. Soluciones por Software: Algoritmo de Peterson booleano seal[2]; int turno; void P1() void P0() { { while (true) while (true) { { ... ... seal[1] = true; seal[0] = true; turno = 0; turno = 1; while (seal[0] && turno==0); while (seal[1] && turno==1); /*Seccin Crtica*/ /*Seccin Crtica*/ seal[1] = false; seal[0] = false; ... ... } } } } void main() { seal[0] = false; seal[1] = false; cobegin P0();P1(); coend; } Soluciones por Software: Algoritmo de Dekker booleano seal[2]; int turno; void P0() { while (true) { ... seal[0] = true; while (seal[1]) if (turno ==1) { seal[0] = false; while (turno == 1); seal[0] = true; } /*Seccin Crtica*/ turno = 1; seal[0] = falso; ... } } void P1() { while (true) { ... seal[1] = true; while (seal[0]) if (turno ==0) { seal[1] = false; while (turno == 0); seal[1] = true; } /*Seccin Crtica*/ turno = 0; seal[1] = falso; ... } } void main() { seal[0] = false; seal[1] = false; turno = 1; cobegin P0();P1(); coend; } Seccin Crtica: Soluciones por Hardware Inhabilitacin de interrupciones Sistemas monoprocesador. Slo aplicable a nivel de ncleo while (true) { ... Inhabilitar interrupciones; /*Seccin crtica*/ Habilitar interrupciones; ... } Se degrada la eficiencia del procesador Instrucciones especiales de mquina Se realizan varias acciones atmicamente: leer y escribir, leer y examinar, ... No estn sujetas a interferencias de otras instrucciones Semforos Tipo Abstracto de Datos Datos: Contador entero Cola de procesos en espera Operaciones: Inicializar: Inicia el contador a un valor no negativo P(): Disminuye en una unidad el valor del contador. Si el contador se hace negativo, el proceso que ejecuta P se bloquea. V(): Aumenta en una unidad el valor del contador. Si el valor del contador no es positivo, se desbloquea un proceso bloqueado por una operacin P. Las operaciones son atmicas a nivel hardware Se denomina semforo binario aquel en el que el contador slo toma valor 0 1. El proceso que espera entrar en la SC no usa el procesador, est bloqueado. Semforo general: definicin de primitivas struct TSemforo { int contador; TColaProcesos Cola; } void inicializar(TSemforo s, int n) { s.contador=n; } void P(TSemforo s) { s.contador--; if (s.contador<0) { poner este proceso en s.cola; bloquear este proceso; } } void V(TSemforo s) { s.contador++; if (s.contador<=0) { quitar un proceso p de s.cola; poner el proceso p en la cola de listos; } } Semforo binario: definicin de primitivas struct TSemforo_bin { int contador; TColaProcesos cola; } void inicializarB(TSemforo_bin s, int n) { s.contador=n; } void PB(TSemforo_bin s) { if (s.contador == 1) s.contador = 0; else { poner este proceso en s.cola; bloquear este proceso; } } void VB(TSemforo_bin s) { if (s.cola.esvacia()) s.contador = 1; else { quitar un proceso p de s.cola; poner el proceso p en la cola de listos; } } Semforos: exclusin mutua El valor asignado al contador indicar la cantidad de procesos que pueden ejecutar concurrentemente la seccin crtica Los semforos se deben inicializar antes de comenzar la ejecucin concurrente de los procesos. TSemforo s; void Pi(); { while (true) { ... P(s); seccin crtica; V(s) ... } } void main { inicializar(s, 1) cobegin P1(); P2(); ... ; Pn(); coend } Semforos: sincronizacin entre procesos El uso de semforos permite la sincronizacin entre procesos Problema del productor - consumidor Uno o ms productores generan cierto tipo de datos y los sitan en una zona de memoria o buffer. Un nico consumidor saca elementos del buffer de uno en uno. El sistema debe impedir la 2 Semforos : s y n superposicin de operaciones sobre el buffer. Solucin: Tamao de buffer ilimitado TSemforo s, n; s para garantizar el acceso a la seccin crtica void productor() { while (true) { producir(); P(s); aadir_buffer(); V(s); V(n); } } void consumidor() { while (true) { P(n); P(s); coger_ buffer(); V(s); consumir(); } } n para gestin de P y C void main() { sincronizacin del consumidor inicializar(s, 1); inicializar(n, 0); cobegin Al comienzo hay 0 elementos productor(); s=1, slo 1 proceso consumidor(); coend; } Semforos: sincronizacin entre procesos 3 Semforos : s, n y e para gestin de buffer Solucin: Tamao de buffer limitado #define tamao_buffer N TSemforo e, s, n; void productor() { while (true) { producir(); P(e); P(s); aadir_buffer(); V(s); V(n); } } void consumidor() { while (true) { P(n); P(s); coger_ buffer(); V(s); V(e); consumir(); } } Al producir un elemento, void main() { Se gasta del buffer = P inicializar(s, 1); inicializar(n, 0); inicializar(e, tamao_buffer); cobegin Al consumir un elemento, productor(); consumidor(); Se libera del buffer = P coend; } Semforos: sincronizacin entre procesos Problema de los lectores y escritores Se dispone de una zona de memoria o fichero a la que acceden unos procesos (lectores) en modo lectura y otros procesos en modo escritura (escritores). - Los lectores 2 Semforos : al w, Seccin crtica pueden acceder fichero de forma concurrente. - Los escritores deben acceder al fichero de manera exclusiva entre mutex ?? ellos y con los lectores. El sistema debe coordinar el acceso a la memoria o al fichero para que s cumplan las restricciones. Solucin: Prioridad a los lectores Aadiendo una variable TSemforo mutex, w; void lectorj() int lectores; Nuevo problema de SC (semforo MUTEX) { ... void escritori() P(mutex); { lectores++; ... if (lectores==1) P(w); P(w); V(mutex) escribir(); leer(); V(w); P(mutex); ... lectores--; } if (lectores==0) V(w); void main() V(mutex) { ... inicializar(mutex, 1); } inicializar(w, 1); Cmo se sabe cual es el ltimo? lectores=0; cobegin El primer lector realiza la P, escritor1();...; escritorn(); lector1(); ... ; lectorm(); Slo realiza la V el ltimo el resto NO, pueden leer a la vez coend; } Semforos: sincronizacin entre procesos Problema de los lectores y escritores Se dispone de una zona de memoria o fichero a la que acceden unos procesos (lectores) en modo lectura y otros procesos en modo escritura (escritores). - Los lectores pueden acceder al fichero de forma concurrente. Y la prioridad?? - Los escritores deben acceder al fichero de manera exclusiva entre ellos y con los lectores. El sistema debe coordinar el acceso a la memoria o al fichero para que s cumplan las restricciones. Supongamos que llegan por ste orden: Solucin: Prioridad a los lectores un lector, y un nuevo TSemforo mutex, w;un escritorvoid lectorj() lector int lectores; { ... void escritori() P(mutex); { lectores++; ... if (lectores==1) P(w); P(w); V(mutex) escribir(); leer(); V(w); P(mutex); ... lectores--; } if (lectores==0) V(w); void main() V(mutex) { ... inicializar(mutex, 1); } inicializar(w, 1); lectores=0; cobegin escritor1();...; escritorn(); lector1(); ... ; lectorm(); coend; } Semforos: sincronizacin entre procesos Solucin: Prioridad a los escritores TSemforo mutex1, mutex2, w, r; int lectores, Supongamos que llegan por ste orden: escritores; void lectori() void escritorj() Sig. Lector para por el nuevo semforo r un lector, un escritor, {lector, escritor { ... ... P(r); P(mutex2); P(mutex1); escritores++; lectores++; if (escritores==1) P(r); if (lectores==1) P(w); V(mutex2); V(mutex1); P(w); V(r); escribir(); leer(); V(w); Adelanta el nuevo lector P(mutex1); P(mutex2); lectores--; escritores--; if (lectores==0) V(w); if (escritores==0) V(r); V(mutex1); V(mutex2) ... ... } } void main() { inicializar(mutex1, 1); inicializar(mutex2, 1); inicializar(w, 1); inicializar(r, 1); lectores = 0; escritores = 0; cobegin escritor1();...; escritorn(); lector1(); ... ; lectorm(); coend; } Semforos: sincronizacin entre procesos Solucin: Acceso segn orden de llegada TSemforo mutex, fifo, w; int lectores; void lectori() { ... P(fifo); P(mutex); lectores++; if (lectores==1) P(w); V(mutex); V(fifo); leer(); P(mutex); lectores--; if (lectores==0) V(w); V(mutex); ... } void escritorj() { ... P(fifo); P(w); V(fifo); escribir(); V(w); ... } void main() { inicializar(mutex, 1); inicializar(fifo, 1); inicializar(w, 1); lectores = 0; cobegin escritor1();...; escritorn(); lector1(); ... ; lectorm(); coend; } Semforos: sincronizacin entre procesos Problema del barbero dormiln Una barbera tiene una sala de espera con n sillas, y una habitacin con un silln donde se atiende a los clientes. Si no hay clientes el barbero se duerme. Si un cliente entra en la barbera y todas las sillas Clientes sincroniza al barbero estn ocupadas, entonces se:va, sino, se sienta en una de las sillas disponibles .Si el barbero est : clientes de uno en uno barbero dormido, el cliente lo despertar. #define sillas n TSemforo mutex, clientes, barbero; int espera; Lo primero ejecuta P y bloquea excepto void cliente y han ejecutado la i() void barbero() si { han llegado antes clientes { operacin V correspondiente. P(mutex); while (true) if (espera<sillas) { { P(clientes); espera=espera+1; P(mutex); V(clientes); espera=espera-1; V(mutex); V(barbero); P(barbero); V(mutex); se_corta_pelo(); cortar_pelo(); } } else V(mutex); } que el barbero vaya } void main() En este semforo se bloquean los despertando uno a uno con V { inicializar(mutex, 1); inicializar(clientes, 0); inicializar(barbero, 0); espera=0;al ejecutar P esperando clientes cobegin barbero(); cliente1(); cliente2(); ... clientem(); coend; } El sistema debe coordinar el barbero y variable espera Mutex: los clientes. Semforos: sincronizacin entre procesos Problema de los cinco filsofos Cinco filsofos se dedican a pensar y a comer en una mesa circular. En el centro de la mesa hay un cuenco con arroz, y la mesa est puesta con cinco platos y cinco palillos, uno por cada filsofo. Cuando un filsofo tiene hambre se sienta en la mesa a comer en su sitio. El filsofo slo puede coger un palillo cada vez y no le puede quitar un palillo a un compaero que lo tenga en la mano. Cuando un filsofo tiene los dos palillos come sin soltarlos hasta que termine y vuelve a pensar. El sistema debe coordinar los filsofos para evitar la espera indefinida y no se mueran de hambre. Solucin que mantiene la exclusin mutua TSemforo palillo[5]; void filsofo(int i) { while (true) { Se produce interbloqueo pensar(); cuando acuden a comer P(palillo[i]); todos a la vez P(palillo[(i+1)%5]); comer(); V(palillo[i]); V(palillo[(i+1)%5]); } } void main() { int i; for (i=0; i<5; i++) inicializar(palillo[i], 1); cobegin filsofo(0); filsofo(1); ... filsofo(4); coend; } Semforos: sincronizacin entre procesos Problema de los cinco filsofos Filsofo 0 pensar P(palillo[0]) P(palillo[1]) Filsofo 1 pensar P(palillo[1]) Filsofo 2 pensar P(palillo[2]) Filsofo 3 pensar P(palillo[3]) Filsofo 4 pensar P(palillo[4]) Todos los P(palillo[3]) P(palillo[4]) P(palillo[2]) filsofos estn pensando P(palillo[0]) Estn hambrientos se sientan en la mesa Bloqueado Bloqueado Bloqueado Bloqueado Bloqueado Cogen un palillo (p.e izda) Y se acaban los palillos Al intentar coger el otroalillo (p.e dcha) Se bloquean todos interbloqueo Semforos: sincronizacin entre procesos Problema de los cinco filsofos Solucin que evita los interbloqueos y mantiene la exclusin mutua TSemforo palillo[5], silla; void filsofo(int i) { Solucin: Slo se pueden sentar while (true) { en la mesa 4 filsofos a la vez pensar(); P(silla); P(palillo[i]); P(palillo[(i+1)%5]); V(silla); comer(); V(palillo[i]); V(palillo[(i+1)%5]); } } void main() { int i; for (i=0; i<5; i++) inicializar(palillo[i], 1); inicializar(silla, 4); cobegin filsofo(0); filsofo(1); ... filsofo(4); coend; } Semforos: sincronizacin entre procesos Problema de los cinco filsofos Filsofo 0 pensar P(silla) P(palillo[0]) Filsofo 1 pensar P(silla) P(palillo[1]) Filsofo 2 pensar P(silla) P(palillo[2]) Filsofo 3 pensar P(silla) P(palillo[3]) Filsofo 4 pensar P(silla) bloqueado Todos los filsofos estn pensando Estn hambrientos se sientan en la mesa P(palillo[1]) P(palillo[2]) P(palillo[3]) P(palillo[4]) Bloqueado Nuevo semforo, cada uno coge una silla Bloqueado Bloqueado Bloqueado Bloqueado Bloqueado Bloqueado Comer () Bloqueado Slo dejan pasar a 4 Bloqueado se Bloqueado V(palillo[4]) Bloqueado Bloqueado Bloqueado Bloqueado Comer() V(palillo[3]) Bloqueado V(silla) Bloqueado Los procesos van alternando entre comer y el semforo de los palillos Semforos: Limitaciones Resulta difcil construir un programa correcto mediante semforos. No es sencillo recordar qu semforo est asociado a cada recurso o variable. Las operaciones P y V se distribuyen por todo el programa y no es fcil advertir el efecto global que provocan. El usuario es responsable tanto de la gestin de la exclusin mutua como de la sincronizacin entre los procesos. Cuando se examina un recurso y este est ocupado el proceso siempre se bloquea. Monitores Tipo Abstracto de Datos: Datos locales, procedimientos y una secuencia de inicio. Los datos locales slo estn accesibles desde los procedimientos del monitor. A un monitor slo puede entrar un proceso en un instante dado, de modo que si un proceso quiere usar un monitor y existe otro proceso que ya lo est usando, entonces el proceso que quiere entrar se suspende hasta que salga el que est dentro. Si los datos del monitor representan a algn recurso, el monitor ofrecer un servicio de exclusin mutua en el acceso a ese recurso. Escribir Recurso Leer Monitor sencillo Monitores: Sincronizacin El monitor proporciona sincronizacin por medio de variables de condicin. Procedimientos para operar con las variables de condicin: Espera(condicin): Suspende la ejecucin del proceso que llama bajo la condicin. Se dispone de una cola de procesos a cada variable de condicin. Seal(condicin): Reanuda la ejecucin de algn proceso suspendido en el procedimiento anterior. Si no hay procesos suspendidos no hace nada. Cola por cada proceso se bloquea en una cola de una Cuando un variable en varios procedimientos, Veremos que se divide 1 var. Cond semforo Diferente a semforos variable condicin, programacin no concurrente Ms parecido con la sale del monitor, permitiendo Cada procedimiento hace una parte que otro proceso pueda entrar en l. La propia naturaleza del monitor garantiza la exclusin mutua, sin embargo, la sincronizacin entre los procesos es responsabilidad del Variables de condicin programador. Monitores: sincronizacin entre procesos Productor y consumidor: Tamao de buffer limitado struct TMonitor { TElementos buffer[N]; dos problemas de sincronizacin int sigent, sigsal; int contador; condition no_lleno, no_vacio; } { sigent = 0; sigsal = 0; contador = 0; } Procedimientos del monitor: Bloqueo del productor void coger(TElemento x) void aadir(TElemento x) Bloqueo del consumidor { { if (contador==0) if (contador==N) espera(no_vacio); espera(no_lleno); x = buffer[sigsalt]; buffer[sigent] = x; sigsal = (sigsal + 1) %N; sigent = (sigent + 1) %N; contador--; contador++; seal(no_lleno); seal(no_vaco); } } Procesos: void productor() void consumidor() { { TElemento x; TElemento x; while (true) while (true) { { x = producir(); coger(x); aadir(x); consumir(x); } } } } void main() { cobegin { productor(); consumidor(); } coend; } Monitores: sincronizacin entre procesos Productor y consumidor: Tamao de buffer limitado struct TMonitor { TElementos buffer[N]; int sigent, sigsal; int contador; sigent condition no_lleno, no_vacio; }apuntar donde el productor dejar el elemento producido sigsal { sigent = 0; sigsal = 0; contador = 0; } Variables consumidor coger el elemento apuntar desde donde el : buffer Procedimientos vector que simula el buffer de elementos del monitor: void aadir(TElemento x) { if (contador==N) espera(no_lleno); buffer[sigent] = x; sigent = (sigent + 1) %N; contador++; seal(no_vaco); } Procesos: void coger(TElemento x) { if (contador==0) espera(no_vacio); x = buffer[sigsalt]; sigsal = (sigsal + 1) %N; contador--; seal(no_lleno); } void main() { cobegin { productor(); consumidor(); } coend; } void productor() void consumidor() { { TElemento x; TElemento x; while (true) while (true) { { x = producir(); coger(x); aadir(x); consumir(x); } } } } Monitores: sincronizacin entre procesos Productor y consumidor: Tamao de buffer limitado struct TMonitor { Contador TElementos buffer[N]; de elementos que tiene el buffer indicar el n int sigent, sigsal; int contador; no_lleno condition no_lleno, no_vacio; bloquear al productor en el caso de que el buffer est lleno } no_vacio { sigent = 0; sigsal 0; contador no_lleno bloquear hasta que=el buffer est= 0; } bloquea al consumidor en el caso de que el buffer est vaco Procedimientos del monitor: hasta que el buffer est no_vacio void coger(TElemento x) void aadir(TElemento x) { { if (contador==0) if (contador==N) espera(no_vacio); espera(no_lleno); x = buffer[sigsalt]; buffer[sigent] = x; sigsal = (sigsal + 1) %N; sigent = (sigent + 1) %N; contador--; contador++; seal(no_lleno); seal(no_vaco); } } cdigo que ejecutan los procesos productor y consumidor Procesos: void main() void productor() void consumidor() { { { cobegin TElemento x; TElemento x; { while (true) while (true) productor(); { { consumidor(); x = producir(); coger(x); } aadir(x); consumir(x); coend; } } } } } Monitores: sincronizacin entre procesos Lectores y escritores: Prioridad a los escritores lectores struct TMonitor indicar el n de lectores que leen en cada momento Escritores { permite saber si hay int lectores, escritores; un escritor escribiendo en el fichero tcnica escribir; observar que nos permite que o 1 condition leer, que slo puede valer 0 varios lectores puedan estar simultneamente accediendo al fichero } { lectores = 0; escritores = 0 } los procesos lectores al ejecutar su protocolo de entrada (procedimiento pre_leer) slo comprueban si hay Procedimientos del monitor: escritores, void pre_leer()pero no si ya existen otros lectores { if ((escritores > 0) || (escribir.n_cola>0)) espera(leer); lectores++; seal(leer); pre_escribir s que comprueba la existencia de otros } escritores, si ya existe un escritor accediendo al void post_leer() otro escritor podr pasar y fichero ningn { quedar bloqueado en espera(escribir). lectores--; Pero no miran en la cola if (lectores == 0) seal(escribir); El aspecto de la prioridad se observa en que los lectores } comprueban si hay algn escritor accediendo al fichero o si void pre_escribir() existe algn escritor en la cola { if ((lectores>0) || (escritores > 0)) espera(escribir); escritores++; } void post_escribir() { escritores--; if (escribir.n_cola>0) seal(escribir); else seal(leer); } Monitores: sincronizacin entre procesos Lectores y escritores: Prioridad a los escritores Procesos: void lectori() { .. pre_leer(); leer(); post_leer(); ... } void escritorj() { .. pre_escribir(); escribir(); post_escribir(); ... } void main() { cobegin escritor1();...; escritorn(); lector1(); ... ; lectorm(); coend; } Monitores: sincronizacin entre procesos Problema de los cinco filsofos (I) struct TMonitor estado == 0: pensando { estado == 1: hambriento int estado[5]; estado == 2: comiendo condition silla[5]; } { for (i=0; i<5; i++) inicializar(estado[i], 0); } Procedimientos del monitor: void coge_palillos(int i) { estado[i]=1; prueba(i); if (estado[i]==1) espera(silla[i]); } void deja_palillos(int i) { Una vez estado[i]=0;que puede cambia el estado a comiendo Desbloquea la silla (seal(silla[j])) prueba((i+1)%5); //le da el palillo al filsofo de la derecha si lo necesita prueba((i+4)%5); //le da el palillo al filsofo de la izquierda si lo necesita } void prueba(int i) { ifSi no estn comiendo los de su izda. y dcha. y l sigue ((estado[(i+1)%5]!=2) && (estado[(i+4)%5]!=2) && estado[i] ==1)) hambriento se pone a comer haciendo un espera(silla[i]) { estado[i]=2; seal(silla[i]); } } Monitores: sincronizacin entre procesos Problema de los cinco filsofos (II) Procesos: void filosofo (int i) { while (true) { pensar(); coge_palillos(i); comer(); deja_palillos(i); } } void main() { int i; cobegin filsofo(0); filsofo(2); ... filsofo(4); coend; } En coge_palillos y deja_palillos se gestiona toda la sincronizacin de todos los procesos Protocolos de entrada, similar a pre_leer Esta solucin mantiene la exclusin mutua y evita interbloqueos pero puede provocar que algn filsofo se muera de hambre. Mensajes El paso de mensajes resuelve la comunicacin y la sincronizacin de procesos. Adecuado para sistemas centralizados y distribuidos. Primitivas: Enviar(destino, mensaje) Recibir(origen, mensaje) Las primitivas son atmicas a nivel hardware. Direccionamiento Directo: Se nombra de forma explcita en la primitiva el proceso al que se refieren. Enviar (Procesoi, mensaje) Indirecto: Los mensajes se envan y se reciben a travs de una entidad intermedia llamada buzn. Enviar (buzn, mensaje) Se desacopla el emisor y el receptor Los conjuntos de emisores y receptores no tienen porqu tener la misma cardinalidad. La asociacin de procesos a buzones puede ser Mensajes Indirecto: Los mensajes se envan y se reciben a travs de una entidad intermedia llamada buzn. Enviar (buzn, mensaje) Tipo ms utilizado: indirecto Se desacopla el emisor y el receptor Los conjuntos de emisores y receptores no tienen porqu tener la misma cardinalidad. La asociacin de procesos a buzones puede ser esttica o dinmica. del indirecto sobre el directo Ventaja Mensajes: sincronizacin Modelos de sincronizacin: Enviar Bloqueante: El proceso que enva slo prosigue su tarea cuando el mensaje ha sido recibido No Bloqueante: El proceso que enva un mensaje sigue su ejecucin sin preocuparse de si el mensaje se recibe o no. Invocacin remota: El proceso que enva el mensaje slo prosigue su ejecucin cuando ha recibido una respuesta explcita del receptor. Modelos de sincronizacin: Recibir Bloqueante: El proceso que realiza recibir un mensaje lo recoge si ste existe o bien se bloquea si el mensaje no est. No Bloqueante: El proceso que realiza recibir un mensaje especifica un tiempo mximo de espera del mensaje. Recibir(buzn, mensaje, tiempo_espera) Comunicacin de mensajes (enviar-recibir) a travs de buzon Mensajes: estructura de los mensajes Intercambio de informacin: Por valor: Se realiza una copia del mensaje desde el espacio de direcciones del receptor. Por referencia: Se transmite slo un puntero al mensaje. Clasificacin Longitud fija Longitud variable De tipo definido Los mensajes constan de una cabecera y de un cuerpo Emisor Receptor Longitud Tipo Inf. Control Contenido del mensaje Cabecera Cuerpo Mensajes: exclusin mutua Ejemplo: Utilizar un mensaje como testigo entre los procesos. Uso de la SC con mensajes Enviar no bloqueante y Recibir bloqueante Direccionamiento indirecto. Existencia de un nico buzn: exmut Mensajes de contenido nulo. Exclusin mutua por medio de mensajes #define N_procesos xxx TBuzn exmut; void P(int i) { mensaje msj; while (true) { ... recibir(exmut, msj); /*acceso a la seccin crtica*/ enviar(exmut, msj) ... Se bloquea en recibir hasta que enviar } con un NULL( solo sincroniza) } void main() desbloquee { crear_buzn(exmut); enviar(exmut, NULL); cobegin P(1); P(2); ..., P(N_procesos); coend; } Mensajes: sincronizacin Productor y consumidor: buffer limitado #define tamao xxx int i; TBuzon puede_producir, puede_consumir; void productor() { mensaje msjp,aux; while(true) { msjp = producir(); recibir(puede_producir, aux); enviar(puede_consumir, msjp); } } void consumidor() { mensaje msjc; while(true) { recibir(puede_consumir, msjc); enviar(puede_producir, NULL); consumir(msjc); } } void main() { crear_buzn(puede_producir); crear_buzn(puede_consumir); for(i=0; i<capacidad; i++) enviar(puede_producir,NULL); cobegin productor(); consumidor(); coend; } Mensajes: sincronizacin Productor y consumidor: buffer limitado #define tamao xxx int i; TBuzon puede_producir, puede_consumir; void productor() { Buzones o testigos mensaje msjp,aux; while(true) { msjp = producir(); recibir(puede_producir, aux); enviar(puede_consumir, msjp); } } bloqueante Hay msg se coge Y produce No hay, se bloquea (est lleno) Enva el mensaje para que lo recoja el consumidor Mensajes: sincronizacin Productor y consumidor: buffer limitado bloqueante Hay msg se coge y consume No hay mensajes El "buffer" est vaco void consumidor() Intenta coger un mensaje { mensaje msjc; Enva un mensaje NULO para que el while(true) productor pueda producir { recibir(puede_consumir, msjc); enviar(puede_producir, NULL); consumir(msjc); } } void main() { crear_buzn(puede_producir); crear_buzn(puede_consumir); for(i=0; i<capacidad; i++) enviar(puede_producir,NULL); cobegin productor(); consumidor(); coend; } Interbloqueos Definicin: Bloqueo permanente de un conjunto de procesos que compiten por los recursos del sistema o bien se comunican unos con otros. Los procesos adquieren algn recurso y esperan a que otros recursos retenidos por otros procesos se liberen. Ejemplo: void Proceso1() { ... P(S1) P(S2) ... V(S2) V(S1) } void Proceso2() { ... P(S2) P(S1) ... V(S1) V(S2) } Caracterizacin del interbloqueo: Exclusin mutua Retencin y espera No existencia de expropiacin Espera circular Interbloqueos Prevencin: Evitar cualquier posibilidad que pueda llevar a una situacin de interbloqueo Evitar una de las condiciones del interbloqueo Retencin y espera: Un proceso con un recurso no puede pedir otro. No existencia de expropiacin: Permitir la expropiacin de recursos no utilizados. Espera circular: Se solicitan los recursos segn un cierto orden establecido. Prediccin: Se decide dinmicamente si la peticin actual de asignacin de un recurso a un proceso podra, de concederse, llevar potencialmente a un interbloqueo No iniciar un proceso si sus demandas pueden llevar a interbloqueo. No conceder una solicitud de recursos a un proceso si esta asignacin puede llevar a interbloqueo: Algoritmo del banquero. Deteccin: Comprobar peridicamente si se ha producido un interbloqueo Interbloqueos Gafos de asignacin de recursos: Se identifican los procesos, recursos, peticiones y asignaciones. Asig n naci R1 R1-P1-R2-P2-R3-P3-R1 P1 So lici R2 tud P2 R3 P3 R1-P2-R3-P3-R1 Si no existen ciclos: No hay interbloqueo Existen ciclos: Puede existir interbloqueo. Si slo hay un elemento por cada tipo de recurso, la existencia de un ciclo es condicin necesaria y suficiente para el interbloqueo. Si hay algn camino que no sea ciclo, que sale de alguno de los nodos que forman el ciclo, entonces no hay interbloqueo. Interbloqueos Ejemplo1 R1 P1 R2 P2 R3 P3 Grafo de asignacin de recursos con interbloqueo Ejemplo2 P1 R1 R2 P3 P2 Grafo de asignacin de recursos con ciclo pero sin interbloqueo Interbloqueos Recuperacin: Romper el interbloqueo para que los procesos puedan finalizar su ejecucin y liberar los recursos. Reiniciar uno o ms procesos bloqueados Considerar: Prioridad del proceso Tiempo de procesamiento utilizado y el que resta Tipo y nmero de recursos que posee Nmero de recursos que necesita para finalizar Nmero de procesos involucrados en su reiniciacin. Expropiar los recursos de algunos de los procesos bloqueados Buscar soluciones combinadas Agrupar los recursos en clases disjuntas Se evita el interbloqueo entre las clases Usar en cada clase el mtodo ms apropiado para evitar o prevenir en ella el interbloqueo ...
View Full Document

Ask a homework question - tutors are online