La llamada a procedimiento remoto (RPC) es una tecnología de comunicación que utiliza un programa para realizar una solicitud a otro programa para utilizar su servicio en una red sin siquiera conocer los detalles de la red.
La comunicación entre procesos en los sistemas distribuidos se realiza mediante el paso de mensajes. Permite el intercambio de mensajes entre los procesos utilizando primitivas para enviar y recibir mensajes. El programador debe comprender el mensaje, así como los nombres de los procesos de origen y destino. El proceso utiliza la primitiva enviar() para enviar mensajes y el proceso utiliza la primitiva recibir() para recibir mensajes.
Mensajes RPC:
En los sistemas distribuidos, la comunicación se realiza entre procesos pasando mensajes de un proceso a otro. El paso de mensajes se encuentra en el nivel más bajo de abstracción, mientras que RPC representa una mayor abstracción. Debido al nivel más bajo de abstracción, requiere que el programador de aplicaciones pueda identificar el mensaje, el proceso de origen, el proceso de destino y los tipos de datos probables de los procesos involucrados.
Sintaxis: la sintaxis utilizada en el paso de mensajes para las primitivas enviar() y recibir() es la siguiente:
send (receiver, message) // requires the name of the destination process and the message data as arguments receive(sender, message) // requires the name of the sender process and the message data as arguments
Semántica:
- Con bloqueo/sin bloqueo: un envío de bloqueo() detiene el proceso y espera hasta que se haya enviado el mensaje y se haya vaciado el búfer de mensajes antes de continuar. Una recepción de bloqueo, por otro lado, bloquea en receive() hasta que llega el mensaje. Un envío sin bloqueo devuelve rápidamente el control a la persona que llama. El proceso de transmisión del mensaje se ejecuta entonces en paralelo con la fase de envío.
- Mensajes almacenados en búfer/sin búfer : Unreceive() sin búfer significa que en lugar de usar un búfer de mensajes, el proceso de transmisión envía el mensaje inmediatamente al proceso de recepción. La dirección, receptor, en send() es la dirección del proceso; sin embargo, en envío almacenado en búfer(), la dirección es la dirección del búfer.
- Envío confiable/no confiable: el envío no confiable() transmite un mensaje al destinatario sin esperar que se confirme, y no retransmite automáticamente el mensaje para garantizar la recepción. Un send() fiable garantiza que el mensaje se ha recibido en el momento en que finaliza el send().
- Comunicación Directa/Indirecta: El uso de puertos permite la comunicación indirecta. El transmisor envía mensajes al puerto y el receptor los recibe del puerto. En lugar de enviar el mensaje a un puerto intermedio, el mensaje se envía directamente al proceso, que se identifica específicamente en el envío, recepción en caso de comunicación directa.
- Mensajes de tamaño fijo/variable: el sistema limita el tamaño de los mensajes de tamaño fijo. Los mensajes de tamaño variable son más complejos de construir, pero facilitan la programación; lo contrario es cierto para los mensajes de tamaño fijo.
Tipos de mensajes:
Hay dos tipos de mensajes utilizados en la implementación de RPC:
- Mensajes de llamada
- Mensajes de respuesta
1. Mensajes de llamada:
El cliente envía el mensaje de llamada al servidor para que se pueda ejecutar el procedimiento remoto.
Formato:
- Identificador de Procedimiento Remoto: Este campo contiene la información sobre el procedimiento remoto que se desea ejecutar.
- Argumentos: Los argumentos que se requieren para la ejecución del procedimiento.
- Identificación del Mensaje: Este campo se utiliza para identificar los mensajes que se pierden y duplican a través del número de secuencia.
- Tipo de mensaje: este campo se utiliza para identificar el tipo de mensaje, es decir, si un mensaje pertenece al tipo de mensaje de llamada o al tipo de mensaje de respuesta.
- Identificación del cliente: este campo permite que el servidor identifique al cliente y también autentique el proceso del cliente.
Formato de mensaje de llamada RPC:
Identificador de procedimiento remoto | ||||||
---|---|---|---|---|---|---|
Identificador de mensaje | Tipo de mensaje | Identificador de cliente | Número de programa | Número de versión | Número de procedimiento | Argumentos |
2. Mensajes de respuesta:
El servidor devuelve el resultado de la ejecución del procedimiento remoto al cliente mediante un mensaje de respuesta. Hay dos formas de mensajes de respuesta: mensajes exitosos y mensajes fallidos.
A. Mensaje de respuesta exitosa: si el procedimiento remoto en particular se ejecuta con éxito.
Formato:
Message Identifier Message Type Reply Status (0) - Successful Result
B. Un mensaje fallido: si surge alguna de las siguientes condiciones, el mensaje es de tipo fallido:
- El servidor identifica al escanear el campo de identificación del cliente que el cliente no está autorizado para utilizar el servicio.
- Falta el Identificador.
- Si el servidor no encuentra ningún detalle en los campos de número de programa, número de versión o número de procedimiento.
- Durante la ejecución del procedimiento remoto, se produce una condición de excepción.
- Si el servidor no puede decodificar los argumentos dados.
- El servidor encuentra que el mensaje de llamada no es coherente con él.
Formato:
Message Identifier Message Type Reply Status (1) - Unsuccessful Reason for failure
Búfer de mensajes
El almacenamiento en búfer implica poner en cola el envío o la recepción de mensajes durante la transmisión hacia y desde un proceso a otro. El búfer es el área de almacenamiento temporal que se utiliza para contener el mensaje hasta que el proceso de recepción no esté listo para recibir los mensajes, de modo que pueda recuperarse más adelante. Los siguientes son los mecanismos de almacenamiento en búfer dependiendo de los sistemas síncronos y asíncronos:
1. Sistemas síncronos
Estos sistemas no pueden tener búfer o búfer de un solo mensaje.
Búfer nulo o sin búfer:
En la estrategia sin búfer, no se utiliza ningún almacenamiento temporal para guardar los mensajes. Se utiliza en un modo de comunicación asíncrono. En esta estrategia se utilizan dos enfoques: el mensaje permanecerá en el espacio de direcciones del remitente, es decir, el envío se retrasa hasta que el receptor ejecuta la primitiva recibir() después de completar la recepción actual. Otro, un mensaje será descartado y luego será reenviado después de un cierto período que se establezca.
Búfer de un solo mensaje:
En un mecanismo de búfer de un solo mensaje, se mantiene un búfer para almacenar un solo mensaje en el extremo del receptor. El mensaje se almacenará en búfer solo en ese caso si el receptor no está listo para recibir el mensaje. La ubicación del búfer puede estar en el espacio de direcciones del kernel o en el lado receptor en el espacio de direcciones del proceso del receptor. Se utiliza en un modo síncrono de comunicación.
2. Sistemas Asíncronos:
Estos sistemas pueden tener un búfer de capacidad ilimitada o un mensaje limitado finito (búfer de mensajes múltiples).
Búfer de capacidad ilimitada:
En esta estrategia, el remitente no necesita esperar para enviar mensajes si, en el lado receptor, el receptor no está listo para recibir los mensajes. La Capacidad Ilimitada se refiere a que mantendrá todos los mensajes recibidos del remitente y asegurará que estos serán entregados al receptor. Se utiliza en un modo de comunicación asíncrono.
Búfer de límite finito (Búfer de mensajes múltiples):
En un búfer de límite finito, el mecanismo se usa para manejar el problema del desbordamiento del búfer. Se utiliza en un modo de comunicación asíncrono. El espacio de búfer asignado depende de la implementación. Las siguientes son las dos formas que se pueden usar para manejar este problema de desbordamiento:
- Comunicación fallida: La primitiva enviar() devuelve un mensaje de error al proceso de envío, es decir, la comunicación no tiene éxito porque el mensaje no se entrega al destino previsto. Es menos fiable.
- Comunicación controlada por flujo: aquí se utiliza la estrategia de control de flujo en la que el remitente permanece bloqueado hasta que el receptor comienza a aceptar algunos mensajes para que se cree espacio en el búfer para nuevos mensajes. Esta estrategia descarta el modo de comunicación asíncrono al bloquear al remitente y, por lo tanto, genera interbloqueos inesperados.
La asignación de espacio de búfer depende de la implementación. En el lado receptor, el receptor guarda los mensajes en el buzón que se encuentra en el espacio de direcciones del núcleo o en el lado receptor en el espacio de direcciones del proceso del receptor.
Publicación traducida automáticamente
Artículo escrito por annieahujaweb2020 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA