Resumen Tema 10 Programación Concurrente PDF
Document Details

Uploaded by PreferableGingko
Universidad Europea de Madrid
Tags
Summary
Este documento resume el tema 10 sobre programación concurrente, centrándose en los semáforos. Explica qué son los semáforos, sus tipos (binarios y generales), las operaciones sobre ellos (wait y signal), y su uso en la exclusión mutua. También aborda conceptos como la inversión de prioridad y el problema del productor-consumidor. Un documento útil para estudiantes de programación.
Full Transcript
TEMA 10 **¿QUÉ ES UN SEMAFORO EN EL CONTEXTO DE LA PROGRAMACION CONCURRENTE?** Son componentes pasivos de bajo nivel de abstracción que sirven para arbitrar el acceso a un recurso compartido. Un semáforo es una variable integer que solo puede tomar valores no negativos. Una señal se transmite me...
TEMA 10 **¿QUÉ ES UN SEMAFORO EN EL CONTEXTO DE LA PROGRAMACION CONCURRENTE?** Son componentes pasivos de bajo nivel de abstracción que sirven para arbitrar el acceso a un recurso compartido. Un semáforo es una variable integer que solo puede tomar valores no negativos. Una señal se transmite mediante una operación atómica SIGNAL Una señal se recibe mediante una operación atómica WAIT. El wait y el signal son indivisibles y no se pueden interrumpir, es decir, no se pueden ejecutar ambas a la vez. Un proceso en espera de recibir una señal(wait) es suspendido hasta que tenga lugar la transmisión de la señal (signal). **TIPOS DE SEMÁFOROS** En función del rango de valores que puede tomar, los semáforos se clasifican es: - *Semáforos binarios*: Pueden tomar solo los valores 0 y 1. Es posible la implementación utilizando una variable booleana. Se pueden utilizar para resolver el problema de la sección crítica y se pueden utilizar como mutex en sistemas que proporcionan un mecanismo mutex independiente. - *Semáforos generales*: Pueden tomar cualquier valor natural (entero no negativo) Un semáforo general es un objeto que consta de una variable count y dos operaciones down y up,si un proceso llama a down entonces count decrementa, si un proceso llama a up entonces count se incrementa. Un semáforo general a veces también se denomina semáforo de conteo. El valor de un semáforo es el valor de su variable count. El contador se inicializa con la cantidad de dichos recursos disponibles en el sistema y siempre que el semáforo sea myor que cero un proceso puede ingresar a una sección crítica y usar uno de los recursos. Cuando el contador llega a cero, el proceso se bloquea hasta que otro proceso libera un recurso e incrementa el semáforo con una llamada de señal. Un semáforo que ha tomado el valor 0 representa un SEMAFORO CERRADO Un semáforo que toma un valor no nulo representa un SEMAFORO ABIERTO. **OPERACIONES SOBRE SEMÁFOROS** \- *WAIT:* Comprueba el valor del semáforo, si es mayor que 0, decrementa el número, si es igual a 0, se bloquea el proceso que llamó a wait. \- *SIGNAL:* Si no hay procesos bloqueados en la cola del semáforo, se incrementa el valor del semáforo en uno, desbloqueando a un proceso en espera si lo hubiera. **EXCLUSION MUTUA PARA DOS PROCESOS:** Para resolver el problema de exclusión mutua mediante semáforos es fundamental que se cumplan ciertas invariantes. La primera es que el semáforo siempre debe ser mayor o igual que 0. La segunda die que el semáforo es igual a su valor inicial más las signals menos los waits, manteniendo la consistencia en el valor del semáforo.. **VENTAJAS E INCONVENIENTES DE LOS SEMAFOROS** Ventajas de los semáforos: Resuelven todos los problemas que presenta la concurrencia. Estructuras pasivas muy simples. Fáciles de comprender. Implementación eficiente. Inconvenientes de los semáforos: Son de muy bajo nivel y un simple olvido o cambio de orden conducen a bloqueos. Requieren que la gestión de un semáforo se distribuya por todo el código. La depuración de los errores es difícil. **IMPLEMENTACION DE LOS SEMAFOROS** El gran problema con los semáforos es el bucle ocupado en la llamada de espera, que consume ciclos de CPU sin realizar ningún trabajo útil. Este tipo de bloqueo se conoce como spinlock, porque el bloqueo simplemente se queda ahí y gira mientras espera. - Un enfoque alternativo es bloquear un proceso cuando se le obliga a esperar un semáforo disponible y sacarlo fuera de la CPU. **PUERTOS MUERTOS E INANICION EN EL SEMAFORO** Los puntos muertos pueden ocurrir cuando varios procesos están bloqueados, cada uno esperando un recurso que solo puede ser liberado por uno de los otros procesos(bloqueados). La inanición, se produce en el que uno o más procesos se bloquean para siempre y nunca tienen la oportunidad de tomar su turno en la sección crítica. **INVERSION DE PRIORIDAD** Una solución es implementar un protocolo de herencia de prioridad, en el que un proceso de baja prioridad que retiene un recurso que está esperando un proceso de alta prioridad heredará temporalmente la prioridad alta del proceso que está esperando. Esto evita que los procesos de prioridad media reemplacen al proceso de baja prioridad hasta que libere el recurso, lo que bloquea el problema de inversión de prioridad. **DEFINICIONES ALTERNATIVAS DE SEMÁFOROS** - SEMAFORO CON CONJUNTO BLOQUEADO: en este semáforo los procesos bloqueados se gestionan como un conjunto y no existen procesos prioritarios ni ningún tipo de organización interna. Un signal despierta uno de los bloqueados - SEMÁFORO CON COLA BLOQUEADO: los procesos que resulten bloqueados en una operación wait son insertados en una cola. Los bloqueados se guardan en una FIFO. - SEMÁFORO CON ESPERA OCUPADO: En este semáforo se cambia ligeramente la definición de las funciones. **PROBLEMA PRODUCTOR-CONSUMIDOR** El problema del productor-consumidor es un problema clásico en programación concurrente y distribuida que involucra dos tipos de procesos: el que produce y el que consume. El objetivo de estos procesos es coordinarse para que el consumidor pueda obtener datos que el productor genera sin interferir el uno con el otro. Si el productor y el consumidor se llaman directamente uno al otro en una secuencia (una vez el productor produce algo, llama al consumidor para consumirlo), se encuentran \"acoplados\". Esto significa que el consumidor depende de que el productor termine de producir para poder consumir, y viceversa. Se usan buffers intermedios (zonas de almacenamiento) para evitar este acoplamiento. Estos permiten que el productor almacene datos temporalmente en el buffer sin esperar a que el consumidor esté listo y, de la misma manera, que el consumidor tome datos del buffer sin esperar a que el productor esté listo para producir más. Buffer infinito: Es un buffer teóricamente sin límite, donde el productor puede seguir agregando datos sin preocuparse de que el buffer se llene. Esto simplifica la sincronización, ya que el productor nunca se ve bloqueado. Buffer finito: En la práctica, los buffers tienen capacidad limitada. Un buffer finito tiene un tamaño máximo y, cuando se llena, el productor debe esperar hasta que el consumidor libere espacio. Para coordinar la producción y el consumo de manera segura, se usan semáforos: Uno para controlar la cantidad de elementos (indica cuántos elementos hay en el buffer). Otro para los espacios disponibles (indica cuántos espacios vacíos quedan en el buffer) Reglas clave: - Nunca se debe insertar un elemento si el buffer está lleno. - Nunca se debe eliminar un elemento si el buffer está vacío. - No hay interbloqueos ni inanición (ningún proceso queda esperando indefinidamente). Estas reglas garantizan que tanto el productor como el consumidor puedan funcionar de manera eficiente sin interferir el uno con el otro, utilizando la sincronización de semáforos para evitar conflictos y asegurar que ambos trabajen sin interrupciones o esperas innecesarias