Sunteți pe pagina 1din 4

1

Tarea 1 Unidad 3 S.O. Mecanismo IPC del UNIX System V (Memoria Compartida)
Perz Popomey Ral rawl.p@hotmail.com

ResumenEl siguiente trabajo describe la creacion de un espacio de memoria compartida, para poder escribir datos de un proceso a otro a traves de la memoria compartida.

Para trabajar con memoria compartida es necesario crear un vnculo (attachment) entre la memoria local del proceso y el segmento compartido. El proceso que vincula un segmento de memoria compartida cree estar trabajando con ella como si fuera cierta rea de memoria local.[2]

I.

INTRODUCCION

Los procesos se comunican con otros procesos y con el ncleo para coordinar sus actividades. Linux soporta un nmero de mecanismos de comunicacin entre procesos (IPC). La memoria compartida es una de ellos pero Linux tambin soporta el llamado mecanismo System V por la versin Unix en la que apareci por primera vez. El paquete de comunicacin entre procesos (IPC) del UNIX System V se compone de tres mecanismos: Semforos, para sincronizar procesos, Memoria compartida, para compartir el espacio de direcciones virtuales de los procesos, Colas de mensaje, para intercambiar datos con un formato determinado entre procesos. Cada IPC posee un identicador nico, al crear un IPC es necesario especicar una clave de tipo key_t, que el ncleo usa para generar el identicador del IPC (key_t es un entero). Diferentes llamadas a la funcin de creacin de un IPC con la misma clave devuelven el mismo identicador, lo que permite compartir un IPC entre procesos.

II-B.

Procesos

La ms simple denicin de un proceso podra ser que es una instancia de un programa en ejecucin (corriendo). A los procesos frecuentemente se les reere como tareas. El contexto de un programa que esta en ejecucin es lo que se llama un proceso. Este contexto puede ser mas procesos hijos que se hayan generado del principal (proceso padre), los recursos del sistema que este consumiendo, sus atributos de seguridad (tales como su propietario y permisos de archivos asi como roles y dems de SELinux), etc. Linux, como se sabe, es un sistema operativo multitarea y multiusuario. Esto quiere decir que mltiples procesos pueden operar simultneamente sin interferirse unos con los otros. Cada proceso tiene la "ilusin" que es el nico proceso en el sistema y que tiene acceso exclusivo a todos los servicios del sistema operativo. Programas y procesos son entidades distintas. En un sistema operativo multitarea, mltiples instancias de un programa pueden ejecutarse sumultneamente. Cada instancia es un proceso separado. Por ejemplo, si cinco usuarios desde equipos diferentes, ejecutan el mismo programa al mismo tiempo, habra cinco instancias del mismo programa, es decir, cinco procesos distintos. Cada proceso que se inicia es referenciado con un nmero de identicacin nico conocido como Process ID PID, que es siempre un entero positivo. Prcticamente todo lo que se est ejecutando en el sistema en cualquier momento es un proceso, incluyendo el shell, el ambiente grco que puede tener mltiples procesos, etc. La excepcin a lo anterior es el kernel en si, el cual es un conjunto de rutinas que residen en memoria y a los cuales los procesos a travs de llamadas al sistema pueden tener acceso. [1]

II. II-A.

FUNDAMENTO

Memoria compartida

La forma ms rpida de comunicar dos procesos es hacer que compartan una zona de memoria.Para enviar datos de un proceso a otro, solo hay que escribir en memoria y automaticamente esos datos estan disponibles para que los lea cualquier proceso. La memoria convencional que puede direccionar un proceso a traves de su espacio de direcciones virtuales es local al mismo, y cualquier intento de acceso desde otro proceso provocar una violacin de segmento. UNIX System V proporciona un sistema de memoria compartida entre varios procesos.

II-C.

Semaforos III-A.

III.

DESARROLLO

