2011-02-26 20 views
9

Estoy escribiendo un demonio de red, en Linux con kernel 2.6, que tiene proceso de un productor y N de consumidor procesa, que no hace ningún cambio en los datos, y no crea ninguna respuesta de vuelta al productor.comunicación entre procesos con resultados de memoria compartida copia cero?

Cuando el proceso de productor produce un objeto de datos, cuya longitud varía desde unos 10 bytes a unos 10 K-bytes, tiene que pasar el objeto de datos a un proceso de consumidor disponible.

primera vez, considera utilizar una tubería con nombre/sin nombre. Sin embargo, serían sobrecarga de copia de memoria.

  1. tampón de espacio de usuario del productor --copy -> kernel-espacio de amortiguación TUBO
  2. tampón de espacio de núcleo TUBO --copy -> de tampón de espacio de usuario del consumidor

Desde que el programa puede funcionar con un gran número de pares con baja latencia, la copia de sobrecarga podría ser dañina. Por lo tanto, decidí usar la memoria compartida POSIX con mmap().

Me pregunto si compartir datos entre procesos utilizando POSIX de memoria compartida con mmap() no da como resultado ninguna copia de memoria, a diferencia de PIPE.

Además, ¿hay alguna otra manera de compartir datos entre procesos, pero los resultados de copia cero? El programa se ejecutará en Linux con una versión reciente del núcleo y puede no tener que tener una capacidad multiplataforma.

Decidí no generar/ejecutar un hilo por cada consumidor/producto, pero un proceso debido a problemas de diseño.

Gracias por su respuesta.

Respuesta

5

Memoria compartida en general está diseñado específicamente para no causa sobrecarga de copia (fuente: http://www.boost.org/doc/libs/1_46_0/doc/html/interprocess/sharedmemorybetweenprocesses.html#interprocess.sharedmemorybetweenprocesses.sharedmemory.shared_memory_what_is).

Si está utilizando C++, Boost :: Interprocess es una gran biblioteca para implementar lo que está describiendo de forma multiplataforma: puede usar su clase de memoria compartida combinada con un named_upgrade_mutex. La clase named_upgrade_mutex tiene soporte para otorgar bloqueos exclusivos y compartibles en un recurso, por lo que puede implementar fácilmente su modelo de productor de consumidor. (Fuente: http://www.boost.org/doc/libs/1_37_0/doc/html/boost/interprocess/named_upgradable_mutex.html#id2913393-bb)

2

de memoria compartida no debe introducir ninguna copia (exceptuado coherencia de caché), y se puede acceder directamente a la memoria lo que puede ser capaz de evitar las copias en el código.

0

Sí debe ser copia cero.

Sin embargo, también es una optimización (posiblemente prematura) y debe tener mucho cuidado para garantizar que sus procesos cooperen adecuadamente con la asignación/desasignación/modificación de la memoria compartida. Seguramente necesitarías algún tipo de mutex para evitar problemas de acceso simultáneo.

personal que haría uso de tuberías hasta que el rendimiento se convierte en un tema apropiado. Si realmente lo hace, la sugerencia de usar Boost :: Interprocess o una biblioteca similar es razonable.

+4

Decidir cómo se mueven grandes cantidades de datos entre procesos no es una "optimización prematura", es una "arquitectura necesaria". No toda la optimización (o diseño, o arquitectura) es "prematura". –

Cuestiones relacionadas