2010-11-23 17 views

Respuesta

10

Utiliza la compatibilidad con el sistema operativo para archivos mapeados en memoria.

Estoy tratando de encontrar documentación para respaldar eso, pero todavía no he encontrado nada concluyente. Sin embargo, varios fragmentos de los documentos hacen decir cosas como esta:

Muchos de los detalles de los archivos mapeados en memoria dependen intrínsecamente en el sistema operativo subyacente y son, por tanto, no especificada. El comportamiento de este método cuando la región solicitada no está completamente contenida dentro del archivo de este canal no está especificado. No se especifican si los cambios realizados en el contenido o el tamaño del archivo subyacente, por este programa u otro, se propagan al búfer. La velocidad a la que se propagan los cambios en el búfer al archivo no está especificada.

Si todo fuera simplemente emulado, no habría necesidad de tal comportamiento no especificado.

+0

¡Gracias @Jon por la respuesta! Como lo entendí, las clases java.nio (para manipular los archivos mapeados en memoria) envuelven las funciones de archivo mapeadas en memoria de la API de Windows? ¿Estoy en lo cierto?))) – Edward83

+1

Traté de hacer algunas pruebas. Quería crear un archivo MMF y compartirlo entre dos procesos: Win32 C++ y Java con nio. Pero la prueba falló, porque como encontré, no puedo crear/abrir MMF "Nombrado" en Java. lol))) – Edward83

9

Leyendo entre las líneas de su pregunta y comentario, lo que está tratando de hacer es usar un archivo de memoria mapeada para compartir memoria/objetos entre una aplicación Java y C++.

Mi consejo es no intente hacer esto.

Hay cuestiones difíciles que deben ser abordados para hacer de este fiable:

  • sincronización uso de la estructura de datos compartida las dos aplicaciones,
  • asegurar que los cambios realizados por una aplicación obtener de forma fiable escritos a la memoria principal y leída por la otra,
  • asegurando que los cambios se descarguen al disco en el orden esperado.

Un problema específico de Java es que no puede colocar sus objetos Java en el área de memoria asignada. En su lugar, debe serializarlos y deserializarlos de alguna manera que sea compatible con las representaciones que espera el lado de C++.

Por último, incluso si tienen éxito en el tratamiento de todas estas cuestiones, su solución es probable que sea frágil, porque depende de la conducta no especificada del sistema operativo, C++ y las implementaciones de Java que potencialmente puede cambiar si cambia versiones de cualquiera de los anteriores.

+0

gracias por la respuesta! aviso util;) – Edward83

Cuestiones relacionadas