SINCRONIZACIÓN DE PROCESOS

Documentos relacionados
Concurrencia. Primitivas IPC con bloqueo

Implementación de monitores POSIX

PROGRAMACION CONCURRENTE

Tema 3: Concurrencia de procesos

Concurrencia: Exclusión mutua y Sincronización

Concurrencia: deberes. Concurrencia: Exclusión Mutua y Sincronización. Concurrencia. Dificultades con la Concurrencia

Concurrencia entre Procesos.

Monitores. Implementación de un Buffer con monitores

CDI Exclusión mutua a nivel alto. conceptos

Programación Concurrente y Paralela. P(S) ; sección crítica P(S);

El problema de los Filósofos

Tema 3. Monitores Programación Concurrente

SEC. 2.2 COMUNICACIÓN ENTRE PROCESOS 63

Sistemas Operativos [Procesos]

PROGRAMACION CONCURRENTE Y DISTRIBUIDA

Estructuras de control

Programación Concurrente Recopilación de teoría referente a la materia

SOLUCIONES A ALGUNOS DE LOS EJERCICIOS DE SINCRONIZACION Y COMUNICACION ENTRE PROCESOS

Elementos de un programa en C

2.2 Nombres, Ligado y Ámbito

Desde los programas más simples escritos en un lenguaje de programación suelen realizar tres tareas en forma secuencial.

Sistemas Operativos. Características de la Multiprogramación. Interacción entre Procesos. Características de la Multiprogramación

Mensajes. Interbloqueo

Monitores Ing. Iván Medrano Valencia

Métodos para escribir algoritmos: Diagramas de Flujo y pseudocódigo

Estructuras en LabVIEW.

PROGRAMACIÓN CONCURRENTE. Tema 5 Monitores

Introducción a las sentencias de control

Ciclos. Recordando Estructuras de Control Básicas: SELECCIÓN (condición) SECUENCIAL

Programación de Computadores 4 Iteraciones y Decisiones. Prof. Javier Cañas. Universidad Técnica Federico Santa María Departamento de Informática

Expresiones y sentencias

Sistemas Operativos. Dr. Luis Gerardo de la Fraga. Departamento de Computación Cinvestav

Definición de Memoria

Estructuras de Control

Otras formas de Sincronización en Java

Receta general para resolver problemas de sincronización con semáforos

Solución Examen Febrero 2006

Comunicación y Sincronización con Monitores Resumen del Tema

Sistemas Operativos II TEMA 1. Contenido

MONITORES EN JAVA. Antonio Tomeu Control de la Concurrencia en Java: API Estándar

Fundamentos de programación

Todo programa en 'C' consta de una o más funciones, una de las cuales se llama main.

Sistemas Operativos Práctica 4

Estatutos de Control C# Estatutos de Decisión (Selección)

ESCUELA SUPERIOR DE INFORMATICA SISTEMAS OPERATIVOS PROBLEMAS DE SINCRONIZACION Y COMUNICACION ENTRE PROCESOS

SISTEMAS OPERATIVOS PROCESOS CONCURRENTES UNIDAD III

Algoritmos y programas. Algoritmos y Estructuras de Datos I

Sistemas Operativos Practica 1: procesos y concurrencia.

PROGRAMACION CONCURRENTE Y DISTRIBUIDA. II.5 Sincronización basada en memoria compartida: Monitores

Sincronización. Arquitectura de Computadores

Java: Programación Multithread

Mercedes Granda Departamento de Electrónica y Computadores. Las propiedades de las redes de Petri nos permiten

Exclusión mutua. Gustavo Romero. 14 de febrero de Arquitectura y Tecnología de Computadores

PROGRAMACIÓN. UNIDAD II. ALGORITMO PROFA : HAU MOY

TECNICO SUPERIOR EN INFORMÁTICA EMPRESARIAL MÓDULO INTRUCCIONAL

Concurrencia en.net David Jesús Horat Flotats

Notación Asintótica 2

SISTEMAS INFORMÁTICOS DE TIEMPO REAL

