Comunicación entre procesos
La Comunicación entre procesos, en inglés IPC (Interprocess Communication) es una función básica de los Sistemas operativos. Los procesos pueden comunicarse entre sí a través de compartir espacios de memoria, ya sean variables compartidas o buffers, o a través de las herramientas provistas por las rutinas de IPC. La IPC provee un mecanismo que permite a los procesos comunicarse y sincronizarse entre sí. Normalmente a través de un sistema de mensajes.
Conceptos Básicos
El sistema Operativo provee minimamente dos primitivas, enviar(mensaje) y recibir(mensaje), normalmente llamadas send y receive. Asimismo, debe implementarse un enlace de comunicación entre los procesos de la comunicacion. Este enlace puede ser unidireccional o multidireccional según permita la comunicación en solo uno o en 5 sentidos.
Tipos de comunicación
La comunicación puede ser:
- Directa o Indirecta
- Simétrica o Asimética
- Con uso de buffers explícito o automático
- Envío por copia el mensaje o por referencia
- Mensajes de tamaño fijo o variable
Directa
Las primitivas enviar y recibir explicitan el nombre del proceso con el que se comunican. Ej:
enviar (mensaje, A) envía un mensaje al proceso A
Es decir se debe especificar cual va a ser el proceso fuente y cual va a ser el proceso Destino.
Las operaciones básicas Send y Receive se definen de la siguiente manera: Send (P, mensaje); envía un mensaje al proceso P (P es el proceso destino). Receive (Q, mensaje); espera la recepción de un mensaje por parte del proceso Q (Q es el proceso fuente).
Nota: Receive puede esperar de un proceso cualquiera, un mensaje, pero el Send sí debe especificar a quién va dirigido y cuál es el mensaje.
Indirecta
La comunicación indirecta se implementa mediante puertos, en alguna bibliografía se lo denomina buzones. Para poder comunicarse los procesos deben compartir el puerto. Ej:
enviar (mensaje, 1) envía un mensaje al puerto 1
Simétrica
Todos los procesos pueden enviar o recibir. También llamada bidireccional para el caso de dos procesos.
Asimétrica
Un proceso puede enviar, los demás procesos solo reciben. También llamada unidireccional.
Sincronización entre procesos
En ciertos casos, además de la notificación es necesaria una sincronización al acceso de la memoria entre procesos. Esto es necesario para asegurarnos la coherencia de los datos en memoria, para que un proceso lea datos cuando realmente están disponibles o completos, o un proceso grabe cuando ningún otro lo está haciendo.
Para asegurarnos la sincronización entre procesos, se utilizan las mismas técnicas y objetos que para la sincronización entre hilos (semáforos, eventos, etc.).
Tiempo de ejecución
Se denomina Tiempo de ejecución (Runtime en inglés) al intervalo de tiempo en el que un programa de computadora se ejecuta en un sistema operativo. Este tiempo se inicia con la puesta en memoria principal del programa, por lo que el sistema operativo comienza a ejecutar sus instrucciones. El intervalo finaliza en el momento en que éste envía al sistema operativo la señal de término, sea éste un término normal, en que el programa tuvo la posibilidad de concluir sus instrucciones satisfactoriamente, o un término anormal, en el que el programa produjo algún error y el sistema debió forzar su finalización.
Este término suele emplearse, en oposición a tiempo de compilación, para indicar si una acción o hecho sucede en uno u otro tiempo.
Tiempo de compilación
Se denomina tiempo de compilación (compile-time en inglés) al intervalo de tiempo en el que un compilador compila código escrito en un lenguaje de programación a una forma de código ejecutable por una máquina.
El compilador normalmente realiza un chequeo de sintaxis, que incluye entre otros un chequeo de tipos y ejecución de reglas de ámbito, seguido de un análisis semántico, que se compone de procesos como el enlazado estático, la instanciación de plantillas y la optimización del código generado. El enlazado dinámico se realiza normalmente después del tiempo de compilación, bien en tiempo de ejecución o antes de éste, por medio de un cargador de programas. El chequeo de límites de arrays normalmente no se hace en tiempo de compilación.
Este término suele emplearse, en oposición a tiempo de compilación, para indicar si una acción o hecho sucede en uno u otro tiempo.
El tiempo de compilación no sucede en los lenguajes interpretados debido a que éstos no necesitan compilarse. En dichos lenguajes, ciertas acciones típicas de la compilación como es la comprobación de la sintaxis se realizan antes de comenzar a ejecutar el código, pero no es propiamente una compilación.
|