Comunicación entre Procesos

Documentos relacionados
Mecanismos IPC System V

Sistemas Operativos I. Enxeñería Informática. Curso 2007/08. Práctica 2: Concurrencia de procesos: Productores/Consumidores.

Memoria compartida y semáforos r/w. La página del manual que podría servir para describir estas funciones es la siguiente:

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

Comunicación mediante mensajes

Sistemas Operativos. Eloy Anguiano Rey Rosa M. Carro Ana González

Procesos e Hilos en C

Computación de Alta Performance Curso 2009 PROGRAMACIÓN PARALELA EN LENGUAJE C

Ingeniería Informática. Curso 3º. Sistemas Operativos Examen Final. TEORIA. 4 de Septiembre de 2009

Prueba de Laboratorio Modelo B01 Semáforos y Memoria Compartida

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

TEMA 3. CONCEPTOS FUNDAMENTALES DEL NIVEL DEL SISTEMA OPERATIVO. Definición y objetivos de un S.O

Tema 4 El paradigma cliente-servidor

Prácticas de Sistemas operativos

Capítulo 3: Procesos. n Concepto de Proceso. n Despacho (calendarización) de Procesos. n Operaciones en Procesos. n Procesos en cooperación

Paradigma de paso de mensajes

Sistemas Operativos Práctica 4

Concurrencia: Exclusión mutua y Sincronización

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

TEMA 7: Ficheros. TEMA 7: Ficheros Concepto de fichero

Curso LINUX. AREA 1: Intercomunicación

Mensajes. Interbloqueo

UNIVERSIDAD AUTÓNOMA DE BAJA CALIFORNIA FACULTAD DE CIENCIAS PRACTICA DE PROCESOS HERRAMIENTAS

Introducción a la programación con sockets en C

Elementos de un programa en C

3.- Procesos. Concepto de Proceso. Despacho (calendarización) de Procesos. Operaciones en Procesos. Procesos en cooperación

SOLUCION EXAMEN junio 2006

Memoria Dinámica. Jornadas de Marzo 2010 Grupo de Usuarios de Linux Tania Pérez

6. Entrada y Salida Explicación de la interfaz entre el computador y el mundo exterior.

Relación de prácticas de la asignatura METODOLOGÍA DE LA PROGRAMACIÓN Segundo Cuatrimestre Curso º Grado en Informática

Estructuras y funciones de programación de sockets.

Tema 13: Apuntadores en C

APUNTADORES. Un apuntador es un objeto que apunta a otro objeto. Es decir, una variable cuyo valor es la dirección de memoria de otra variable.

Programación estructurada (Introducción a lenguaje C)

Sistemas Operativos Practica 1: procesos y concurrencia.

Programación en C. Algoritmo y Estructura de Datos. Ing. M. Laura López. Programación en C

Sistemas Operativos. Pedro Cabalar TEMA III. PROCESOS. Depto. de Computación Universidade da Coruña

Sistemas Operativos I Manual de prácticas

Sistemas Operativos Práctica 3

Concurrencia entre Procesos.

El lenguaje de Programación C. Fernando J. Pereda

FILE *nombre_puntero_fichero; fopen(char_nombre_archivo,char_modo_apertura ); MODOS DE APERTURA. Abre un archivo de texto para lectura.

sockets Flujo (SOCK_STREAM) Comunicación bidireccional Confiable (entrega garantizada) Información ordenada en el destino Datagrama (SOCK_DGRAM)

Parte Práctica Adicional del Coloquio o Examen Final de Sistemas Operativos 2014.

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

Comunicación mediante mensajes

Relación de prácticas de la asignatura METODOLOGÍA DE LA PROGRAMACIÓN Segundo Cuatrimestre Curso º Grado en Informática

UNIVERSIDAD DE LOS ANDES NUCLEO UNIVERSITARIO RAFAEL RANGEL (NURR) DEPARTAMENTO DE FISICA Y MATEMATICA AREA COMPUTACION TRUJILLO EDO.

Principios de Computadoras II

- Bajo que condiciones el algoritmo de planifiación de procesos FIFO (FCFS) resultaría en el tiempo de respuesta promedio más pequeño?

Gestión de procesos en UNIX

Apuntadores en C y C++

Examen de Fundamentos de sistemas distribuidos

Formatos para prácticas de laboratorio

Informática Electrónica Manejadores de Dispositivos (Device Drivers)

Módulo 2 Comunicación

Prácticas de Sistemas Operativos

Implementación de monitores POSIX

TEMA 2. EL LENGUAJE C. ELEMENTOS BÁSICOS

Arquitecturas Cliente/Servidor

Tema ADQUISICIÓN Y TRATAMIENTO DE DATOS. Departamento de Ciencias de la Computación e IA. Subprogramas en C

REPRESENTACIÓN INTERNA DE FICHEROS

Tema 4. Gestión de entrada/salida

Tema 14: Arreglos estáticos en C

Prof. Dr. Paul Bustamante

Sistemas Operativos. Curso 2016 Procesos

Estructuras de Datos Declaraciones Tipos de Datos

Mensajes. (versión preliminar)

Tema: Clases y Objetos en C#. Parte II.

T5-multithreading. Indice

PROGRAMACIÓN CON LLAMADAS AL SISTEMA POSIX (INTRODUCCIÓN A LA PROGRAMACIÓN CON UNIX/LINUX)

Control por Computador

Seguridad. Mecanismos de protección Canales encubiertos Seguridad multinivel

Procesos 1 / 31. Para entender el concepto de hebra, necesitamos compreender el concepto de proceso

TEMA 8: Gestión dinámica de memoria

Lenguaje de programación C. Introducción

4. DIAGRAMAS DE INTERACCIÓN INTRODUCCIÓN DIAGRAMAS DE SECUENCIA Objetos Mensajes

Análisis Experimental de la Transmisión de Datos

TIPOS DE DATOS BASICOS EN LENGUAJE C

Problemas de Redes de Computadores. Conjunto de problemas 1

Programación. Test Autoevaluación Tema 3

Estructuras y funciones de programación de sockets.

Carlos Montenegro. Programación Orientada a Objetos Proyecto Curricular de Ingeniería de Sistemas

Mecanismos IPC: sockets

Tema 3 SUBRUTINAS. Estructura de Computadores OCW_2015 Nekane Azkona Estefanía

Comunicación en Sistemas Distribuidos

Punteros. Definición Un puntero es un dato que contiene una dirección de memoria.

Tema 4: Corrección y Robustez en C++ Programación Orientada a Objetos Curso 2008/2009 Begoña Moros Valle

Lenguaje C Elementos de un Programa. Ing. Hugo Fdo. Velasco Peña Universidad Nacional 2006

Concurrencia. Primitivas IPC con bloqueo

Ficheros conceptos. Manejo de ficheros en C. Apertura del fichero Función fopen: nombre del fichero. Apertura del fichero Función fopen

LENGUAJE. Tema 2 Elementos de un programa

07 << Acceso en exclusiva al recurso compartido >>

Examen de Fundamentos de sistemas operativos

Constantes. Las constantes no cambian durante la ejecucion de un programa en C++, en C++ existen 4 tipos de constantes:

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

Transcripción:

Sincronización y Comunicación de Procesos Sincronización y Comunicación de Procesos Sincronización Sincronización Comunicación Comunicación Condiciones de Condiciones de Carrera Carrera Memoria Memoria Compartida Compartida Seriabilidad Seriabilidad Sección Sección Crítica Crítica Hardware Hardware Paso de Paso de Mensajes Mensajes Soluciones Soluciones Semáforos Semáforos Construcciones Construcciones Lingüísticas Lingüísticas 1 Comunicación entre Procesos Librería IPC (Inter-Process Communication) /POSIX Dos modelos complementarios de comunicación Memoria compartida: los procesos comparten variables mediante las cuales comunican la información Existe un espacio de memoria común La responsabilidad de la comunicación recae sobre los programadores El SO sólo proporciona la memoria compartida Paso de mensajes: permite a los procesos intercambiar mensajes Los procesos tienen espacios de direcciones distintos Las operaciones básicas de comunicación las proporciona el SO send (destino, mensaje) receive (origen, mensaje) Es necesario definir las características de los enlaces 2 1