Redes (IS20) Ingeniería Técnica en Informática de Sistemas. CAPÍTULO 5: Subcapa de acceso al medio

Sistema electrónico digital (binario) que procesa datos siguiendo unas instrucciones almacenadas en su memoria

28/09/2012. Interfaz con Dispositivos de Salida. Interfaz con Dispositivos de Entrada. Port Mapped. Memory mapped. Interfaz con Dispositivos I/O

Fundamentos de Programación Visual Basic

Principios de Computadoras II

Herramientas computacionales para la matemática MATLAB: Estructuras de control

Instrucciones. No hable durante el experimento o usted será inmediatamente excluido del mismo! Buena suerte!

Algoritmos. Medios de expresión de un algoritmo. Diagrama de flujo

Guía rápida para gestionar el puerto paralelo del PC

Algoritmos y Programas

Práctica 3: Monitoreo y Depuración de Programas

Sistemas Operativos. Curso 2014 Estructura de los sistemas operativos

Mensajes. (versión preliminar)

Sistemas Operativos: Programación de Sistemas. Curso Oscar Déniz Suárez Alexis Quesada Arencibia Francisco J.

Procesadores de Lenguaje

Overview GeneXus - Demo: 2.Cómo obtener el ejecutable de la KB y declaración de algunas reglas del negocio.

LABORATORIO DE ARQUITECTURA DE COMPUTADORES. I. T. I. SISTEMAS / GESTIÓN GUÍA DEL ALUMNO

PROGRAMACIÓN CONCURRENTE

Guía práctica de estudio 05: Diagramas de flujo

Paso de mensajes. Lecturas: Burns & Wellings, Cap.??? Transparencias y apuntes de la asignatura. Filosofía cliente-servidor.

Sistemas operativos. Hasta ahora hemos visto. Relación programa-sistema operativo Gestión de memoria

Desarrollar un programa en SIMATIC S7 con codificación AWL que simule un sistema en el que una entrada digital active una salida digital.

CAPÍTULO 9. DIAGRAMAS DE

Fundamentos de Programación. Flujo de Control I: Estructuras selectivas

Test : Conteste exclusivamente en una HOJA DE LECTURA ÓPTICA, no olvidando marcar que su tipo de examen es A.

Sistemas Operativos Temas 4, 5 y 6. Jorge García Duque Despacho: B-202 Tutorías: Lunes 16:00-18:00 y Martes 16:00-20:00

Cristian Blanco

Introducción a los Sistemas Operativos

Principios de Computadoras II

ESTRUCTURAS ALGORITMICAS

Tema 2 Introducción a la Programación en C.

324 MR Versión 1 Prueba Integral 1/3 Semana 10 Lapso

SISTEMAS OPERATIVOS AVANZADOS

Operadores y Expresiones

A l g o r i t m o s. Seguridad en Internet ALGORITMOS.

Algoritmos. Intro. Prof. Raquel Torres Peralta / Gerardo Sanchez S. Unison

ESTRUCTURAS REPETITIVAS

6.2 Interfaz del Programa de Diseño de una Guía Circular.

Programcaión Básica. Secuencias de Control y Repetición. Arturo Vega González.

Diseño arquitectónico 1ª edición (2002)

3. PROGRAMACION CONCURRENTE

Estructuras de control

Transcripción:

SINCRONIZACIÓN DE PROCESOS 1

Introducción Los procesos acceden a datos o recursos compartidos El acceso puede provocar que el estado final de los datos no sea correcto, generando incoherencias debido a manipulaciones concurrentes El acceso debe ser controlado, deben emplearse herramientas que garanticen la exclusión mutua Existen herramientas que permiten esto, pero tanto el sistema operativo como el hardware deben ofrecer características que soporten las mismas 2

Instrucción Test-and-Set Es una instrucción empleada para testear y escribir en un lugar en memoria de manera atómica (sin interrupción). Lectura y escritura sin interrupciones. El testeo puede ser una comparación frente a un valor por ejemplo. El valor es dependiente del resultado del test Un procesador realizando una instrucción Test-and-Set sobre una dirección de memoria impide que cualquier otro procesador pueda realizarla cerrando el bus de memoria Con esta instrucción se facilita la creación de semáforos y otras herramientas de sincronización Enlace http://en.wikipedia.org/wiki/test and set 3

