Pregunta

Parece que ha habido un reciente interés creciente en los marcos de trabajo de STM (memoria transaccional de software) y las extensiones de idioma. Clojure en particular tiene una excelente implementación que utiliza MVCC (control de concurrencia de varias versiones) en lugar de un registro de confirmación sucesivo. GHC Haskell también tiene una mónada STM extremadamente elegante que también permite la composición de transacciones . Finalmente, para tocar un poco mi propia bocina, recientemente implementé un STM framework for Scala que impone restricciones de referencia de manera estática.

Todos estos son experimentos interesantes, pero parecen estar confinados solo a esa esfera (experimentación). Entonces, mi pregunta es: ¿alguno de ustedes ha visto o usado STM en el mundo real? Si es así, ¿por qué? ¿Qué tipo de beneficios trajo? ¿Qué pasa con el rendimiento? (Parece que hay una gran cantidad de información conflictiva sobre este punto). ¿Volvería a utilizar STM o preferiría utilizar otra abstracción de concurrencia como actores?

¿Fue útil?

Solución

Participé en el desarrollo de aficionados del cliente BitTorrent en Haskell (llamado conjure). Utiliza STM bastante para coordinar diferentes subprocesos (1 por igual + 1 para la gestión de almacenamiento + 1 para la gestión general).

Beneficios: menos bloqueos, código legible.

La velocidad no fue un problema, al menos no debido al uso de STM.

Espero que esto ayude

Otros consejos

El artículo "Memoria de transacciones de software: ¿por qué es solo un juguete de investigación?" no observa la implementación de Haskell, que es una omisión realmente grande. El problema para STM, como lo señala el artículo, es que las implementaciones deben elegir entre hacer transaccionales todos los accesos variables a menos que el compilador pueda demostrar que son seguros (lo que mata el rendimiento) o dejar que el programador indique cuáles deben ser transaccionales (lo que mata la simplicidad). y fiabilidad). Sin embargo, la implementación de Haskell usa la pureza de Haskell para evitar la necesidad de hacer transacciones de la mayoría de las variables, mientras que el sistema de tipos proporciona un modelo simple junto con la aplicación efectiva de las operaciones de mutación transaccional. Por lo tanto, un programa Haskell puede usar STM para aquellas variables que realmente se comparten entre subprocesos al tiempo que garantiza que el uso de memoria no transaccional se mantiene seguro.

Lo usamos bastante rutinariamente para aplicaciones de alta concurrencia en Galois (en Haskell). Funciona, se usa ampliamente en el mundo de Haskell y no se interrumpe (aunque, por supuesto, puedes tener demasiada contención). A veces reescribimos cosas para usar MVars, si tenemos el diseño correcto, ya que son más rápidas.

Sólo úsalo. No es la gran cosa. En lo que a mí respecta, STM en Haskell está solucionado " ;. No hay más trabajo que hacer. Entonces lo usamos.

Nosotros, factis research GmbH , estamos utilizando Haskell STM con GHC en producción. Nuestro servidor recibe un flujo de mensajes sobre "objetos" nuevos y modificados desde un `` servidor de datos '' clínico, transforma este flujo de eventos sobre la marcha (generando nuevos objetos, modificando objetos, agregando cosas, etc.) y calcula cuáles de estos nuevos objetos deberían sincronizarse con los iPads conectados. También recibe entradas de formulario de iPads que se procesan, fusionadas con la "corriente principal". y también sincronizado con los otros iPads. Estamos utilizando STM para todos los canales y estructuras de datos mutables que deben compartirse entre los subprocesos. Los hilos son muy livianos en Haskell, por lo que podemos tener muchos de ellos sin afectar el rendimiento (en este momento 5 por conexión de iPad). Crear una aplicación grande siempre es un desafío y hubo muchas lecciones que aprender, pero nunca tuvimos problemas con STM. Siempre funcionó como ingenuamente esperas. Tuvimos que hacer algunos ajustes de rendimiento serios, pero STM nunca fue un problema. (El 80% del tiempo intentamos reducir las asignaciones de corta duración y el uso general de la memoria).

STM es un área donde Haskell y el tiempo de ejecución de GHC realmente brillan. No es solo un experimento y no solo para programas de juguetes.

Estamos construyendo un componente diferente de nuestro sistema clínico en Scala y hemos estado usando Actores hasta ahora, pero realmente nos falta STM. Si alguien tiene experiencia de cómo es usar una de las implementaciones de Scala STM en producción, me encantaría saber de usted. :-)

Hemos implementado todo nuestro sistema (base de datos en memoria y tiempo de ejecución) en la parte superior de nuestra propia implementación de STM en C. Antes de esto, teníamos un mecanismo basado en el registro y el bloqueo para lidiar con la concurrencia, pero era difícil de mantener. Estamos muy contentos con STM ya que podemos tratar todas las operaciones de la misma manera. Casi todos los bloqueos podrían ser eliminados. Usamos STM ahora para casi cualquier cosa en cualquier tamaño, incluso tenemos un implemento de administrador de memoria en la parte superior.

El rendimiento está bien, pero para acelerar el proceso, ahora desarrollamos un sistema operativo en colaboración. con ETH Zurich. El sistema admite de forma nativa la memoria transaccional.

Pero también hay algunos desafíos causados ??por STM. Especialmente con transacciones más grandes y puntos de acceso que causan conflictos de transacción innecesarios. Si, por ejemplo, dos transacciones colocan un elemento en una lista vinculada, se producirá un conflicto innecesario que podría haberse evitado utilizando una estructura de datos sin bloqueo.

Actualmente estoy usando Akka en algunas investigaciones de sistemas PGAS. Akka es una biblioteca de Scala para desarrollar sistemas concurrentes escalables que utilizan Actors, STM y capacidades integradas de tolerancia a fallas modeladas según Erlang's " ; Let It Fail / Crash / Crater / ROFL " filosofía. La implementación de STM de Akka supuestamente está construida alrededor de un puerto Scala de la implementación de STM de Clojure. Puede encontrar una descripción general del módulo STM de Akka aquí .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top