Передача сообщений с нулевой копией в JVM - PullRequest
0 голосов
/ 29 июля 2010

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

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

Ответы [ 2 ]

1 голос
/ 29 июля 2010

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

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

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

0 голосов
/ 29 июля 2010

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

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

...