42
Mecanismos IPC System V en Linux 2013/04 Dani Gutiérrez Porset profesor asociado de Ing. de Comunicaciones Eman ta zabal zazu

Mecanismos IPC system V en Linux

Embed Size (px)

Citation preview

Page 1: Mecanismos IPC system V en Linux

Mecanismos IPC System Ven Linux

2013/04

Dani Gutiérrez Porsetprofesor asociado

de Ing. de Comunicaciones

Eman ta zabal zazu

Page 2: Mecanismos IPC system V en Linux

2 2Mecanismos IPC System V en Linux

Fuentes y Referencias● man

● Wikipedia

● Fuentes del kernel

● http://www.advancedlinuxprogramming.com/

Page 3: Mecanismos IPC system V en Linux

3 3Mecanismos IPC System V en Linux

Licencia, Agradecimientos y Herramientas

● Agradecimientos a todas las personas que han participado en los proyectos GNU y Linux. Gracias a la compartición libre de ese conocimiento es que esta presentación existe.

● Úsala, cópiala, difúndela, mejórala según los términos de la licencia: CC BY-SA 3.0 EShttp://creativecommons.org/licenses/by-sa/3.0/es/

● Esta presentación ha sido realizada íntegramente con KDE, LibreOffice y Chromium

Page 4: Mecanismos IPC system V en Linux

4 4Mecanismos IPC System V en Linux

Índice

● Tipos de Mecanismos IPC. IPC System V vs POSIX● Usos● Aspectos comunes a los tres tipos● Memoria compartida● Semáforos● Colas de mensajes● Interfaces de consola y procfs

Page 5: Mecanismos IPC system V en Linux

5 5Mecanismos IPC System V en Linux

Tipos de mecanismos IPC● System V (desde la versión

SVR1, 1983) y POSIX:

– Memoria compartida

– Semáforos

– Colas de mensajes

● Otros mecanismos (entre una o más máquinas):– Señales– Sockets– Pipes y Named pipes– Memoria mapeada a fichero– (Ficheros)– Otros: RPC, RMI, Corba,

D-Bus, Web services,...

Page 6: Mecanismos IPC system V en Linux

6 6Mecanismos IPC System V en Linux

Usos

● Memoria compartida: intercambio rápido de datos entre procesos, sin sincronización.

● Semáforos: elementos para sincronizar procesos, que se basan en aumentar o decrementar su valor de forma atómica (no puede haber más de un proceso a la vez haciendo estas operaciones).

● Colas de mensajes: utilidad para intercambio de mensajes entre procesos de una máquina. También empleadas para sincronizar procesos.

Page 7: Mecanismos IPC system V en Linux

7 7Mecanismos IPC System V en Linux

IPC System V vs POSIX

● Diferencias:– Interfaces C distintos pero semejantes. No

confundir las funciones System V con las de POSIX.– System V más ampliamente implementada.– POSIX más moderna (y mejor).

● Más información en:– man 7 svipc– http://www.linuxdevcenter.com/pub/a/linux/2007/05/24/semaphores-in-linux.html?page=4

Page 8: Mecanismos IPC system V en Linux

8 8Mecanismos IPC System V en Linux

2

3

1

Aspectos comunes a los tres tipos:Ciclo de uso

Creación Acceso

shmConexión /

Desconexión

semIncrem. /Decrem.

msgEnvío /

Recepción

Borrado

Otrasoperaciones

Page 9: Mecanismos IPC system V en Linux

9 9Mecanismos IPC System V en Linux

Aspectos comunes a los tres tipos:Creación de un recurso

● Se usa una función de la forma XXXget (shmget, semget, msgget) con el parámetro IPC_CREAT.

● En la misma, hay dos posibilidades para la creación de un recurso IPC:– Usar una clave que se crea con ftok (3) a partir del nombre de un fichero accesible y

de un número de 8 bits. Puede haber colisiones.– No usar una clave sino un parámetro IPC_PRIVATE. Internamente la clave es 0 pero a

este valor le corresponderán uno o más recursos.● Otros comentarios sobre la función XXXget:

– Establece los permisos de lectura y escritura (los de ejecución no se usan) para el usuario que la ha abierto, el grupo y otros.

– También se emplea para obtener información de un recurso existente.● Es importante borrar un recurso tras su uso.

