Sincronización de procesos

Slides:



Advertisements
Presentaciones similares
Tabla de Contenido Concurrencia.
Advertisements

Daniel Morillo Jorge Boscán Gregory Carrasco
Sincronización de procesos
Unidad III Administración de procesos
Sincronización de procesos Mariano Gómez Plaza.  Mariano Gómez Plaza Sincronización de procesos 2 Tipos de procesos IndependientesCooperantes.
IET110 Sistemas Operativos P04: Exclusión Mutua Prof. Jonathan MakucSlide: 1.
 El acceso concurrente a datos compartidos puede dar pie a inconsistencia de datos  Mantener la consistencia de los datos requiere mecanismos para asegurar.
Sincronización de Procesos
Sincronización de Procesos
Tema 9.6: Sincronización de Procesos
Applications Development I 6.1 Foro Tomas Anzalotta Alvarado.
AYUDANTÍA 2 Lenguaje Imperativo y Java. Punteros Dirección a memoria (puede apuntar a NULL). Permite trabajar con memoria (variables dinámicas de heap).
Sistema de control de versiones CVS y Subvesion. Definición: Control de versiones Un sistema de control de versiones es un sistema de gestión de múltiples.
Resumen de Sistemas Operativos I Msc./Ing. Antonio Mena.
PROGRAMACIÓN ORIENTADA A OBJETOS SEGUNDA UNIDAD: “CLASES, OBJETOS Y MÉTODOS” IRVING YAIR SALAS CHÁVEZ ING. EN SISTEMAS COMPUTACIONALES - ITSLP.
MUTEX. QUE ES CONCURRENCIA - MUTEX  Son el mecanismo que nos ayuda en la sincronización para proteger una sección crítica en nuestro código.  Estas.
Funciones en lenguaje C 2 Funciones Definición: – Las funciones son los bloques de construcción básicos de C. Dentro de ellas se da toda la actividad.
Control, adquisición y monitoreo con Arduino y Visual Basic .net
Semáforos y Comunicación entre Procesos
Proceso: Una instancia de un programa en ejecución
Estructuras de Control en Visual Basic.net
Operadores Java es un lenguaje rico en operadores, que son casi idénticos a los de C/C++.
CC Bases de Datos Primavera Clase 12: Implementación de ACID
SISTEMAS OPERATIVOS Sección Crítica.
Mecanismos de Comunicación usando Paso de Mensajes
Programación en C - manejo de Archivos
Anexo Chame-San Carlos
Procesos Concurrentes
Comunicación, Sincronización y Concurrencia de procesos
U.T. 11: Introducción A Las Bases De Datos
Paul Leger Procesos (capitulo 2) Paul Leger
Paul Leger Procesos (capitulo 2) Paul Leger
Estructuras de Control en Visual Basic.net
ADMINISTRACíON DE LA MEMORIA EN SISTEMAS RECIENTES
Exclusión mutua de secciones
Programación Básica con NQC
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS
Monitores Mecanismo sincronización de nivel más alto que semáforos Construcción a nivel de lenguaje de programación que controla el acceso a datos compartidos.
ARQUITECTURA DE HARD WARE COMPONENTES EN BLOQUES DEL PROCESADOR
L.I. Gerardo Ortiz Rivera
LÓGICA DE PROGRAMACIÓN
QUE ES EL SOFTWARE Es un conjunto de programas de computo, procedimientos, reglas, documentación y datos asociados que forman parte de las operaciones.
Unidad 3. Introducción a la programación
Exclusión mutua Un Algoritmo Centralizado Algoritmo Descentralizado
PROCESOS COMENZAR.
Sincronización de Procesos
ESTRUCTURAS DE CONTROL EN VISUAL BASIC.NET Prof.: Rafael Mourglia.
Sistemas Operativos Semáforos II.
PROGRAMACION: Que es un computador: Es un aparato electrónico que tiene el fin de recibir y procesar datos para realización de diversas operaciones..
HERRAMIENTAS DE PROGRAMACIÓN
Estructuras Repetitivas
ESTRUCTURA DE LOS SISTEMAS OPERATIVOS.
Fundamentos de programación
El entorno de Desarrollo de Dev-C++
Message Passing Interface
Estructura general de un programa. Estructura general de un programa. Pseudocódigo Diagrama de flujo Concepto de programas. Concepto de programas. Instrucciones.
Concurrencia: exclusión mutua y sincronización Capítulo 5.
ESTRUCTURA DE SISTEMAS OPERATIVOS Carbajal Rojas karla.
Tema 2 Estructura de un programa en C. IWI Tema 2 Programa en C U n programa en C es una serie de instrucciones en un lenguaje muy especifico (similar.
Programación Modular Programación de Computadoras - Hugo Vega Grupo2: Reina Rodríguez Miriam Salluca.
Lenguaje de Programación II
INTRODUCCIÓN A LA INFORMÁTICA
MONITORES INTEGRANTES: Arias Marcelo Tnt. Espín Roberto Tnt. Rosero Santiago.
Pipelining Peligros de control.
ESTRUCTURA DE LOS SISTEMAS OPERATIVOS
Estructura de Sistemas Operativos
Estructura de los Sistemas Operativos
Hilos de Procesamiento. Hilos Concepto Beneficios Hilos a nivel kérnel y a nivel usuario Modelos multihilos Hilos de Solaris 2 Hilos de Java.
Transcripción de la presentación:

Sincronización de procesos Rina Arauz

Tipos de procesos Proceso independiente es aquel que se ejecuta sin requerir la ayuda o cooperación de otros procesos, no afecta ni es afectado por la ejecución de otros procesos en el sistema y NO comparten datos. Procesos cooperantes (cooperan y comparten) trabajan conjuntamente en alguna actividad, para lo que deben ser capaces de comunicarse e interactuar entre ellos, se pueden afectar o ser afectados por la ejecución de otros procesos en el sistema y SI comparten datos. Tanto si los procesos son independientes como cooperantes, pueden producirse una serie de interacciones entre ellos.

Productor-consumidor Un proceso produce datos que son posteriormente procesados por otro proceso i.e.: el manejador de teclado y el programa que recoge los caracteres de un buffer Lo más cómodo es emplear un buffer circular Escribe Lee Productor Consumidor

Código del productor Código del consumidor El productor no puede escribir en el buffer si está lleno Comparte con el consumidor: el buffer y el contador El consumidor no puede leer del buffer si está vacío do { ... produce un nuevo elemento (elemento_p) while (contador == MAX_ELEMENTOS) haz_nada; buffer[indice_p] = elemento_p; indice_p = (indice_p + 1) % MAX_ELEMENTOS; contador = contador + 1; } while (TRUE); while (contador == 0) haz_nada; elemento_c = buffer[indice_c]; indice_c = (indice_c + 1) % MAX_ELEMENTOS; contador = contador - 1; consume el elemento (elemento_c)

Condiciones de carrera El código anterior no funciona por existir condiciones de carrera al modificar el contador. En lenguaje ensamblador: Productor Consumidor load r0, contador load r0, contador add r0, 1 sub r0, 1 store contador, r0 store contador, r0 Problema: la modificación del contador no es atómica Dependiendo de la ejecución relativa de las instrucciones se puede llegar a diferentes resultados. Condiciones de carrera: se presenta cuando dos ó más procesos compiten por acceder a un mismo recurso. Si no existe sincronización, al interferirse los cambios pueden haber serias inconsistencias. Puede producirse una condición de carrera sobre una variable cuando varios procesos acceden simultáneamente a la variable para modificarla. La condición de carrera (race condition) ocurre cuando dos o más procesos acceden un recurso compartido sin control, de manera que el resultado combinado de este acceso depende del orden de llegada.

Atomicidad Una operación se dice que es atómica (en un sistema uniprocesador) cuando se ejecuta con las interrupciones deshabilitadas. Las referencias y las asignaciones son atómicas en la mayoría de los sistemas. Esto no es siempre cierto para matrices, estructuras o números en coma flotante. Típicamente la arquitectura proporciona operaciones específicas para lograr la atomicidad.

Ejemplo de condiciones de carrera: #include <pthread.h> #include <stdio.h> void *print_fnc( void *ptr ); int p = 5; int main() { pthread_t thr1, thr2; char *m1 = "Thr1"; char *m2 = "Thr2"; int r1, r2; r1 = pthread_create( &thr1, NULL, print_fnc, (void*) m1); r2 = pthread_create( &thr2, NULL, print_fnc, (void*) m2); pthread_join( thr2, NULL); pthread_join( thr1, NULL); printf("Thread 1 devolvio: %d y el Thread 2: %d\n", r1, r2); }

cc hilo_no_sinc.c -lpthread -o hilo_no_sinc Ejecutar: ./hilo_no_sinc void *print_fnc( void *ptr ) { int i = 0; char *message; message = (char *) ptr; for (i; i<1000; i++) { p = p + 1; printf("%s : %d\n", (char*)message, p); sleep(1); } Salida: Thr2 : 6 Thr1 : 7 Thr1 : 8 Thr2 : 9 Thr2 : 11 Thr1 : 10 Thr1 : 12 Thr2 : 13 Thr1 : 14 Thr2 : 15 Thr1 : 16 Thr2 : 16 Thr2 : 17 Thr1 : 17 Thr1 : 18 Thr2 : 19 Thr2 : 20 Thr1 : 21 Thr1 : 22 Compilar: cc hilo_no_sinc.c -lpthread -o hilo_no_sinc Ejecutar: ./hilo_no_sinc

Ejemplo (2):

Sincronización Persona A Persona B 3:00 Mira en la nevera. No hay leche 3:05 Va a la tienda 3:10 Llega a la tienda Mira en la nevera. No hay leche 3:15 Deja la tienda Va a la tienda 3:20 Llega a casa y guarda la leche Llega a la tienda 3:25 Deja la tienda 3:30 Llega a casa y ...

Sincronización Sincronizar hace referencia a la coordinación de procesos que se ejecutan simultáneamente para completar una tarea (procesos cooperantes), con el fin de obtener un orden de ejecución correcto y evitar así estados inesperados.

Definiciones: Exclusión mutua: es el mecanismo que asegura que sólo una persona o proceso está haciendo algo en un instante determinado (los otros están excluidos). Sección crítica: es la sección de código, o colección de operaciones, en el que se actualizan variables comunes. La ejecución de las secciones críticas debe ser mutuamente exclusiva para evitar inconsistencia de datos. El problema de la sección crítica consiste en diseñar un protocolo que los procesos pueden usar para conseguir la exclusión mutua de las secciones críticas.

Problema de la sección crítica Toda solución debe cumplir tres condiciones Exclusión mutua: no pueden acceder dos procesos a la vez a la sección crítica. Progreso: cuando un proceso quiera ejecutar su sección crítica pueda hacerlo si ésta está libre. Espera limitada: que ningún proceso espere indefinidamente para entrar en su sección crítica. Solución general: do { protocolo de entrada sección crítica protocolo de salida resto de la sección } while (TRUE);

Tipos de soluciones Suposiciones: Todos los procesos se ejecutan a una velocidad distinta de cero Su velocidad relativa no influye Soluciones basadas en variables de control Soluciones basadas en instrucciones máquina específicas (test_and_set o swap) Soluciones basadas en primitivas del sistema operativo Soluciones proporcionadas por el lenguaje, regiones críticas y monitores

Semáforos Introducidos por Dijkstra en los años 60 Es un tipo especial de variable que sólo puede ser accedida por dos primitivas P y V P (semáforo) Operación atómica que espera hasta que el semáforo sea positivo, en este momento lo decrementa en 1. V (semáforo) Operación atómica que incrementa el semáforo en 1. ¿Cómo quedaría el problema de la sección crítica con semáforos? P (exmut) Sección crítica V (exmut)

Características de los semáforos Son independientes de la máquina Son simples Pueden trabajar con varios procesos Pueden permitir que varios procesos entren en la sección crítica al mismo tiempo en caso de necesitarse esta posibilidad Doble uso de los semáforos: Exclusión mutua Sincronización

Existen básicamente dos tipos de semáforos: Semáforos contadores: Toman valores positivos mayores o iguales a 0. Se utilizan para sincronización de procesos. Semáforos binarios: Toman los valores 0 ó 1 y se utilizan para exclusión mutua.

Productor-consumidor Restricciones: El consumidor espera a que haya datos en el buffer El productor espera a que haya buffers vacíos Sólo un único proceso puede manipular el buffer a la vez Semáforos: smf_llenos, smf_vacíos y exmut Valores iniciales: smf_llenos = 0 smf_vacíos = número_de_buffers exmut = 1

Productor Consumidor P (smf_vacíos); P (exmut); Produce un dato; V (exmut); V (smf_llenos); P (smf_llenos); P (exmut); Consume el dato; V (exmut); V (smf_vacíos); ¿Por qué el productor hace P(smf_vacíos) y V(smf_llenos)? ¿Es importante el orden en que se ejecutan las primitivas P y V?

Problema del puente estrecho Por un puente sólo pueden pasar o coches que suben o coches que bajan. Solución: Variables compartidas: int contadorsubida = 0; int contadorbajada = 0; Semáforos: semaforo exmut_s, exmut_b, puente; Valores iniciales: Los semáforos inicialmente deben valer 1 No se tratan los problemas de inanición

Código subida Código bajada P(exmut_s); contadorsubida++; if (contadorsubida == 1) P(puente); V(exmut_s); ... Se sube el puente ... contadorsubida--; if (contadorsubida == 0) V(puente); P(exmut_b); contadorbajada++; if (contadorbajada == 1) P(puente); V(exmut_b); ... Se baja el puente ... contadorbajada--; if (contadorbajada == 0) V(puente);

Problema del barbero dormilón Problema: 1 barbero y N sillas de espera Si un cliente entra y no hay sillas, se va Semáforos: clientes: número de clientes en espera sin contar el que está en la silla del peluquero barbero: barberos activo o inactivo exmut: exclusión mutua Variable compartida: esperando: número de clientes esperando Inicialmente: clientes=0 barbero=0 exmut=1 esperando=0

Barbero Cliente do { P(clientes); P(exmut); esperando=esperando-1; V(barbero); V(exmut); /* Corta el pelo */ } while (TRUE); do { P(exmut); if (esperando < SILLAS) { esperando++; V(clientes); V(exmut); P(barbero); /* Se corta el pelo */ } else { } } while (PELOLARGO);

Comunicación con mensajes Válido para comunicación intermáquina Definición: Mensaje: parte de información que es pasada de un proceso a otro Buzón: lugar donde se depositan los mensajes desde el envío a la recepción Operaciones sobre mensajes: Enviar Recibir Métodos de comunicación Comunicación en un único sentido: los mensajes fluyen en un único sentido (pipe) Ejemplos: Tuberías de UNIX. Comunicación bidireccional: los mensajes fluyen en ambos sentidos (sockets) Ejemplos: Llamadas a procedimientos remotos (RPC).