Escolar Documentos
Profissional Documentos
Cultura Documentos
ndice
Capitulo 4 Exclusin:: Concurrencia y sincronizacin. o 4.1 Principios generales de concurrencia. o 4.2 Exclusin mutua: soluciones por software.
Los conceptos claves en los que se basan los sistemas operativos modernos
son el de proceso y el de hilo. Los temas fundamentales de diseo de sistemas operativos estn relacionados con la gestin de procesos:
monoprocesador.
o Multiproceso: Es la gestin de varios procesos dentro de un sistema
multiprocesador.
o Proceso distribuido: Es la gestin de varios procesos que ejecutan en
Concurrencia.
fundamentales para el diseo de sistemas operativos. La concurrencia comprende un gran nmero de cuestiones de diseo, incluyendo la comunicacin entre procesos, comparticin y competencia por los recursos, sincronizacin de la ejecucin de varios procesos y asignacin del tiempo de procesador a los procesos.
1. void 2. 3. 4. 5. 6. 7.
ejemplo (void) { printf (Digite un nmero: ); scanf ( %d, &pos_comp); pos_comp += 10; printf (El nmero digitado ms 10 es: %d, pos_comp);
8.
9.
return;
}
tiempo de procesador de la mquina fuese compartido dinmicamente entre varios trabajos o aplicaciones activas.
o Aplicaciones estructuradas: Como ampliacin de los principios del diseo
modular y la programacin estructurada, algunas aplicaciones pueden implementarse eficazmente como un conjunto de procesos concurrentes.
o Estructura del sistema operativo: Las mismas ventajas de estructuracin
son aplicables a los programadores de sistemas y se ha comprobado que algunos sistemas operativos estn implementados como un conjunto de procesos.
intercalan en el tiempo para dar la apariencia de ejecucin simultnea. Aunque no se consigue un proceso paralelo real y aunque se produce una cierta sobrecarga en los intercambios de procesos de un sitio a otro, la ejecucin intercalada produce beneficios importantes en la eficiencia del procesamiento y en la estructuracin de los programas.
P1
P2
P3
Intercalacin.
procesos, sino tambin superponerlos. A primera vista, podra parecer que la intercalacin y la superposicin representan formas de ejecucin muy diferentes y que introducen problemas distintos. De hecho, ambas tcnicas pueden contemplarse como ejemplos de proceso concurrente y ambas plantean los mismos problemas. En el caso de un sistema monoprocesador, los problemas creados por la multiprogramacin parten del hecho de que la velocidad relativa de ejecucin de los procesos no puede predecirse
P1 P2
P3
Intercalacin y Superposicin.
operativo trata las interrupciones y de las polticas de planificacin. As surgen las siguientes dificultades:
o La comparticin de recursos globales est llena de riesgos. o Para el sistema operativo resulta difcil asignar los recursos de forma optima. o Resulta difcil localizar un error de programacin porque los resultados no
multiprocesador, ya que tambin en ellos es impredecible la velocidad relativa de ejecucin de los procesos. Un sistema multiprocesador debe solucionar, adems, los problemas originados por el hecho de que varios procesos puedan estar ejecutando a la vez.
que ejecuten en mquinas monoprocesador o multiprocesador con una memoria principal compartida. Normalmente, estas soluciones suponen que existe una exclusin mutua elemental en el acceso a memoria.
Es decir, los accesos simultneos (lecturas y/o escrituras) a la misma posicin de memoria se hacen en serie, por medio de algn tipo de rbitro de memoria, aunque el orden en el que se conceden los accesos no se conoce por adelantado. Aparte de esto, no se requiere ningn soporte del hardware, del sistema operativo o del lenguaje de programacin.
Algoritmo de Dekker .
Dijkstra present un algoritmo de exclusin mutua para dos procesos que dise el matemtico holands Dekker. Segn Dijkstra, la solucin se desarrolla por etapas. Este mtodo tiene la ventaja de ilustrar la mayora de los errores habituales que se producen en la construccin de programas concurrentes. A medida que se construya el algoritmo, se emplearn algunas ilustraciones pintorescas tomadas de Ben-Ari para escenificar la accin
o Primer intento.
Como se mencion anteriormente, cualquier intento de exclusin mutua debe depender de algunos mecanismos bsicos de exclusin en el hardware. El ms habitual es la restriccin de que solo se puede realizar un acceso a una posicin memoria en cada instante. Como metfora de este arbitrio de la memoria, se muestra el protocolo del igl. Tanto la entrada como el mismo igl son tan pequeos que solo puede entrar una persona a la vez en el igl. Dentro, hay una pizarra en la que se puede escribir un nico valor.
El protocolo es el siguiente. Un proceso (P0 P1) que desee ejecutar su seccin crtica entra primero en el igl y examina la pizarra. Si su nmero est escrito en ella, el proceso puede abandonar el igl y continuar con su seccin critica. En otro caso, abandona el igl y se ye obligado a esperar. De vez en cuando, el proceso vuelve a entrar en el igl para mirar la pizarra.
Esta operacin la repite hasta que se le permite entrar en su seccin crtica. Este procedimiento se denomina espera activa porque un proceso frustrado no puede hacer nada productivo hasta que obtiene permiso para entrar en su seccin crtica. En su lugar, debe persistir y comprobar peridicamente el igl; as pues, consume tiempo del procesador (est activo) mientras espera su oportunidad.
Despus de que un proceso haya obtenido acceso a su seccin crtica y una vez que termine con ella, debe volver al igl y escribir el nmero del otro proceso en la pizarra.
Esta solucin garantiza el cumplimiento de la exclusin mutua. Hay dos inconvenientes en esta solucin. Primero, los procesos deben alternarse de forma estricta en el uso de sus secciones crticas; as pues, el ritmo de ejecucin viene dictado por el ms lento. Si P0 usa su seccin crtica solo una vez por hora, pero P1 quiere usarla con una tasa de 1000 veces por hora, P1 est obligado a adoptar el ritmo de P0. Un problema mucho ms seno es que si un proceso falla (por ejemplo, se lo come un oso polar en su camino hacia el igl), el otro proceso se bloquea permanentemente. Esto es cierto tanto si un proceso falla en su seccin critica como fuera de ella.
La estructura anterior es la de una corrutina. Las corrutinas se disearon para poder pasar el control de la ejecucin de un proceso a otro. Aunque es una tcnica de estructuracin til para un solo proceso, no resulta apropiada para dar soporte al proceso concurrente.
o Segundo intento.
El problema de la primera tentativa es que se almacenaba el nombre del proceso que poda entrar en su seccin crtica cuando, de hecho, lo que hace falta es tener informacin del estado de ambos procesos. En realidad, cada proceso debera tener su propia llave de la seccin crtica para que, si un oso polar elimina a uno de ellos, el otro pueda seguir accediendo a su seccin crtica.
Esta filosofa queda ilustrada en la siguiente figura. Cada proceso tiene ahora su propio igl y puede mirar ha pizarra del otro, pero no modificarla. Cuando un proceso desea entrar en su seccin critica, comprueba peridicamente la pizarra del otro hasta que encuentra escrito en ella falso, lo que indica que el otro proceso no est en su seccin crtica. Entonces, se dirige rpidamente hacia su propio igl, entra y escribe cierto en la pizarra. El proceso puede ahora continuar con su seccin crtica. Cuando deja su seccin crtica, cambia su pizarra para que ponga falso.
Ahora, si uno de los procesos falla fuera de la seccin crtica, incluyendo el cdigo para dar valor a las seales, el otro proceso no se queda bloqueado. De hecho, el otro proceso puede entrar en su seccin crtica tantas veces como quiera, porque la seal del otro proceso est siempre puesta a falso. Sin embargo, si un proceso falla en su seccin crtica, el otro proceso est bloqueado permanentemente.
En realidad, esta solucin es, si acaso, peor que el primer intento, pues no siempre se garantiza la exclusin mutua. Considrese la siguiente secuencia: P0 ejecuta la sentencia while y encuentra seal [1] a falso. P1 ejecuta la sentencia while y encuentra seal [0] a falso.
o Tercer intento.
El segundo intento falla porque un proceso puede cambiar su estado despus de que el otro proceso lo ha comprobado pero antes de que pueda entrar en su seccin crtica. Quiz se pueda arreglar este problema con un simple intercambio de dos lneas:
Como antes, si un proceso falla dentro de la seccin crtica, incluyendo el cdigo para dar valor a las seales que controlan el acceso a la seccin crtica, el otro proceso se bloquea y si un proceso falla fuera de su seccin critica, el otro proceso no se bloquea. Esta solucin garantiza la exclusin mutua, pero origina un problema ms. Si ambos procesos ponen sus seales a cierto antes de que ambos hayan ejecutado la sentencia while, cada uno pensar que el otro ha entrado en su seccin critica. El resultado es un interbloqueo.
o Cuarto intento.
En el tercer intento, un proceso fijaba su estado sin conocer el estado del otro. El interbloqueo se produce porque cada proceso puede insistir en su derecho para entrar en la seccin crtica; no hay opcin para volver atrs desde esta situacin. Se puede intentar arreglar esto haciendo que los procesos sean ms educados: Deben activar su seal para indicar que desean entrar en la seccin crtica, pero deben estar listos para desactivar la seal y ceder la preferencia al otro proceso:
Esta solucin se aproxima a la correcta pero todava es defectuosa. La exclusin mutua an est garantizada con un razonamiento similar al seguido en el estudio del tercer intento.
Hay que poder observar el estado de ambos procesos, que viene dado por la variable seal. Pero, como demuestra el cuarto intento, esto no es suficiente. De algn modo, se hace necesario imponer algn orden en la actividad de los dos procesos para evitar el problema de cortesa mutua que se acaba de observar. La variable turno del primer intento puede usarse en esta labor; en este caso, la variable indica qu proceso tiene prioridad para exigir la entrada a la seccin critica.
Es posible describir esta solucin en trminos de igles fijndose en la siguiente figura. Ahora hay un igl rbitro con una pizarra llamada turno. Cuando P0 quiere entrar en su seccin critica, pone su seal a cierto. A continuacin, va y mira la seal de P1. Si sta est puesta a falso, P0 puede entrar inmediatamente en su seccin crtica. En otro caso, P0 va a consultar al rbitro. Si encuentra el turno = 0, sabe que es momento de insistir y comprueba peridicamente el igl de P1. Este otro se percatar en algn momento de que es momento de ceder y escribir falso en su pizarra, permitiendo continuar a P0. Despus de que P0 haya ejecutado su seccin crtica, pone su seal a falso para liberar la seccin crtica y pone turno a 1 para traspasar el derecho de insistir a P1
Algoritmo de Peterson.
El algoritmo de Dekker resuelve el problema de la exclusin mutua pero con un programa complejo, difcil de seguir y cuya correccin es difcil de demostrar. Peterson desarrollado una solucin simple y elegante. Como antes, la variable global seal indica La posicin de cada proceso con respecto a la exclusin mutua y la variable global turno resuelve los conflictos de simultaneidad.
en nmero reducido, por lo que permiten cualquier acceso a la variable compartida. En caso de conflicto, mantienen la integridad del sistema descartando las actualizaciones.
Pesimistas. o Bloquean todo aquello que pueda interferir. o Actualizan la variable. o Desbloquean lo bloqueado al principio.
Inhabilitacin de interrupciones.
puede superponerse.
o Un proceso continuar ejecutndose hasta que solicite un servicio el sistema
sea interrumpido.
Semforos. o El principio fundamental es que los procesos pueden cooperar por medio de
simples seales, de manera que se pueda obligar a un proceso a detener en una posicin determinada hasta que reciba una seal especfica.
o Para la sealizacin se usan variables especiales llamadas semforos "S"
Monitores.
una funcionalidad equivalente a las de los semforos pero son ms fciles de controlar.
o La estructura de monitor se ha implementado en varios lenguajes de
Semforos.
procesos, de modo que su ejecucin se realice de forma ordenada y sin conflictos entre ellos.
Son una solucin, del tipo soporte al sistema operativo para garantizar la
exclusin mutua.
Un semforo nos sirve para poder permitir o restringir a los procesos o hilos el
Operaciones bsicas.
reservarlo y la otra para liberarlo, wait(espera) y signal(seal) respectivamente, equivalente down y up.
o Decremento en una unidad el semforo. o Bloquea hilo/proceso si el semforo es menor que cero, sino entonces
Signal, Up o Seal.
o Incrementa semforo en uno y si hay algn proceso esperando lo despierta. o Existe un valor mximo para incrementar el semforo, este no se va a infinito. o Llamada S(semforo) o up(semforo).
Inicializador. o Los semforos pueden ser de 2 tipos: Binarios o Generales(Contadores). o La operacin de inicializador definir si el semforo ser binario o no, es
decir, si se inicializa con 1, el semforo ser binario ya que solo podr manejar un recurso compartido, en caso de tener N recursos compartidos se inicializara con N.
o Si tenemos N procesos inicializamos un semforo para que solo N
Semforos con manejo de cola. o Existen semforos que tienen la operacin de manejar una cola del tipo FIFO
(PEPS)para llevar el control de los procesos que estn solicitando los recursos, as cuando se liberen los recursos estos puedan asignarle dicho recurso al primer proceso que lo solicito,
o Desventajas No se puede imponer el uso correcto de los Down y Up. No existe una asociacin entre el semforo y el recurso.
el recurso.
Monitores.
Los semforos son una herramienta bsica, pero potente y flexible, para hacer
cumplir la exclusin mutua y coordinar procesos. Sin embargo, puede resultar difcil construir un programa correcto por medio de semforos. La dificultad est en que las operaciones wait y signal deben distribuirse por todo el programa y no es fcil advertir el efecto global de estas operaciones sobre los semforos a los que afectan.
una funcionalidad equivalente a La de los semforos y que son ms fciles de controlar. El concepto fue definido formalmente por primera vez en [HOAR74]. La estructura de monitor se ha implementado en varios lenguajes de programacin, incluido Pascal Concurrente, Pascal-plus, Modula-2 y Modula-3. Ms recientemente, se han implementado como una biblioteca de programas. Esto permite poner cierres de monitor a objetos cualesquiera. En particular, para algo parecido a una lista enlazada, se puede querer bloquear todas las listas enlazadas con un solo cierre o bien tener un cierre para cada elemento de cada lista.
Monitores con seales. o Un monitor es un modulo de software que consta de uno o ms procedimientos, una
secuencia de inicializacin y unos datos locales. Las caractersticas bsicas de un monitor son las siguientes:
Las variables de datos locales estn solo accesibles para los procedimientos del
que haya invocado al monitor quedara suspendido mientras espera a que el monitor est disponible.
o Las dos primeras caractersticas recuerdan a las de los objetos del software
servicio de exclusin mutua, de tal forma que una estructura de datos compartida puede protegerse situndola dentro de un monitor.
o Para que resulten tiles en el proceso concurrente, los monitores deben incluir
herramientas de sincronizacin. Por ejemplo, supngase que un proceso llama a un monitor y, mientas est en el monitor, debe suspenderse hasta que se cumpla alguna condicin. Hace falta un servicio para que el proceso no solo este suspendido, sino que libere el monitor y otro proceso pueda entrar.
Ms tarde, cuando se cumpla la condicin y el monitor est de nuevo disponible, el proceso pueda reanudarse y tiene que permitirle volver a entrar en el monitor en el punto de la suspensin.
Paso de mensajes.
Paso de mensajes. o Un monitor proporciona sincronizacin por medio de las variables de
condicin que se incluyen dentro del monitor y son accesibles slo desde dentro. Hay dos funciones para operar las variables de condicin:
Wait(c): Suspende la ejecucin del proceso llamado bajo la condicin c. El
monitor esta ahora disponible para ser usado por otro proceso.
Signal(c): Reanuda la ejecucin de algn proceso suspendido despus de
un wait bajo la misma condicin. Si hay varios procesos, elige uno de ellos; si no hay ninguno, no hace nada.
semforos. Si un proceso de un monitor ejecuta un signal y no hay tareas esperando en la variable de condicin, el signal se pierde.
monitores. Por ejemplo, si se omite cualquiera de las funciones csignal en el monitor buffer_acotado, los procesos que entran en la cola de la condicin correspondiente permanecern colgados permanentemente. La ventaja que tienen los monitores sobre los semforos es que todas las funciones de sincronizacin estn confinadas dentro del monitor. De este modo, es sencillo verificar que la sincronizacin se ha realizado correctamente y detectar los fallos. Es ms, una vez que un monitor est correctamente programado, el acceso al recurso protegido es correcto para todos los procesos. Con los semforos, en cambio, el acceso al recurso es correcto slo si todos los procesos que acceden al recurso estn correctamente programados.
Monitores con notificacin y difusin. o La definicin que hace Hoare de los monitores [HOAR74] exige que, si hay al
menos un proceso en una cola de condicin, un proceso de dicha cola deber ejecutar en cuanto otro proceso ejecute un csignal para la condicin. As pues, el proceso que ejecuta el csignal debe salir inmediatamente del monitor o suspenderse en el monitor.
dos cambios de contexto adicionales: uno para suspender el proceso y otro para reanudarlo cuando el monitor quede disponible.
2. La planificacin de procesos asociada con las seales debe ser muy
fiable. Cuando se ejecuta un csignal, debe activarse inmediatamente un proceso de la cola de la condicin correspondiente y el planifcador debe asegurarse de que ningn otro proceso entra al monitor antes de la activacin. Si no es as, la condicin bajo la que se ha activado el proceso podra cambiar. Por ejemplo, en la figura 4.24, cuando se ejecuta un csignal(no_ vaco), un proceso de la cola no _ vaci debe activarse antes de que un nuevo consumidor entre al monitor. Otro ejemplo es que un proceso productor puede aadir un carcter a un buffer vaco y despus fallar antes de dar la seal; cualquier proceso de la cola no_vaco permanecer colgado
lenguaje Mesa [LAMP80]. Su mtodo supera los problemas comentados y ofrece algunas ampliaciones de utilidad. La estructura de monitores de Mesa se usa tambin en el lenguaje Modula-3 de programacin de sistemas [CARD89, HARB90, NELS91]. En Mesa, la primitiva csignal se reemplaza por cnotify, con la siguiente interpretacin:
o Cuando un proceso que est en un monitor ejecuta cnotify(x), origina una
notificacin hacia la cola de la condicin x, pero el proceso que da la seal puede continuar ejecutando. El resultado de la notificacin es que el proceso de la cabeza de la cola de condicin ser reanudado en el futuro cercano, cuando el monitor est disponible. Sin embargo, puesto que esto no garantiza que ningn otro proceso entre al monitor antes que el proceso que espera, el proceso que espera debe volver a comprobar la condicin. Por ejemplo, los procedimientos en el monitor buffer _ acotado tendran ahora el siguiente cdigo :
Una ventaja de los monitores de Lampson/Redell sobre los de Hoare es que el mtodo de Lampson/Redell es menos propenso a errores. En el enfoque de Lampson/Redell, debido a que cada procedimiento comprueba la variable del monitor despus de ser despertado, por medio de la instruccin while, un proceso puede realizar una seal o una difusin incorrectamente sin provocar un error en el programa que la recibe. El programa que recibe la seal comprobar la variable pertinente y, si no se cumple la condicin deseada, continuar esperando.
mtodo ms modular de construccin de programas. Por ejemplo, considrese la implementacin de una asignacin de buffers. Hay dos niveles de condicin que deben satisfacerse para los procesos secunciales cooperantes:
Nivel 1. Estructuras de datos consistentes. Esto significa que el monitor hace
cumplir la exclusin mutua y concluye la operacin de entrada o salida antes de permitir cualquier otra operacin sobre el buffer.
Nivel 2. La misma condicin del nivel 1 y, adems, disponer de suficiente
Paso de mensajes.
Cuando los procesos interactan unos con otros, se deben satisfacer dos
requisitos bsicos:
o Sincronizacin.
Primitivas del paso de mensajes. o La funcionalidad real del paso de mensajes se ofrece por medio de dos
primitivas:
send (destino, mensaje). receive (origen, mensaje).
Primitiva send. o Cuando se ejecuta una primitiva send en un proceso, las posibilidades son:
mensaje.
Primitiva receive. o Cuando un proceso ejecuta una primitiva receive, hay dos posibilidades: Si previamente se ha enviado algn mensaje es recibido y contina la
ejecucin.
Si no hay ningn mensaje esperando
Combinaciones de primitivas.
pero el receptor se bloquea hasta que llega el mensaje solicitado. Permite que un proceso enve uno o ms mensajes a varios destinos tan rpido como sea posible. Un proceso que debe recibir un mensaje antes de poder hacer alguna funcin til tiene que bloquearse hasta que llegue el mensaje (ejemplo: proceso servidor que ofrece un servicio o un recurso a otros procesos).
Envo no bloqueante, recepcin no bloqueante: Nadie debe esperar.
(cualquier sistema concreto implementa slo una o dos combinaciones)
programacin concurrente.
Por ejemplo:
Si se usa para solicitar una operacin de salida (como una impresin) permite al proceso solicitante realizar la solicitud en forma de mensaje y
continuar.
Errores pueden llevar a que el proceso genere mensajes repetidamente. Como no hay bloqueo para hacer entrar en disciplina al proceso, esos
mensajes pueden consumir recursos del sistema en detrimento de otros procesos y del sistema operativo.
Tiempo del procesador, espacio en buffer, etc.
mensaje se ha recibido.
Los procesos deben emplear mensajes de respuesta para acusar la
recepcin de un mensaje.
indefinidamente.
o Esto puede resolverse por medio del receive no bloqueante.
o El riesgo del receive no bloqueante es si un mensaje se enva despus de que un proceso haya ejecutado el
Direccionamiento. o Para especificar en la primitiva send qu proceso va a recibir el mensaje. o Para especificar en la primitiva receive el origen del mensaje que se va a
recibir.
o Los distintos esquemas para hacer referencia a los procesos en primitivas
Direccionamiento directo.
destino.
o La primitiva receive se puede gestionar de dos formas:
El proceso designa explcitamente un proceso emisor. el proceso debe conocer de antemano de qu proceso espera un
mensaje.
suele ser eficaz para procesos concurrentes y cooperantes.
o Usar direccionamiento implcito. En este caso, el parmetro origen de la primitiva receive tendr un valor de
Direccionamiento indirecto. o Los mensajes no se envan directamente del emisor al receptor, sino a
una estructura de datos compartida, formada por colas, que guarda los mensajes temporalmente (buzones/mailboxes).
o Para que dos procesos se comuniquen, uno enva mensajes al buzn
o La relacin entre emisores y receptores puede ser uno a uno, Permite que se establezca un enlace privado de comunicaciones entre dos
procesos
muchos a uno, Puede resultar til para interacciones cliente/servidor, un proceso ofrece un
propsito.
o Propiedad de un buzn Un puerto pertenece y es creado por el proceso receptor. Cuando se destruye el proceso se destruir el puerto. El sistema operativo puede ofrecer un servicio de creacin de buzones de manera que los procesos pueden ser considerados como propiedad
Formato de mensajes.
o Depende de
los objetivos del servicio de mensajera. si el servicio ejecuta en un ordenador independiente o en un sistema
distribuido.
o Cuerpo
Diciplina de cola
oLa ms simple es primero en llegar/primero en salir (FIFO)
Exclusin mutua.
o El paso de mensajes puede usarse para cumplir la exclusin mutua por ejemplo
send
no
se bloquea.
Una
vez que un proceso ha conseguido el mensaje, ejecuta su seccin crtica y despus devuelve el mensaje al buzn.
procesos se bloquean.
Cuando haya un mensaje
serie de procesos. El rea de datos puede ser un archivo, un bloque de memoria principal o incluso un banco de registros del procesador. Hay algunos procesos que slo leen los datos (lectores) y otros que slo escriben datos (escritores).
registro dentro de un archivo, etc., que va a ser utilizado y compartido por una serie de procesos concurrentes. Algunos de estos procesos slo van a acceder al objeto sin modificarlo, mientras que otros van a acceder al objeto para modificar su contenido. Esta actualizacin implica leerlo, modificar su contenido y escribirlo. A los primeros procesos se les denomina lectores y a los segundos se les denomina escritores.
seguirse:
o Slo se permite que un escritor tenga acceso al objeto al mismo tiempo.
Mientras el escritor est accediendo al objeto, ningn otro proceso lector ni escritor podr acceder a l.
o Se permite, sin embargo, que mltiples lectores tengan acceso al objeto, ya
que ellos nunca van a modificar el contenido del mismo. En este tipo de problemas es necesario disponer de servicios desincronizacin que permitan a los procesos lectores y escritores sincronizarse adecuadamente en el acceso al objeto.
que permitan a los procesos lectores y escritores sincronizarse adecuadamente en el acceso al objeto.