Page 10: Mecanismos IPC system V en Linux

10 10Mecanismos IPC System V en Linux

Aspectos comunes a los tres tipos:Operaciones de control

● Se emplea una función con nombre de la forma XXXctl (shmctl, semctl, msgctl).

● Las operaciones comunes a los tres tipos son:– IPC_STAT: obtener información del recurso.– IPC_SET: establecer información de usuario, grupo y permisos asociados. – IPC_RMID: eliminar el recurso. Es inmediato para colas de mensajes y

semáforos. Para memoria compartida, se borra cuando el último proceso se desconecte de la zona a borrar.

– IPC_INFO: límites del sistema para el recurso concreto.

Page 11: Mecanismos IPC system V en Linux

11 11Mecanismos IPC System V en Linux

Aspectos comunes a los tres tipos:Capacidades

● CAP_IPC_OWNER: no considerar las comprobaciones de permisos.

● CAP_SYS_ADMIN: realizar operaciones IPC_SET y IPC_RMID sobre objetos IPC.

Page 12: Mecanismos IPC system V en Linux

12 12Mecanismos IPC System V en Linux

Aspectos comunes a los tres tipos:Bloqueos

● Se gestionan esperas de procesos mediante llamadas bloqueantes en los casos de semáforos y de colas de mensajes. No para memoria compartida.

● Dichas llamadas también pueden realizarse de modo que no haya espera (IPC_NOWAIT).

Page 13: Mecanismos IPC system V en Linux

13 13Mecanismos IPC System V en Linux

Aspectos comunes a los tres tipos:Permisos

● Se controlan los permisos de lectura y escritura (para el usuario, grupo, otros) en las distintas operaciones.

● Dichos permisos se especifican en la creación, pero también pueden modificarse después.

● Hay una estructura de C llamada ipc_perm (ver fichero ipc.h) que gestiona:– La clave para crear el recurso.– Los identificadores del usuario y el grupo propietario y creador– Los permisos de lectura y escritura para usuario, grupo y otros

Page 14: Mecanismos IPC system V en Linux

14 14Mecanismos IPC System V en Linux

Aspectos comunes a los tres tipos:Límites del sistema

● Existen límites del sistema para los tres tipos de recursos.

● Son accesibles (y en algún caso modificables) mediante las distintas interfaces:– C: shmctl, msgctl, semctl– Terminal: ipcs– procfs

Page 15: Mecanismos IPC system V en Linux

15 15Mecanismos IPC System V en Linux

Aspectos comunes a los tres tipos:Ficheros include

● En Linux sólo se requiere el correspondiente al recurso a emplear: <sys/shm.h>, <sys/msg.h>, <sys/sem.h>

● Para mejorar la portabilidad incluir también <sys/types.h> y <sys/ipc.h>

Page 16: Mecanismos IPC system V en Linux

16 16Mecanismos IPC System V en Linux

Memoria compartida:Conceptos

● Es una zona de la memoria a la que varios procesos pueden conectarse, pudiendo acceder por tanto a la misma información a nivel de lectura y/o escritura.

● De los tres tipos de mecanismos IPC es el más usado.● Es un mecanismo rápido para intercambio de datos.● Puede requerir de otro mecanismo para sincronizar (semáforos o colas de

mensajes).● Dentro de cada zona compartida cada proceso no va ver la misma dirección

absoluta que ven los demás, por lo que hay que emplear punteros relativos. ● Tras un fork el hijo hereda las zonas en uso, en un exec no, y en un exit se

desconectan.

Page 17: Mecanismos IPC system V en Linux

17 17Mecanismos IPC System V en Linux

Memoria compartida:Datos en C

● Cada zona de memoria compartida tiene:– Un número identificador.– Una estructura de C shmid_ds que contiene:

● Tamaño en bytes.● Número de processos actualmente usando esa zona de memoria.● PIDs del creador y del último en hacer shmat o shmdt.● Una estructura ipc_perm.● Tiempos de la última conexión y desconexión y la última

modificación sobre algún miembro de esta estructura.

Page 18: Mecanismos IPC system V en Linux

18 18Mecanismos IPC System V en Linux

Memoria compartida:Funciones C: shmget (2)

int shmget(key_t key, size_t size, int shmflg);

