Передача сообщений без копий на JVM

Точная реализация семантики передачи сообщений актора будет означать, что содержимое сообщения глубоко копируется с логической точки зрения даже для неизменяемых типов. Глубокое копирование содержимого сообщения остается одним из самых больших узких мест для наивных реализаций модели акторов, поэтому некоторые реализации (например, Kilim) поддерживают передачу сообщений с нулевым копированием.

У меня вопрос, как передача сообщений с нулевым копированием (как часть Actor библиотека / фреймворк), реализованные на платформе с общей памятью, такой как JVM? Я предполагаю, что это может работать только для сообщений с неизменяемым содержимым, и что видимость ссылок на сообщения должна быть каким-то образом ограничена. Однако у меня возникли проблемы с поиском «теории», лежащей в основе реализации модели Актера.


person Mr. White    schedule 28.07.2010    source источник


Ответы (2)


Не то, чтобы я знаю, как выполняется какая-либо фактическая реализация, но когда неизменяемость гарантируется во время компиляции, например:

 class Immutable {
     private final String str = "A";
     public String getString(){
         return str;
     }
 }

Вы могли бы просто передать ссылку, не так ли? Это не библиотека Actor, но Google Guava дает вам эту идиому return ImmutableList.copyOf(someList);, и она будет нулевой копией, если someList является неизменным (то есть, если это экземпляр ImmutableList). думаю, можно было бы использовать аналогичный подход, например реализуя интерфейс маркера Immutable и проверяя его, и тем самым решая, копировать или нет.

person Enno Shioji    schedule 28.07.2010

Kilim выполняет передачу сообщений с нулевым копированием, устанавливая единственного владельца для объекта Message и реализуя передачу от актора к актору ссылки на сообщение во время передачи сообщения. На уровне программиста ссылка буквально исчезает из одной кучи и появляется в другой, но сообщение не выделяется или не освобождается в процессе. Erjang реализован с использованием Java + Kilim.

Небезопасная передача сообщений с нулевым копированием является стандартной практикой в ​​Scala Actors и Akka Actors в рамках одного и того же процесса. Я говорю, что это небезопасно, потому что они не защищают вас от обмена ссылками на изменяемые объекты между акторами. Ответственность программиста заключается в том, чтобы отправлять неизменяемые сообщения. На практике это вполне разумный компромисс. Вам просто нужно знать об этом, когда пишете или просматриваете чужой код.

person Alain O'Dea    schedule 28.07.2010