2010-02-25 24 views
7

Necesito 2 programas diferentes para trabajar en un solo conjunto de datos. He podido establecer una conexión de red (UDP) entre ellos, pero quiero evitar la transferencia de todos los datos por cualquier medio.¿Es posible tener un puntero común entre 2 programas diferentes en la misma computadora?

Suena un poco absurdo, pero ¿es posible compartir algún tipo de puntero entre estos dos programas para que cuando uno lo actualice el otro pueda obtener el puntero y comenzar a usarlo?

estoy usando Ubuntu 9.10

+1

Es posible, pero las soluciones son específicas del sistema operativo. ¿Para qué sistema operativo desea esto? –

+1

¿Alguna plataforma específica? Muchos sistemas pueden admitir archivos mapeados en memoria. – kenny

+2

respuesta corta: memoria compartida. un poco más larga: si ya está serializando, considere un socket o tubería local: semántica similar, sin sobrecarga de red IP/(falsa). – Javier

Respuesta

12

Estás hablando de IPC - Comunicación entre procesos. Hay muchas opciones

Uno es un archivo mapeado en memoria. Se acerca a hacer lo que describiste. Sin embargo, puede ser o no el enfoque óptimo para sus requisitos. Lea sobre IPC para obtener algo de profundidad.

+2

Aquí hay un enlace que podría ayudar. Utiliza las bibliotecas de Boost. http://www.boost.org/doc/libs/1_37_0/doc/html/interprocess/quick_guide.html#interprocess.quick_guide.qg_interprocess_map – Dan

+0

Correcto, pero el IPC de Linux no es fácil de usar ... –

+1

IPC es generalmente no es fácil. El sistema operativo limpia las cosas como los archivos (incluidos los archivos mapeados en memoria) y los sockets al finalizar el proceso. La memoria compartida generalmente no. Por lo tanto, generalmente no se sabe si un bloque de memoria compartida está en uso, y su programa tiene que determinar de alguna manera si el bloque de memoria compartida necesario debe ser creado o no. –

0

No, lo siento. Hace mucho tiempo escuché de un sistema operativo experimental que tenía un espacio de direcciones muy grande, donde partes de él estaban en una máquina y otras partes en otras máquinas. Habría permitido exactamente lo que pregunta ...

Nota: Estoy asumiendo que los 2 programas se ejecutan en máquinas diferentes. Si simplemente son procesos diferentes, puede usar secciones con nombre para compartir datos.

1

POSIX funciones de memoria compartida para sabores de Unix. Los mainframes de IBM (370/xa/esa/Zos) pueden usar servicios de memoria cruzada a un nivel bajo. También debe considerar si su aplicación escalará más allá de un solo procesador o no.

9

Lo que está buscando generalmente se denomina "segmento de memoria compartida" y la forma de acceder a él es específica de la plataforma.

En sistemas POSIX (la mayoría de Unix/Linux), utiliza las API shm _ *() en sys/shm.h.

En Win32, está hecho con archivos mapeados en memoria, por lo que vamos a usar CreateFileMapping()/MapViewOfFile(), etc.

No

seguro acerca de los Mac, pero es probable que pueda utilizar SHM _ *() allí también.

+1

shm_ * funcionará también en Mac, aunque los puertos Mach son la forma preferida. – zneak

0

Dejando a un lado el hecho de que puede hacerse, comunicación entre procesos nunca se hace mediante el intercambio de recursos - por no hablar de espacios de memoria. Esa es una receta adecuada para el desastre.

El IPC correcto se realiza por medios de comunicación adecuados, como enchufes. Compartir la memoria nunca es el camino a seguir.

+0

¿Por qué nunca? Depende de la aplicación, e incluso un servidor web Apache utiliza un "marcador" de memoria compartida para la comunicación entre sus procesos. – Frunsi

+0

En general, es mejor tratar de evitar dos programas/hilos escribiendo en la misma memoria (aunque a veces es la mejor manera). Sin embargo, si uno de los procesos/subprocesos solo lee la memoria, esto está bastante bien, con todas las advertencias que se aplican al uso de la memoria compartida. –

2

La memoria compartida puede brindar el ancho de banda más alto de cualquier forma de IPC disponible, pero también es un poco difícil de administrar: necesita sincronizar el acceso a la memoria compartida, tal como lo haría con los subprocesos. Si realmente necesita ese ancho de banda sin procesar, es lo mejor que hay, pero un diseño que necesita ese tipo de ancho de banda suele ser uno con una línea divisoria mal elegida entre los procesos, en cuyo caso puede ser innecesariamente difícil obtener funciona bien

También tenga en cuenta que las tuberías (por ejemplo) son mucho más fáciles de usar y aún tienen un ancho de banda bastante serio: todavía usan (normalmente) un búfer asignado por el núcleo en la memoria, pero automatizan el acceso sincronizado a él. La pérdida de ancho de banda se debe a que la sincronización automatizada requiere un algoritmo de bloqueo muy pesimista. Eso todavía no impone una gran cantidad de sobrecarga, aunque ...

+0

El rendimiento del mecanismo IPC cambia según el sistema operativo. Sin garantía de rendimiento de Shared Any. En algunos sistemas, la memoria compartida es incluso más lenta que otros métodos, como usar tuberías como lo propuso. – kriss

1

usando Tal vez "memcached" como intermediario entre los dos procesos podría ser mejor, a continuación, cada proceso puede intercambiar la clave de entre unos y otros.

Su limitada por Creo 1024Kb por clave/valor par o menos, pero los beneficios inmediatos es la interoperabilidad, la estabilidad y la capacidad futura para conectar varios procesos en varios equipos juntos.

1

Si realmente, realmente necesitas hacer eso, es una pista de que tus dos programas realmente pueden cambiarse por uno con dos hilos ... (si tienes fuentes de programas, es pan comido hacerlo).

Cuestiones relacionadas