A veces es necesario que dos o ms procesos o hilos (threads) accedan a un recurso comn (escribir en un mismo chero, leer la misma zona de memoria, escribir en la misma pantalla, etc). El problema es que si lo hacen simultneamente y de forma incontrolada, pueden "machacar" el uno la operacin del otro (y dejar el chero o la memoria con un contenido inservible o la pantalla ilegible). Para evitar este problema, estn los semforos. Un semforo da acceso al recurso a uno de los procesos y se lo niega a los dems mientras el primero no termine. Los semforos, junto con la memoria compartida y las colas de mensajes, son los recursos compartidos que suministra UNIX para comunicacin entre procesos. El funcionamiento del semforo es como el de una variable contador. Imaginemos que el semforo controla un chero y que inicialmente tiene el valor 1 (est "verde"). Cuando un proceso quiere acceder al chero, primero debe decrementar el semforo. El contador queda a 0 y como no es negativo, deja que el proceso siga su ejecucin y, por tanto, acceda al chero. Ahora un segundo proceso lo intenta y para ello tambin decrementa el contador. Esta vez el contador se pone a -1 y como es negativo, el semforo se encarga de que el proceso quede "bloqueado" y "dormido" en una cola de espera. Este segundo proceso no continuar por tanto su ejecucin y no acceder al chero. Supongamos ahora que el primer proceso termina de escribir el chero. Al acabar con el chero debe incrementar el contador del semforo. Al hacerlo, este contador se pone a 0. Como no es negativo, el semforo se encarga de mirar el la cola de procesos pendientes y "desbloquear" al primer proceso de dicha cola. Con ello, el segundo proceso que quera acceder al chero continua su ejecucin y accede al chero. Cuando este proceso tambin termine con el chero, incrementa el contador y el semforo vuelve a ponerse a 1, a estar "verde". Es posible hacer que el valor inicial del semforo sea, por ejemplo, 3, con lo que pasarn los tres primeros procesos que lo intenten. Pueden a su vez quedar muchos procesos encolados simultneamente, con lo que el contador quedar con un valor negativo grande. Cada vez que un proceso incremente el contador (libere el recurso comn), el primer proceso encolado despertar. Los dems seguirn dormidos. Como vemos, el proceso de los semforos requiere colaboracin de los procesos. Un proceso debe decrementar el contador antes de acceder al chero e incrementarlo cuando termine. Si los procesos no siguen este "protocolo" (y pueden no hacerlo), el semforo no sirve de nada. [3]

Peticion de memora compartida (Shmget)

La funcin shmget permite crear una zona de memoria compartida o habilitar el acceso a una ya creada. Su declaracin es la siguiente: #include <sys/types.h> #include <sys/ipc.h> #include <sys/shm.h> int shmget (clave, tamao, opcin); key_t clave; /* clave del segmento de memoria compartida */ int tamao; /* tamao del segmento de memoria compartida */ int opcin; /* opcin para la creacin */ Si la llamada se ejecuta correctamente, la funcin devolver el identicador asociado a la zona de memoria con el n de poder utilizarla posteriormente. Si por algn motivo falla, la funcin devolver el valor 1. El parmetro clave es la llave de acceso, y tiene el mismo signicado que el parmetro clave en la funcin semget que permite crear o habilitar grupos de semforos. El segundo parmetro, tamao, indica el espacio en bytes de la zona de memoria compartida que se desea crear. Este espacio es jo durante su utilizacin. El ltimo parmetro es una mscara de bits que denir los permisos de acceso a la zona de memoria y el modo de adquirir el identicador de la misma. En denitiva, su signicado es similar al que se vio para la mscara opcin de la citada funcin semget. El identicador del segmento que devuelve esta funcin es heredado por todos los procesos descendientes del que llama a esta funcin. El siguiente trozo de cdigo muestra cmo se crea una zona de memoria de 100 bytes, donde slo el propietario va a tener permiso de lectura y escritura:
int shmid; shmid=shmget(IPC_PRIVATE,100,IPC_CREAT | 0600); if(shmid==-1) { perror("Error no se puede obtener identicador"); exit(-1); }

III-B.

Atarse a la memoria compartida (shmat)