● Doble uso:● Reserva una zona de memoria de un tamaño concreto, inicializando el contenido

a 0 y la estructura shmid_ds (permisos,...).● Obtiene el identificador de una zona existente asociada con una clave.

● A partir de una clave (para crearlo sin necesidad de clave, usar IPC_PRIVATE).

● Ej: mem_id = shmget(clave, tam, IPC_CREAT|0666);

Page 19: Mecanismos IPC system V en Linux

19 19Mecanismos IPC System V en Linux

Memoria compartida:Funciones C: shmctl (2)

int shmctl(int shmid, int cmd, struct shmid_ds *buf);

● Realiza operaciones de control:● Leer o escribir el valor de shmid_ds.● Bloquear y desbloquear una zona para que no se haga swap de la misma.● Marcar la zona para ser destruida (lo será cuando se desconecte de la misma el

último proceso).

– Otra operación es obtener información del sistema sobre memoria compartida.

● Ej: shmctl(mem_id, IPC_RMID, NULL);

Page 20: Mecanismos IPC system V en Linux

20 20Mecanismos IPC System V en Linux

Memoria compartida:Funciones C: shmat (2), shmdt (2)

void *shmat(int shmid, const void *shmaddr, int shmflg);

int shmdt(const void *shmaddr);

● Se conecta o desconecta una zona de memoria a un proceso. En el segundo caso, el proceso no puede seguir accediendo a esa zona.

● Ejs:ptr = shmat(mem_id, NULL, SHM_RDONLY);resultado = shmdt(mem_id);

Page 21: Mecanismos IPC system V en Linux

21 21Mecanismos IPC System V en Linux

Memoria compartida:Otras funciones C de POSIX

● man 7 shm_overview

● shm_open (3), close (3)● mmap (3), munmap (3), mprotect (3)● shm_unlink (3)● fstat (3), fchown (3), fchmod (3), ftruncate (3)

Page 22: Mecanismos IPC system V en Linux

22 22Mecanismos IPC System V en Linux

Memoria compartida:Límites del sistema

● Máximo nº de segmentos: /proc/sys/kernel/shmmni

● Máximo nº de páginas: /proc/sys/kernel/shmall● Máximo tamaño de la memoria compartida● Tamaño máximo de segmento: /proc/sys/kernel/shmmax

Page 23: Mecanismos IPC system V en Linux

23 23Mecanismos IPC System V en Linux

Semáforos:Conceptos

● Posibilita sincronizar el acceso a un recurso desde varios procesos o threads.

● Tiene un valor numérico (entero) que se puede incrementar o decrementar, pero nunca puede ser menor que cero.

● Los semáforos en System V (y en POSIX) se agrupan en conjuntos o sets.

Page 24: Mecanismos IPC system V en Linux

24 24Mecanismos IPC System V en Linux

Semáforos:Bloqueos

● Se bloquea si en semop:– Se espera a 0. Se desbloquea si llega a cero.– Se intenta decrementar y llega a menos de cero. Se

desbloquea si es posible decrementarlo en la cantidad indicada.

– También en ambos casos se desbloquea:● Si el semáforo se borra del sistema.● Si el proceso recibe una señal.● Si hay un timeout habiendo usado semtimedop

Page 25: Mecanismos IPC system V en Linux

25 25Mecanismos IPC System V en Linux

Semáforos:Datos en C

● Cada grupo de semáforos tiene:– Un número identificador.– Una estructura de C semid_ds que contiene:

● El nº de semáforos en el grupo (los semáforos se numeran con 0, 1,...).

● Una estructura ipc_perm.● Tiempos de la última operación y la última modificación

sobre algún miembro de est a estructura.

Page 26: Mecanismos IPC system V en Linux

26 26Mecanismos IPC System V en Linux

Semáforos:Datos en C

● Cada semáforo tiene una estructura C sem que contiene:– El valor del semáforo.– El nº de procesos esperando para que su valor sea 0.– El nº de procesos esperando para que su valor se

incremente.– El PID que hizo la última operación.

Page 27: Mecanismos IPC system V en Linux

27 27Mecanismos IPC System V en Linux

Semáforos:Funciones C: semget (2)

int semget(key_t key, int nsems, int shmflg);

● Doble uso:– Crea un nuevo set de N semáforos, inicializando la estructura semid_ds (permisos,...).

