El documento presenta soluciones para el problema de las secciones críticas en sistemas concurrentes, incluyendo semáforos, la solución de Peterson y hardware de sincronización. Discute requisitos como exclusión mutua, progreso y tiempo de espera limitado. También cubre conceptos como kernel apropiativo vs no apropiativo, bloqueos mutuos e inanición.
SO Sincronización Procesos Secciones Críticas Semáforos
1. SISTEMAS INFORMATICOS Y COMPUTACION SISTEMAS OPERATIVOS SINCRONIZACION DE PROCESOS Integrantes: Andrea Mendoza Anita Salinas
2. Objetivos * Presentar el problema de las secciones criticas, cuyas soluciones pueden utilizarse para asegurar la coherencia de los datos compartidos * Presentar soluciones tanto software como hardware para el problema de las secciones criticas. * Presentar el concepto de transacción atónica y describir los mecanismos para garantizar la atomicidad
3. Sincronización de Procesos Un proceso cooperativo es aquel que puede afectar o verse afectado por otros procesos que estén ejecutándose en el sistema. Estos pueden compartir directamente un espacio de direcciones lógico (código o datos) o compartir los datos solo a través de archivos o mensajes.
4. Fundamentos Supongamos que deseamos modificar el algoritmo para remediar una deficiencia. Nuestra solución permite que haya como máximo BUFFER_SIZE -1 elementos al buffer al mismo tiempo. La posibilidad es añadir una variable entera counterinicializada con el valor de cero. Código para el proceso productor: While (true){ /* Produce un elemento en nextProduced */ while (counter == BUFFER_SIZE); /*No hace nada*/ buffer [in] = nextProduced; in= (in +1) % BUFFER_SIZE; counter ++; }
5. Código para el proceso consumidor: While (true){ while (counter == 0); /*No hace nada*/ nextConsumed= buffer [out]; out= (out +1) % BUFFER_SIZE; counter --; } La ejecución concurrente de “counter++ y “counter--” es equivalente a una ejecucion secuencial donde las instrucciones de menor nivel se intercalan en un cierto orden arbitrario (pero el orden dentro de cada nivel se conserva)
9. ¿Por qué es preferible un kernel apropiativo a uno no apropiativo? Un kernel apropiativo es mas adecuado para la programación en tiempo real ya que permite a un proceso en tiempo real desalojar a un proceso que este ejecutando actualmente en el kernel
10. Solución de Peterson Proporciona una buena descripción algorítmica de la resolución del problema de la sección critica e ilustra algunas de las complejidades asociadas al diseño del software que satisfaga los requisitos de exclusión mutua progreso y tiempo de espera limitado. La solución de Peterson restringe a dos procesos que van alternando la ejecución de sus secciones criticas y de sus secciones restantes.
14. Ejemplo: En un entorno de un solo procesador pudiésemos impedir interrupciones, modificando una variable compartida asegurando así la secuencia actual de instrucciones por orden y sin desalojo, este es el método que emplean los Kernels no apropiados. A diferencia de un entorno multiprocesador, si desactivamos las interrupciones consumimos mucho tiempo debido al paso de mensajes a todos los procesadores, retardando la entrada a la sección crítica y la eficiencia del sistema.
15. Por lo que los sistemas modernos proporcionan instrucciones especiales que permiten consultar y modificar el contenido de dos palabras atómicamente, como unidad de trabajo interrumpible. Tal es el caso de Exclusión Mutua con Test-and-Set Datos compartidos: booleanlock = false; do{ while(TestAndSetLock (&lock)) ; /*No hace nada*/ //sección critica lock= False; //sección restante }while (TRUE);
16. Hardware de Sincronización Atómicamente intercambia (swap) dos variables. void Swap(boolean &a, boolean &b) { booleantemp = a; a = b; b = temp; }
17. Exclusión Mutua con Intercambio (Swap) Datos compartidos (inicializados a false): booleanlock; booleanwaiting[n]; Proceso Pi do { key = true; while (key == true) Swap(lock,key); //seccion critica lock = false; //sección restante }
18. Semáforos Herramienta de sincronización que no requiere de espera Semáforo S – variable entera Puede solo se puede acceder mediante dos operaciones indivisibles(atómicas) operaciones: wait (S): // P: proberen = probar whileS<= 0; //no-op S--; signal (S): // V:verhogen = incrementar S++;
19. Utilización Existen diferencias entre los semáforos contadores y los semáforos binarios que trabajan con (0,1) también conocidos como cerrojos mutexya que proporcionan exclusión mutua Datos compartidos: semaphoremutex; //inicialmente mutex = 1 Proceso Pi: do { waiting(mutex); //seccion critica signal(mutex); //sección restante } while (TRUE);
20. Implementación Es necesario dedinir un semáforo como un registro typedefstruct { intvalue; structprocess *list; } semaphore; Suponiendo que hayan dos operaciones simples: block: suspende el proceso que lo invoco. wakeup(P) : reanuda la ejecución de un proceso P bloqueado
21. Bloqueos Mutuos e Inanición Bloqueo mutuo (Deadlock) – dos ó más procesos están esperando indefinidamente por un evento que puede ser causado sólo por uno de los procesos que están en espera. Supongamos que: S y Q son dos semáforos inicializados a 1 P0 P1 wait(S); wait(Q); wait(Q); wait(S); . . signal(S); signal(Q); signal(Q); signal(S); Inanición – bloqueo indefinido. Un proceso puede jamás ser removido de la cola de semáforos en la cual se encuentra suspendido.