Semáforos Introducidos por Edsger Dijkstra en 1968 Herramienta de sincronización que brinda una solución al problema de la exclusión mutua restringiendo el acceso simultáneo a los recursos compartidos Permiten resolver la mayoría de los problemas de sincronización entre procesos y forma parte del diseño de muchos sistemas operativos y de lenguajes de programación concurrentes Si bien son útiles para sincronizar procesos, no pueden evitar deadlocks El valor de un semáforo representa la cantidad de instancias libres de un recurso determinado 4

Semáforos Los semáforos consisten en: - una variable que puede tomar valores en un rango acotado de enteros positivos - una cola de procesos que están en espera del recurso - un conjunto de funciones permitidas Operaciones P(Semaforo s) { // Adquirir Recurso wait until s > 0, then s s 1; P = down = wait = acquire /* Testear y decrementar s, debe ser una operación atómica */ V(Semaforo s) { // Liberar Recurso s s+1; /* debe ser atómico */ V = up = signal = release Init(Semaforo s, Valor v) { s v; La atomicidad de las operaciones se obtiene mediante el uso de instrucciones tipo test-and-set o desactivación de interrupciones, dicha atomicidad es fundamental para evitar las condiciones de competencia 5

Semáforos Para evitar el busy-waiting (http://en.wikipedia.org/wiki/busy_waiting) un semáforo tiene asociada una cola de procesos Entero Cola de espera 6

Semáforos binarios Actúan como indicador de condición registrando si un recurso está o no disponible Son denominados mutex cuando se inician en 1 pues su función principal es la de garantizar la exclusión mutua Un semáforo binario sólo puede tomar dos valores: 0 y 1 Si, para un semáforo binario S, S = 1 entonces el recurso está disponible y el proceso lo puede utilizar; si S = 0 el recurso no está disponible y el proceso debe esperar Si un proceso hace un down sobre un semáforo binario que vale: 1 decrementará de manera atómica el valor del semáforo dejándolo en 0 0 provocará que el proceso invocante quede dormido en el semáforo Si un proceso hace un up sobre un semáforo que vale: 1 el semáforo permanecerá con el valor 1 y el proceso seguirá su ejecución 0 el semáforo se incrementa sólo si no hay procesos dormidos en el si tiene procesos dormidos continuará en 0 y se despertará a uno de dichos procesos 7

Semáforos Uso de semáforos para obtener exclusión mutua semaforo mutex = 1 Proceso P1() { /* RC */ Proceso P2() { /* RC */ Uso de semáforos para sincronización de procesos P2 debe ejecutarse luego de P1 semaforo s = 0 Proceso P1() {... /* RC */ up(s); Proceso P2() { down(s); /* RC */... 8

Semáforos n-arios o de conteo o generales Útiles para representar n instancias de un tipo de recurso o para permitir el acceso a una región critica a n procesos Toman valores de 0 a n Su comportamiento es similar a los de los semáforos binarios 9

Semáforos n-arios implementado con semáforos binarios SemaforoGeneral { int valor = K SemaforoBinario wait = 0 SemaforoBinario mutex = 1 down(semaforogeneral S) { down(s.mutex) if (S.valor <= 0) { S.valor = S.valor 1; up(s.mutex); down(s.wait); else { S.valor = S.valor 1; up(s.mutex); up(semaforogeneral S) { down(s.mutex) if (S.valor < 0) { up(s.wait); S.valor = S.valor + 1; up(s.mutex); 10

Fumadores Para poder confeccionar un cigarro y fumarlo se precisan 3 ingredientes: - Tabaco - Papel - Fósforo Hay 3 fumadores deseosos de fumar, cada uno de ellos tiene una cantidad ilimitada de uno de estos ingredientes Existe un arbitro que permite a los fumadores hacer sus cigarros seleccionando dos fumadores para que coloquen un item cada uno sobre la mesa, luego notifica al tercero para que advierta que los dos componentes faltantes están disponibles. El proceso advertido toma los ítems, arma un cigarro y fuma... El arbitro ve la mesa vacía y nuevamente elige dos fumadores... semaforo fumador[3] ={0,0,0; semaforo mesa = 1; Arbitro while (1) { down(mesa); //elegir fumadores i y j //para que pongan items //hacer que k fume up(fumador[k]); Fumador(i) while true { down(fumador[i]); //hacer un cigarro up(mesa); //fumar el cigarro 11

Buffer acotado - Productor/Consumidor Un proceso, Productor, coloca items en un buffer de determinado tamaño (N) Cuando el buffer esté completamente lleno se va a dormir El Consumidor extrae los items, cuando el buffer está vacío se va a dormir count = número de items existentes en el buffer - El Productor chequea count==n? SI dormir NO count = count + 1 - El Consumidor chequea count==0? SI dormir NO count = count 1 12

Buffer acotado - Productor/Consumidor Cada proceso verifica si el otro proceso debe o no continuar durmiendo #define N 10 int count = 0; void productor() { int item; void consumidor() { int item; while(1) { item = producir_item(); if (count == N) sleep(); poner_item(item); count = count + 1; if (count == 1) wakeup(consumidor); while(1) { if (count == 0) sleep(); item = sacar_item(item); count = count 1; if (count == N 1) wakeup(productor); 13

Buffer acotado - Productor/Consumidor Los semáforos resuelven el problema del despertar perdido Se utilizan tres semáforos - full: cuenta el número de entradas ocupadas en el buffer - empty: cuenta el número de entradas vacías en el buffer - mutex: para garantizar la exclusión mutua void productor() { int item; #define N 10 semaforo mutex = 1 semaforo empty = N semaforo full = 0 while(1) { item = producir_item(); down(empty); poner_item(item); up(full); void consumidor() { int item; while(1) { down(full); item = sacar_item(item); up(empty); 14

Lectores y Escritores Modela el acceso a una base de datos Muchos procesos en competencia intentan leer y escribir en ella Pueden existir muchos lectores simultáneos Cuando actúa un escritor no pueden estar presentes otros lectores ni escritores semaforo mutex = 1; semaforo db = 1; int rc = 0; void escritor() { while (1) {... down(db); escribir_db(); up(db); void lector() { while (1) { rc = rc + 1; if (rc == 1) down(db); leer_db(); rc = rc 1; if (rc == 0) up(db); Prioridad para los lectores 15

Barbero Dormilón 1 barbero 1 silla de peluquero N sillas si no hay clientes el barbero se duerme en la silla cuando llega el primer cliente debe despertar al barbero si llegan más cliente mientras el barbero corta el cabello de un cliente se sientan en la silla (si las hay) o salen de la peluquería #define SILLAS 5 semaforo clientes = 0 /* Numero de clientes en espera */ semaforo barbero = 0 semaforo mutex = 1 int espera = 0 void barbero() { while (1) { down(clientes); espera = espera 1; Si no hay clientes se duerme up(barbero); Barbero listo para trabajar cortar_cabello(); void cliente() { if (espera < SILLAS) { espera = espera + 1 up(clientes); down(barbero); tomar_corte(); else { Despierta al barbero Si el barbero está ocupado espera Si no hay sillas libres se retira sin tomar servicio 16

Cena de los filósofos Típico problema donde un conjunto de procesos compiten por recursos compartidos Definido por Dijkstra en 1965, Hoare propuso la fantasía 5 filósofos = 5 procesos (N=5) Cada filósofo precisa 2 palillos (recursos) para comer (ejecutarse) arroz 5 0 4 1 4 1 3 2 3 2 IZQ DER i i%n (i 1)%N 1 1 0 2 2 1 3 3 2 4 4 3 5 0 4 17

Cena de los filósofos: Solución 1 #define N 5 #define IZQ(i) i%n #define DER(i) (i 1)%N void filosofo (int i) { while (1) { pensar(); tomar_palillo(izq(i)); tomar_palillo(der(i)); comer(); soltar_palillo(izq(i)); soltar_palillo(der(i)); Problema Sincronización puede llevar a DEADLOCK 18

Cena de los filósofos: Solución 2 (con semáforos) #define N 5 #define IZQ(i) i%n #define DER(i) (i 1)%N semaforo mutex = 1 void filosofo (int i) { while (1) { pensar(); tomar_palillo(izq(i)); tomar_palillo(der(i)); comer(); soltar_palillo(izq(i)); soltar_palillo(der(i)); Problema Problema Come Sincronización un sólo filósofo puede a llevar la vez a Máx. Paralelismo DEADLOCK = 2 19

Cena de los filósofos: Solución 3 #define N 5 #define IZQ i%n #define DER (i 1)%N #define PENSAR 0 #define APETITO 1 #define COMER 2 semaforo mutex=1; int estado[n]; semaforo s[n]; //todos en cero void filosofo(int i) { while (1) { pensar(); tomar_palillo(i); comer(); poner_palillo(i); void tomar_palillo(int i) { estado[i] = APETITO; test(i); down(s[i]); void poner_palillo(int i) { estado[i] = PENSAR; test(izq(i)); test(der(i)); void test(int i) { if (estado[i]==apetito && estado[izq(i)]!=comer && estado[der(i)]!=comer) { estado[i] = COMER; up(s[i]); 20

Monitores Se debe prestar especial atención al usar semáforos void barbero() { while (1) { down(clientes); espera = espera 1; up(barbero); cortar_cabello(); Esta primitiva de alto nivel fue introducida por Hoare en 1974 Hansen 1975 Con monitores la exclusión muta está garantizada void barbero() { while (1) { down(clientes); espera = espera 1; up(barbero); cortar_cabello(); Un monitor es una colección de procedimientos, variables y estructuras de datos Los procesos pueden invocar a los procedimientos de un monitor cuando lo deseen, pero no tienen acceso directo a las estructuras de datos internas 21

Monitores Sintaxis modelo monitor modelo { int i; condition c; //variable local del monitor //variable de condición procedimiento P1() {... procedimiento P2() {... procedimiento P3() {... //inicialización de variables Sólo un proceso puede estar activo dentro del monitor Si el monitor está ocupado y un segundo proceso intenta ingresar, éste se bloquea Los monitores son construcciones de los lenguajes de programación 22

Monitores Generalmente el compilador del lenguaje que soporta monitores implementa la exclusión mutua mediante semáforos Usando monitores, basta con transformar las secciones críticas en procedimientos de monitor con el fin de lograr la exclusión mutua Cómo se realiza el bloqueo de procesos? Mediante variables de condición + operaciones WAIT y SIGNAL - si un proceso de monitor no puede/debe continuar ejecuta un WAIT en alguna variable de condición - el proceso se bloquea y permite que otro proceso ingrese al monitor - el nuevo proceso despertará al proceso dormido mediante SIGNAL sobre la misma variable de condición Un SIGNAL sobre una variable que no bloquea ningún proceso se pierde, no se mantiene historia Así no existen dos procesos activos en el monitor? Hoare: suspender al proceso que hace SIGNAL y reanudar al proceso antes dormido Hansen: el proceso que hace SIGNAL debe salir del monitor inmediatamente 23

Monitores monitor ProductorConsumidor { int count; condition lleno, vacio; procedimiento poner() { if (count == 10) wait(lleno) poner_item() count = count + 1 if (count == 1) signal(vacio) count = 0; procedimiento sacar() { if (count == 0) wait(vacio) sacar_item() count = count 1 if (count == 9) signal(lleno) procedimiento Productor() { while(1) { producir_item() ProductorConsumidor.poner procedimiento Consumidor() { while(1) { producir_item() ProductorConsumidor.sacar 24

Monitores: Desventajas Los monitores son un concepto a nivel lenguaje de programación Muchos lenguajes de programación no poseen monitores 25