[Linux] - ventajas y desventajas de comunicación entre procesos

1, la tubería

1.1 tuberías anónimos

Se utiliza principalmente para la comunicación entre procesos, que están relacionados

Echemos un vistazo a una declaración de Linux:

test1 | grep 8080

Si no hubieras llamado Linux, debe saber "|" significa, en realidad se trata de los medios de conducción, su papel es el de entrada de salida de un comando como el comando anterior.

El código anterior es en realidad la salida como grep 8080 test1 introducir este comando, donde "|" es en realidad un tubo en el anonimato, sólo se puede utilizar con un proceso de comunicación parentesco.

Si dos procesos necesitan comunicarse, entonces usted tiene que crear dos tubos. Debido a que esta comunicación es un modo de los siguientes ejemplos se encuentran en las tuberías anónimos:

En el proceso, hemos creado una tubería, el padre cerró el canal de escritura, niño cierra el canal de lectura, el proceso hijo escribe la cadena de la tubería, el proceso padre y leyó la cadena de salida en la tubería.

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#define MAX_LEN 128
int main(void)
{
    /*0为读,1为写*/
    int fd[2] = {0}; //描述符
    pid_t pid = 0;
    char line[MAX_LEN] = {0};
    int n = 0;

    /*创建管道,需要传入两个文件描述符*/
    if(pipe(fd) < 0)
    {
        perror("create pipe failed\n");
        return -1;
    }
    /*fork子进程*/
    if((pid = fork()) < 0)
    {
        perror("fork failed\n");
        return -1;
    }
    /*父进程*/
    else if(pid > 0)
    {
        /*关闭管道的写描述符*/
        close(fd[1]);

        /*从管道读取数据*/
        n = read(fd[0],line,MAX_LEN);
        printf("read %d bytes from pipe :%s\n",n,line);

    }
    /*子进程*/
    else
    {
        /*关闭管道的读描述符*/
        close(fd[0]);
        /*向管道写入数据*/
        write(fd[1],"test",sizeof("test"));
    }
    return 0;
}

1.2, canalizaciones con nombre

Las canalizaciones con nombre se pueden utilizar para cualquier comunicación entre procesos.

El siguiente es crear un métodos de canalización con nombre:

mkfifo test

Este comando crea una prueba de tubería con nombre, entonces escribir datos en la tubería con un proceso, y luego otro proceso escribe los datos de lectura:

echo “this is a pipe” >test 

Si los datos de la tubería no se lee, que esperará a que existen otros procesos mediante los datos de lectura:

cat < test  //读数据

Sólo los datos se leen por otro proceso, al final de los datos de escritura en una cuenta.
Aquí también refleja las deficiencias de la tubería - ineficiente, voy a dar a transferir datos, pero sólo los datos de distancia usted, yo era capaz de volver, esto es muy lento, el proceso no es adecuado para una comunicación frecuente. Pero también tiene una ventaja que puede asegurarse de que realmente conseguir mis datos.

El siguiente es un ejemplo del código completo tubería con nombre en:

Primero creamos una tubería con nombre, si tiene éxito, el extremo cerrado de la lectura, la escritura de datos en el interior.

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <errno.h>
#include <fcntl.h>
#define FIFO "/tmp/fifo"
#define MAX_LEN 128
int main(void)
{
    int writeFd;
    char line[MAX_LEN] = {0};
    if(mkfifo(FIFO,S_IRUSR|S_IWUSR) < 0 && (errno != EEXIST))
    {
         perror("make fifo failed:");
         return -1;
    }
    /*关闭管道的读描述符*/
    writeFd = open(FIFO,O_WRONLY,0);
    /*向管道写入数据*/
    write(writeFd,"www.yanbinghu.com",sizeof("www.yanbinghu.com"));
    close(writeFd);
    return 0;
}

A continuación, el nuevo terminal se abre una tubería con nombre acaba de crear, los datos se leen desde el interior:

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <errno.h>
#include<fcntl.h>
#define FIFO "/tmp/fifo"
#define MAX_LEN 128
int main(void)
{
    int readFd,n;
    char line[MAX_LEN] = {0};
    /*打开FIFO,这里打开可能失败,应该要对返回值处理*/
    readFd = open(FIFO,O_RDONLY,0);
    /*从FIFO读取数据*/

    n = read(readFd,line,MAX_LEN);
    printf("read %d bytes from pipe :%s\n",n,line);
    close(readFd);
    /*删除FIFO*/
    unlink(FIFO);
    return 0;
}

A continuación, ejecute el proceso de escribir y leer proceso, por lo que dos procesos no relacionados pueden comunicarse a través del tubo en el anonimato.