Memoria Compartida (POSIX) Pertenecen al estándar POSIX.1 y utilizan un entero como descriptor Cabeceras: Funciones: #include <sys/types.h> #include <sys/ipc.h> #include <sys/shm.h> key_t ftok(const char *path, int id); int shmget (key_t key, size_t size, int shmflg); void *shmat (int shmid, const void *shmaddr, int shmflg ); int shmdt (const void *shmaddr); int shmctl (int shmid, int cmd, struct shmid_ds *buf); Para ver las áreas de memoria compartida activas: ipcs ma 3 Memoria Compartida: Funciones (I) Inicialización: la inicialización crea un segmento de memoria compartida shmget La creación es similar a la de los semáforos nombrados: Uno de los procesos debe crear el segmento de memoria y el resto lo utilizan int shmget (key_t key, size_t size, int shmflg); Parámetros: key: identificador único de la región de memoria compartida Para crearlo se utiliza la función: key_t ftok(const char *path, int id); path: es el path de un fichero accesible por todos los procesos id: identificador para asociar diferentes claves al mismo fichero. 4 2

Memoria Compartida: Funciones (II) size: tamaño en bytes de la región de memoria compartida shmflag: determina si se accede a una región de memoria ya creada o se debe crear una nueva Si shmflag es 0 se indica que se quiere acceder a una región de memoria compartida ya creada (si no existe, shmget devuelve -1) Si smhflag tiene el valor de IPC_CREATse crea la región de memoria compartida si no existe. Si ya existe devuelve el manejador a la región ya asignada Los permisos se indican añadiéndolos en octal al parámetro IPC_CREAT Ejemplo: IPC_CREAT 0777 Valor Devuelto: Manejador de la Memoria Compartida (entero positivo) -1 en caso de error 5 Memoria Compartida: Funciones (III) Acceso a la Memoria Compartida (attach): void *shmat (int shmid, const void *shmaddr, int shmflg ); Nos devuelve un puntero a la región de memoria compartida inicializada previamente. Parámetros: shmid: identificador devuelto por shmget() smhaddr: dos opciones 0: asigna la dirección de memoria automáticamente (Recomendado) Puntero dentro del área de memoria del proceso. shmflg: modo de acceso 0: lectura y escritura SHM_RDONLY: acceso solo en modo lectura 6 3

Memoria Compartida: Funciones (IV) Liberación de la memoria compartida (detach): int shmdt (const void *shmaddr); Libera la dirección de memoria (shmaddr) asignada previamente. El segmento de memoria compartido con otros procesos no se libera Devuelve 0 si es correcto y -1 en caso de error Eliminación de la memoria compartida (último proceso): int shmctl (int shmid, int cmd, struct shmid_ds *buf); shmid: identificador de memoria compartida cmd: IPC_RMID buff: NULL Devuelve 0 si es correcto y -1 en caso de error 7 EJEMPLO: memoria compartida Crear una región de memoria compartida. El Proceso hijo escribe en el buffer de memoria (libera la CPU entre cada escritura El proceso padre lee y muestra en contenido del buffer Semáforo para acceso al buffer de memoria 8 4

#include <stdlib.h> #include <sys/types.h> #include <sys/ipc.h> #include <sys/shm.h> #include <semaphore.h> #define SHM_SIZE 1024 /* 1K segmento de memoria compartida */ sem_t *sem_1; int shmid; // puntero para el identificador de los semáforos // manejador de memoria compartida int main(void) { int i,j; key_t key; pid_t hijo; int *data; Valor Inicial 1 (Desbloqueado) printf("creando semáforos...\n"); /* comprueba si ya existe el semáforo sino lo crea desbloqueado (1)*/ if((sem_1=sem_open( /sem_ipc1", O_CREAT, 0644, 1))==(sem_t *)-1) perror("error creando semáforo 1"); // Continua -> 9 Ejemplo: crear memoria compartida printf("creando Región de memoria compartida...\n"); /* Crea la clave: */ if ((key = ftok("ipc1", 0)) == -1) { perror("error creando clave con ftok"); /* Crear/conectar el segmento de memoria: */ if ((shmid = shmget(key, SHM_SIZE, IPC_CREAT 0644)) == -1) { perror("error creando segmento memoria con shmget"); /* Enlaza (attach) el segmento de memoria para obtener un puntero al mismo: */ data = (int *) shmat(shmid, (void *)0, 0); if (data == (int *)(-1)) { perror("ernor obteniendo el puntero con shmat"); // Continua -> 10 5

printf("creando proceso hijo...\n"); hijo=fork() ; Bifurcación switch(hijo) { case -1: printf("error creando proceso hijo\n"); exit(-1); case 0: /* estamos en el hijo, escribir valores en segmento de memoria */ printf("soy el hijo con PID (escribo en el buffer):%d\n", getpid()); for (i=0;i<10;i++) { sem_wait(sem_1); /* Sección de entrada */ /* Sección Crítica */ data[i]=i; /* Fin de sección Crítica */ sem_post(sem_1); /* Sección de salida */ sleep(2); /* libero semáforos */ sem_close(sem_1); /* Deconecta (detach) el segmento de memoria compartida: */ if (shmdt((char *)data) == -1) { perror("error desconectado segmento de memoria con shmdt"); printf("soy el hijo y termino...\n"); break; // Continua -> 11 default: /*estamos en el padre, leer valores del segmento compartido */ printf("soy el padre con PID (leo del buffer):%d\n", getpid()); /* muestra el contenido del buffer */ for (j=0;j<20;j++) { sem_wait(sem_1); /* Sección de entrada */ /* Sección Crítica: muestra los 10 valores */ for (i=0;i<10;i++) printf("%3d ",data[i]); printf("\n"); /* Fin de sección Crítica */ sem_post(sem_1); /* Sección de salida */ sleep(1); /* libero semáforos */ sem_close(sem_1); /* Desconecta (detach) el segmento de memoria compartida: */ if (shmdt((char *)data) == -1) { perror("error desconectado segmento de memoria con shmdt"); // Continua -> 12 6

Ejemplo: eliminar memoria compartida printf("soy el padre espero que termine el hijo...\n"); wait(0); /* Esperar que acabe el hijo */ printf("soy el padre destruyo los semáforos/memoria compartida y termino\n"); /* destruyo semaforos (solo el padre) */ sem_unlink("/sem_1"); exit(0); /* elimino segmento de memoria compartida */ if (shmctl(shmid, IPC_RMID, NULL) == -1) { perror("error eliminando segmento de memoria con shmctl"); 13 Ejemplo: memoria compartida 14 7

Comunicación por Paso de Mensajes Permite a los procesos intercambiar mensajes mediante colas (Messages Queues) (el descriptor es un entero) Las operaciones básicas de comunicación las proporciona el SO: send (destino, mensaje) receive (origen, mensaje) Cabeceras: Funciones (IPC): #include <sys/types.h> #include <sys/ipc.h> #include <sys/msg.h> key_t ftok(const char *path, int id); int msgget (key_t key, size_t size, int msqflg); int msgctl (int msqid, int cmd, struct msqid_ds *buf); int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg); int msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg); 15 Colas de mensajes POSIX POSIX implementa una especificación más potente de las colas de mensajes Cabecera: Funciones POSIX: #include <mqueue.h> mqd_t mq_open (const char *name, int oflag); mqd_t mq_open (const char *name, int oflag, unsigned long mode, mq_attr attr ); int mq_close (mqd_t mqdes); int mq_unlink (const char *name); int mq_send (mqd_t mqdes, const char *msg_ptr, size_t msg_len, unsigned int msg_prio); ssize_t mq_receive (mqd_t mqdes, char *msg_ptr, size_t msg_len, unsigned int *msg_prio); int mq_notify (mqd_t mqdes, const struct sigevent *notification); int mq_setattr (mqd_t mqdes, const struct mq_attr *mqstat, struct mq_attr* omqstat); 16 8

Características del enlace Capacidad del enlace: capacidad de almacenamiento de mensajes en el canal (nº de mensajes que pueden permanecer en el puerto sin ser leídos) Capacidad cero comunicación síncrona La comunicación sólo se lleva a cabo cuando emisor y receptor han invocado send y receive respectivamente. Los procesos se sincronizan mediante el modelo Rendez-vous o cita (el primero que llega se bloquea) P1 P2 P1 P2 send Susp. Susp. recv recv send 17 Características del enlace (VI) Capacidad n>0 comunicación asíncrona (n finito) Una operación receive de un canal vacío suspende al proceso invocante Una operación send de un canal lleno puede: Suspender al proceso invocante Perder el mensaje Devolver un mensaje de error Para notificar la lectura de de un mensaje y así simular un sistema síncrono se usan mensajes de reconocimiento ACK P send(q, mensaje) receive(q,ack) Q receive(p,mensaje) send(p,ack) 18 9

Características del enlace (VII) En enlaces de capacidad limitada, cuando los productores son muy rápidos es posible desbordar la capacidad del enlace y es necesario utilizar un protocolo de control de flujo para reducir la velocidad de los productores En comunicaciones asíncronas no se garantiza el orden correcto de los mensajes recibidos y es necesario adoptar un protocolo (timestamps) para asegurar el orden 19 10