– Obtiene el identificador de un set existente asociado con una clave.

● A partir de una clave (para crearlo sin necesidad de clave, usar IPC_PRIVATE).

● Ej: mq_id = semget(clave, 3, IPC_CREAT|0666);

Page 28: Mecanismos IPC system V en Linux

28 28Mecanismos IPC System V en Linux

Semáforos:Funciones C: semctl (2)

int semctl(int semid, int semnum, int cmd, ...);● Realiza operaciones de control:

– Sobre uno o todos los semáforos de un set: leer o escribir valores.– Sobre un solo semáforo: leer el último proceso que ha operado sobre el mismo, el nº de

procesos que están a la espera de que su valor sea 0 o de que se incremente.– Sobre un set: Leer o escribir el valor de semid_ds para un set, y borrar un set.

● Otra operación es obtener información del sistema sobre semáforos.● Ej: semctl(sem_id, 2, SETVAL, valor);

Page 29: Mecanismos IPC system V en Linux

29 29Mecanismos IPC System V en Linux

Semáforos:Funciones C: semop (2), semtimedop (2)

int semop(int semid, struct sembuf *sops, unsigned nsops);

int semtimedop(int semid, struct sembuf *sops, unsigned nsops, struct timespec *timeout);

● Realiza de forma atómica una operación sobre uno más semáforos (usando la estructura sembuf) de un set.– Las operaciones pueden ser:

● Añadir un valor a un semáforo● Restar un valor a un semáforo. Si el resultado es menor que cero, el proceso queda en espera a que sea al

menos cero (vuelve también si se borra, o hay una señal o un timeout)● Esperar a que el semáforo valga cero (idem espera y vuelta)

– Para cada operación se puede indicar si se espera en la llamada, y si al finalizar el proceso se restaura el valor anterior del semáforo.

● Ej.resultado = semop(sem_id, buffer, 4);

Page 30: Mecanismos IPC system V en Linux

30 30Mecanismos IPC System V en Linux

Semáforos:Otras funciones C de POSIX

● man 7 sem_overview

● sem_open (3), sem_init (3)● sem_wait (3), sem_trywait (3), sem_timedwait (3)● sem_post (3)● sem_getvalue (3)● sem_close (3), sem_unlink (3), sem_destroy (3)

Page 31: Mecanismos IPC system V en Linux

31 31Mecanismos IPC System V en Linux

Semáforos:Límites del sistema

● Máximo nº de semáforos: /proc/sys/kernel/sem● Máximo nº de sets de semáforos: /proc/sys/kernel/sem● Máximo nº de semáforos por set: /proc/sys/kernel/sem● Valor máximo de semáforo● Máximo nº de operaciones en cada llamada a semop: /proc/sys/kernel/sem

Page 32: Mecanismos IPC system V en Linux

32 32Mecanismos IPC System V en Linux

Colas de mensajes:Conceptos

● Es un mecanismo para intercambiar mensajes de un proceso a otro, ambos en la misma máquina.

● Son colas cola FIFO.● Además, en lectura ofrece prioridades según el tipo de cada mensaje,

que es un valor > 0. El tipo con prioridad más alta es 1, luego 2,...● Cada cola tiene un tamaño máximo (en bytes, no en mensajes).● Las funciones de lectura o escritura operan sólo con un único mensaje

en cada llamada.

Page 33: Mecanismos IPC system V en Linux

33 33Mecanismos IPC System V en Linux

Colas de mensajes:Bloqueos

● Cuando se envía un mensaje, hay bloqueo si no hay sitio en la cola. Se desbloquea:– Cuando haya espacio.– Si el proceso recibe una señal.

● Cuando se lee un mensaje, hay bloqueo si no lo hay del tipo solicitado. Se desbloquea:– Si llega el del tipo solicitado.– Si la cola se borra del sistema.– Si el proceso recibe una señal.

Page 34: Mecanismos IPC system V en Linux

34 34Mecanismos IPC System V en Linux

Colas de mensajes:Datos en C

● Cada cola tiene:– Un número identificador.– Una estructura en C msgid_ds que contiene:

● El nº actual de mensajes en la cola.● El tamaño máximo de la cola en bytes.● PIDs del último proceso que ha enviado un mensaje, y que ha recibido