Un proceso, antes de usar un segmento de memoria compartida, tiene que atribuirle una direccin virtual en su espacio de direcciones (mapearlo), con el n de que dicho proceso pueda acceder a l por medio de esta direccin. Esta operacin se conoce como conexin, unin o enganche de un segmento con el proceso. Una vez que el proceso deja de usar el segmento, debe de realizar la operacin inversa (desconexin, desunin o desenganche), dejando de estar accesible el segmento para el proceso. Las llamadas al sistema para realizar estas operaciones son las siguientes: shmat Esta funcin realiza la conexin del segmento al espacio de direccionamiento del proceso. Su declaracin es: char *shmat (shmid, adr, opcion); int shmid; /* identicador del segmento */ char *adr; /* direccin de enlace */ int opcion; /* opcin de conexin */ Shmid es el identicador del segmento, adr es la direccin virtual donde se desea que empiece el segmento (esta direccin puede ser suministrada por el programador o bien elegida por el kernel) y opcion es una mscara de bits que indica la forma de acceso al segmento de memoria. Si el bit SHM_RDONLY est activo, el segmento ser accesisble para leer, pero no para escribir. Si la llamada a esta funcin funciona correctamente, devolver un puntero a la direccin virtual a la que est conectado el segmento. Esta direccin puede coincidir o no con adr, dependiendo de la decisin que tome el kernel. El problema principal que se plantea es el de la eleccin de la direccin, puesto que, no puede entrar en conicto con direcciones ya utilizadas, o que impida el aumento del tamao de la zona de datos y el de la pila. Por ello, si se desea asegurar la portabilidad de la aplicacin es recomendable dejar al kernel la eleccin de comienzo del segmento, para ello basta con pasarle un puntero NULL como segundo parmetro (valor entero 0). Si por algn motivo falla la llamada a esta funcin, devolver 1. El siguiente troza de codigo muestra como atarse a la memoria compartida:
int *Memoria = NULL; Memoria = (int *)shmat (shmid, (char *)0, 0); if (Memoria == NULL) { printf("No consigo memoria compartida"); exit (0); }

El siguiente cdigo muestra como se puede crear un segmento de memoria compartida utilizando procesos controlados mediante semaforos:
#include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <sys/ipc.h> #include <sys/sem.h> #include <sys/shm.h> #dene SEM_HIJO 0 #dene SEM_PADRE 1 void main(int argc,char** argv) { int shmid; int *Memoria = NULL; shmid=shmget(IPC_PRIVATE,100,IPC_CREAT | 0600); if(shmid==-1) { perror("Error no se puede obtener identicador"); exit(-1); } Memoria = (int *)shmat (shmid, (char *)0, 0); if (Memoria == NULL) { printf("No consigo memoria compartida"); exit (0); } int i,j,x, semid,pid; struct sembuf operacion; key_t llave; int padre; llave=ftok (argv[0],K); if ((semid=semget (llave,2,IPC_CREAT | 0600))==-1) { perror("semget"); exit(-1); } semctl(semid,SEM_HIJO,SETVAL,0); semctl(semid,SEM_PADRE,SETVAL,1); if ((pid=fork()) == -1) { perror("fork"); exit(-1); } else if (pid==0) { for (i=0; i<10; i++) { operacion.sem_num=SEM_HIJO;

operacion.sem_op=-1; operacion.sem_g=0; semop(semid,&operacion,1); x=Memoria[i]; printf("Proceso hijo lee: %d\n",x); operacion.sem_num=SEM_PADRE; operacion.sem_op=1; semop(semid,&operacion,1); } exit(0); semctl(semid,0,IPC_RMID,0); } else { operacion.sem_g=0; for (j=0; j<10; j++) { operacion.sem_num=SEM_PADRE; operacion.sem_op=-1; semop(semid,&operacion,1); Memoria[j]=j; printf("Proceso padre escribe: %d\n",j); operacion.sem_num=SEM_HIJO; operacion.sem_op=1; semop(semid,&operacion,1); } wait(&padre); exit(0); semctl(semid,0,IPC_RMID,0); } shmdt ((char *)Memoria); shmctl (shmid, IPC_RMID, (struct shmid_ds *)NULL); }

V.

CONCLUSION

La forma ms ecaz que tienen los procesos para comunicarse consiste en compartir una zona de memoria, tal que para enviar datos de un proceso a otro, slo se ha de escribir en dicha memoria y automticamente estos datos estarn disponibles para cualquier otro proceso. La utilizacin de este espacio de memoria comn evita la duplicacin de datos y el lento trasvase de informacin entre los procesos. R EFERENCIAS
[1] Sergio Gonzlez Durn, Manual basico de administracion de procesos en linux, [en linea], 2005, [citado 02-03-2012], Disponible en: http://www.linuxtotal.com.mx/index.php?cont=info_admon_012 [2] MARQUEZ FRANCISCO M.UNIX PROGRAMACION AVANZADA.Edicin Nmero 3.Editorial ALFAOMEGA GRUPO EDITOR.2004 [3] Creative Commons, Semforos en C para Linux, 2007, [citado 02-03-2012], Disponible en:http://www.chuidiang.com/clinux/ipcs/semaforo.php

IV.

RESULTADOS

Los resultados obtenidos se muestran en la siguiente gura:

S-ar putea să vă placă și