resumen:

  • Semidúplex, que no es capaz de la transmisión simultánea de datos en ambas direcciones, algunos sistemas puede apoyar full-duplex.
  • tuberías anónimos sólo pueden ser utilizados, que son proceso de comunicación relacionada
  • Las canalizaciones con nombre se pueden utilizar para cualquier comunicación entre procesos

2, la cola de mensajes

Aprender más tuberías que conocemos, unos datos de escritura de los datos b, b de sólo lectura de salida, el retorno al orden, entonces no podemos sino esperar, desearía que los datos que usted, y luego inmediatamente devuelto?

En realidad es posible, una cola de mensajes puede resolver un problema de este tipo, siempre y cuando los datos A en la cola de mensajes b, que puede ser una, datos b uso extraídos directamente de la cola de mensajes.

  • Desventaja: si un enviado de datos es demasiado grande como para b, y la frecuencia de comunicación, a continuación, la cola de mensajes no es adecuado, ya que los datos es demasiado grande, mucho tiempo de la transmisión de datos, para copiar los datos b tarda mucho tiempo, la eficiencia es baja .
  • Ventajas: Una vez que termina el proceso relacionado de tuberías, que no habrá ningún dato, pero no la misma cola de mensajes, un proceso que los datos se escriben a la salida, otro proceso aún puede tomar datos.

3, la memoria compartida

cola de mensajes para las deficiencias, la memoria compartida permite que varios procesos compartan un área de memoria dado, porque son una memoria de datos compartida, el tiempo de copia de memoria se reduce, y por lo tanto muy rápido .

Pero aquí nos podríamos preguntar: cada proceso no es independiente de ella? ¿Cómo puede una memoria compartida?

De hecho, el sistema carga un proceso, no la memoria asignada al proceso de la memoria física real, espacio de memoria virtual, pero podemos hacer dos procesos cada uno tome un pedazo de espacio de direcciones virtuales, y luego mapeado en la misma memoria física, Aunque este proceso tiene dos espacios de direcciones virtuales independientes, pero hay una parte de la misma asignación de memoria física, completando así el mecanismo de reparto de memoria, como se muestra a continuación:
Aquí Insertar imagen Descripción
Contras: la competencia de memoria multi-proceso, de forma similar a lo que se suele decir hilo seguridad.

4, el semáforo

Resumido en una frase: la naturaleza del semáforo es un contador para la sincronización y la exclusión mutua entre procesos.

Por ejemplo sémaphore valor inicial de 1, y después de un proceso de acceso a la memoria compartida, ponemos el valor del semáforo se pone a 0, entonces b proceso para acceder a la memoria compartida, para ver el semáforo es 0, ya sabes que se ha utilizado para acceder a la memoria, y que no se puede visitar la b. Así que un medio de comunicación entre el semáforo es un proceso.

5, Socket

Mencionamos antes tuberías, colas de mensajes, memoria compartida y los semáforos son comunicaciones entre el mismo host, como estos dos procesos a miles de millas de distancia de la comunican?

Toma de respuesta es, por ejemplo, por lo general hemos lanzado una petición HTTP a través del navegador y el servidor devuelve los datos correspondientes a usted, esto es el uso de la comunicación del zócalo, es decir: que se puede utilizar entre diferentes procesos entre diferentes ordenadores la comunicación.

resumen

  • Para la tubería : lento, la última referencia a ella cuando se eliminarán los concluido el proceso, dejando en los datos de tuberías. tuberías anónimos utilizados en el proceso de relación genética, tubos para la comunicación entre procesos en cualquier tecla nombrados. la comunicación half-duplex, unos datos de escritura, un conjunto de datos de sólo lectura puede ser de un solo sentido.
  • Message Queuing : cola de prioridad del núcleo, una pluralidad de procesos para comunicarse con un nodo colocado en una cola, o cola de nodo adquiere
  • Memoria compartida : cada proceso mediante la asignación de la misma dirección física para la comunicación, reduciendo el tiempo de copia de memoria. Sin embargo, prestar atención a la comunicación de seguridad multi-proceso
  • Semáforo : situación detectada por el contador de acceso a la memoria, si el proceso tiene acceso a la memoria, el recuento se convierte en 0, no existe un proceso de acceso, cuenta el recuento se convierte en 1. Los únicos dos estados 0/1.
  • Socket utilizado para la comunicación entre diferentes ordenadores en distintos procesos, que es uno de los más utilizados en el proceso de la comunicación.
Publicado 42 artículos originales · alabanza ganado 13 · vistas 1763

Supongo que te gusta

Origin blog.csdn.net/Vicky_Cr/article/details/105294303
Recomendado
Clasificación