escribí la respuesta aceptada a esa otra pregunta que está haciendo referencia, y en ella le dan un puntero directo a esta línea de código:
message = copy_struct(message, msize, &hp, &bp->off_heap);
Esto es en una función llamada cuando el plazo de Erlang el sistema de tiempo debe enviar un mensaje, y no está dentro de ningún tipo de "si" que pueda causar que se salte. Entonces, hasta donde puedo decir, la respuesta es "sí, siempre está copiada". (Eso no es estrictamente cierto; hay un "si", pero parece tratarse de casos excepcionales, no de la ruta de flujo de código normal.)
(Estoy ignorando la opción de montón híbrido presentada por Nikolaus Parece que tiene razón, pero como esta no es la forma en que normalmente se construye Erlang y tiene sus propias sanciones, no veo que valga la pena considerarlo como una forma de responder a su inquietud.)
No sé por qué estás considerando 10 GByte/s un cuello de botella, sin embargo. Nada menos que los registros o el caché de la CPU va más rápido en la computadora, y esos recuerdos son pequeños, constituyendo así una especie de cuello de botella. Además de eso, la idea de copia cero que está proponiendo requeriría bloqueo en el caso de que el mensaje cruzado de la CPU pase en un sistema multi-core, que también es un cuello de botella. Ya estamos pagando la penalización de bloqueo una vez en esta función para copiar el mensaje en la cola de mensajes del otro proceso; ¿Por qué pagarlo de nuevo más tarde cuando el proceso pasa a leer el mensaje?
En pocas palabras, no creo que sus ideas de formas de hacer que sea más rápido en realidad ayudaría mucho.
Sí, los modelos híbridos y compartidos eran factibles en VM no SMP, pero debido a un bloqueo excesivo y problemas con la recolección de basura en SMP, estos modelos eran extremadamente lentos y difíciles de mantener, por lo que se descartaron. – gleber