Sincronizacion entre procesos de linux
COMUNICACIÓN Y SINCRONIZACIÓN ENTRE PROCESOS EN LINUX Los medios de comunicación entre procesos (Inter-Process Communication o IPC) de Linux proporcionan un método para que múltiples procesos se comuniquen unos con otros. Hay varios métodos de IPC disponibles en Linux: o Pipes UNIX Half-duplex o FIFOs (pipes con nombre)o Colas de mensajes estilo SYSTEM V o Semáforos estilo SYSTEM V o Segmentos de memoria compartida estilo SYSTEM V
Pipes UNIX Semi-duplex La forma más simple de IPC en Linux son los pipes o tuberías, han estado presentes desde los primeros orígenes del sistema operativo UNIX y proporcionan un método de comunicaciones en un sentido (unidirecional, semiduplex) entre procesos. Una tubería (pipe) essimplemente un método de conexión que une la salida estándar de un proceso a la entrada estándar de otro. Para esto se utilizan “descriptores de archivos” reservados, los cuales en forma general son: • • • 0: entrada estándar (stdin). 1: salida estándar (stdout). 2: salida de error (stderr).
Este mecanismo es ampliamente usado, incluso en la línea de comandos UNIX (en la shell):
ls | sort |lp
Lo anterior es un ejemplo de “pipeline”, donde se toma la salida de un comando ls como entrada de un comando sort, quien a su vez entrega su salida a la entrada de lp. Los datos corren por la tubería semi-duplex, viajando (virtualmente) de izquierda a derecha por la tubería. Cuando un proceso crea una tubería, el kernel instala dos descriptores de archivos para que los use la tubería. Undescriptor se usa para permitir un camino de entrada a la tubería (write), mientras que la otra se usa para obtener los datos de la tubería (read). A estas alturas, la tubería tiene un pequeño uso practico, ya que la creación del proceso solo usa la tubería para comunicarse consigo mismo. Se podría considerar esta representación de un proceso y del kernel después de que se haya creado una tubería: inProceso out Kernel
Del diagrama anterior, es fácil ver como se conectan los descriptores. Si el proceso envía datos por la tubería (fd0), tiene la habilidad obtener (leer) esa información de fd1. Sin embargo, hay un objetivo más amplio sobre el esquema anterior. Mientras una tubería conecta inicialmente un proceso a si mismo, los datos que viajan por la tubería se mueven por el kernel.
1Sistema Operativo – Comunicación y Sincronización entre procesos en Linux
A estas alturas, la tubería es bastante inútil. ¿Para que crear una tubería si solo estamos hablando con nosotros mismos? Ahora, el proceso de creación bifurca un proceso hijo. Como un proceso hijo hereda cualquier descriptor de archivo abierto del padre, ahora tenemos la base para la comunicación multiprocesos (entrepadre e hijo). La versión actualizada del esquema simple quedaría como:
in Proceso Padre out Kernel
in Proceso Hijo out
Arriba, se ve que ambos procesos ahora tienen acceso al descriptor del archivo que constituye la tubería. En ésta fase se debe tomar una decisión critica. ¿En que dirección se quiere que viajen los datos? ¿El proceso hijo envía información al padre, o viceversa? Se debeproceder a "cerrar" el extremo de la tubería que no interesa. Suponiendo que el hijo ejecuta su código, y devuelve información por la tubería al padre. El esquema ya revisado aparecería como:
in Proceso Padre out Kernel
in Proceso Hijo out
Ahora la construcción de la tubería esta completa. Lo único que queda por hacer es usar la tubería. Para acceder a una tubería directamente, se puedeusar la misma llamada al sistema que se usa para un archivo E/S de bajo nivel. Para enviarle datos a la tubería, se usa la llamada al sistema write(), y para recuperar datos de la tubería, se usa la llamada al sistema read(). Se debe tener presente que ciertas llamadas al sistema, como por ejemplo lseek(), no trabaja con descriptores a tuberías. Creación de tuberías en C Para crear una tubería...
Regístrate para leer el documento completo.