un mensaje.● Una estructura ipc_perm.● Tiempos de la última operación y la última modificación sobre algún

miembro de esta estructura.

Page 35: Mecanismos IPC system V en Linux

35 35Mecanismos IPC System V en Linux

Colas de mensajes:Datos en C

● Cada mensaje tiene una estructura en C msgbuf que contiene:– El tipo o prioridad del mensaje (numero > 0).– El tamaño que ocupa en bytes.

Page 36: Mecanismos IPC system V en Linux

36 36Mecanismos IPC System V en Linux

Colas de mensajes:Funciones C: msgget (2)

int msgget(key_t key, int shmflg);

● Doble uso:– Crea una cola, inicializando la estructura msqid_ds (permisos,...).– Obtiene el identificador de una cola existente asociada con una

clave.● A partir de una clave (para crearlo sin necesidad de clave,

usar IPC_PRIVATE).● Ej: mq_id = msgget(clave, IPC_CREAT|0666);

Page 37: Mecanismos IPC system V en Linux

37 37Mecanismos IPC System V en Linux

Colas de mensajes:Funciones C: msgctl (2)

int msgctl(int msqid, int cmd, struct msqid_ds *buf);

● Realiza operaciones de control:● Leer o escribir el valor de msqid_ds.● Borrar una cola, avisando a los procesos en espera para

leer o escribir.

– Otra operación es obtener información del sistema sobre colas.

● Ej: msgctl(mq_id, IPC_RMID, NULL);

Page 38: Mecanismos IPC system V en Linux

38 38Mecanismos IPC System V en Linux

Colas de mensajes:Funciones C: msgsnd (2), msgrcv (2)

● int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);● ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg);

● Envía o recibe un sólo mensaje, para el que se indica el tamaño (se permiten tamaños 0). Para el caso de recepción hay 3 posibilidades:– Se lee cualquier mensaje.– Se lee un mensaje con un tipo igual a o distinto a un valor concreto.– Se lee el mensaje de menor valor para el tipo, que sea igual o menor que un valor dado.

● Ej.resultado = msgsnd(mq_id, buffer, tam, IPC_NOWAIT);resultado = msgrcv(mq_id, buffer, tam, -3, 0); /* prioridades 1, 2, 3 */

Page 39: Mecanismos IPC system V en Linux

39 39Mecanismos IPC System V en Linux

Colas de mensajes:Otras funciones C de POSIX

● man 7 mq_overview● mq_open(3), mq_open(2)● mq_close(3), close(2)● mq_getattr(3), mq_getsetattr(2)● mq_setattr(3), mq_getsetattr(2)● mq_send(3), mq_timedsend(2)● mq_receive(3), mq_timedreceive(2)● mq_timedsend(3), mq_timedsend(2)● mq_timedreceive(3), mq_timedreceive(2)● mq_unlink(3), mq_unlink(2)● mq_notify(3), mq_notify(2)

Page 40: Mecanismos IPC system V en Linux

40 40Mecanismos IPC System V en Linux

Colas de mensajes:Límites del sistema

● Máximo nº de colas● Tamaño máximo de mensaje: /proc/sys/kernel/msgmax

● Tamaño máximo de cola

Page 41: Mecanismos IPC system V en Linux

41 41Mecanismos IPC System V en Linux

Interface de consola

● ipcs (1): proporciona información sobre un recurso IPC, sobre todos los usados, o acerca de límites del sistema.

● ipcmk (1): crea recursos y les asigna permisos.● ipcrm (1): borra uno o más recursos (para una zona de

memoria, no se borra hasta que lo hace el último proceso que la usaba). Se pueden especificar por identificadores de cada recurso o por claves de ftok.

Nota: estos comandos no funcionan con mecanismos IPC de POSIX. Para éstos emplear otros ej. /dev/shm/*

Page 42: Mecanismos IPC system V en Linux

42 42Mecanismos IPC System V en Linux

Interface procfs del kernel● Algunas entradas son de sólo lectura y otras permiten modificar límites.● Ver distintos apartados de “Límites del sistema”● Otros ficheros:

– /proc/sysipc/mem

– /proc/sysipc/msg

– /proc/sysipc/sem

● Se pueden configurar parámetros mediante:– /etc/sysctl.conf

– /etc/sysctl.d/*

● Más información en man 5 proc