Pergunta

Parece que tem havido um interesse recente em ascensão no STM (memória transacional software) estruturas e extensões de linguagem. Clojure em particular, tem uma excelente aplicação que usa MVCC (controle de concorrência multi-versão) em vez de um rolamento cometer log. GHC Haskell também tem um STM extremamente elegante mônada que também permite a composição de transação . Finalmente, de modo a toot meu próprio chifre um pouco, eu tenho implementado recentemente um quadro STM para Scala que estaticamente impõe restrições de referência.

Todos estes são experiências interessantes, mas eles parecem estar confinado a essa esfera sozinho (experimentação). Então, minha pergunta é: se algum de vós tem visto ou usado STM no mundo real? Se sim, porquê? Que tipo de benefícios que ele traz? E sobre o desempenho? (Parece haver uma grande quantidade de informações conflitantes sobre esse ponto) você usaria STM novamente ou se você preferir usar algum outro abstração simultaneidade como atores?

Foi útil?

Solução

Eu participei no desenvolvimento hobbyist do cliente BitTorrent em Haskell (nomeado conjure). Ele usa STM muito fortemente para coordenar diferentes tópicos (1 por pares + 1 para gestão de armazenamento + 1 para gestão global).

Benefícios:. Menos fechaduras, código legível

A velocidade não era um problema, pelo menos não devido ao uso STM.

Espero que isso ajude

Outras dicas

O artigo "Software Transactional memória: por que é que só um brinquedo de pesquisa?" não olhar para a implementação Haskell, que é realmente um grande omissão. O problema para STM, como o artigo aponta, é que as implementações devem escolher entre um ou outro fazendo todo variável acessos transacional a menos que o compilador pode provar-los seguros (que mata desempenho) ou deixar o programador indicar quais são para ser transacional (que mata simplicidade e fiabilidade). No entanto, a implementação Haskell usa a pureza de Haskell para evitar a necessidade de fazer usos mais variáveis ??transacionais, enquanto o sistema de tipo fornece um modelo simples, juntamente com a aplicação eficaz para as operações de mutação transacionais. Assim, um programa Haskell pode usar STM para aquelas variáveis ??que são realmente compartilhados entre threads ao mesmo tempo garantindo que o uso de memória não transacional é mantida em segurança.

Vamos utilizá-lo bastante rotineiramente para aplicativos de alta concorrência no Galois (em Haskell). Ele funciona, seu amplamente utilizado no mundo Haskell, e não impasse (embora é claro que você pode ter muito de contenção). Às vezes a gente reescrever coisas para usar MVars, se temos o direito design -. Como eles são mais rápidos

Basta usá-lo. Não é grande coisa. Tanto quanto eu estou em causa, STM em Haskell está "resolvido". Não há mais trabalho a fazer. Então, nós usá-lo.

, factis pesquisar GmbH , estão usando Haskell STM com GHC na produção. O nosso servidor recebe um fluxo de mensagens sobre "objetos" novos e modificados de um "servidor de dados" clincal, transforma este fluxo de eventos em tempo real (através da geração de novos objetos, modificação de objetos, agregando coisas, etc) e calcula que destes novos objectos devem ser sincronizados para iPads conectados. É também recebe entradas de formulário a partir de iPads que são processados, fundiu-se com o "fluxo principal" e também sincronizadas com os outros iPads. Estamos usando STM para todos os canais e estruturas de dados mutáveis ??que precisam ser compartilhados entre threads. Threads são muito leves em Haskell para que possamos ter muitos deles sem afetar o desempenho (no momento 5 por conexão iPad). Construindo uma aplicação grande é sempre um desafio e havia muitas lições a serem aprendidas, mas nós nunca tivemos quaisquer problemas com STM. Ele sempre trabalhou como seria ingenuamente esperar. Tivemos que fazer alguns ajustes de desempenho grave, mas STM nunca foi um problema. (80% do tempo que estávamos a tentar reduzir as alocações de curta duração e uso geral da memória.)

STM é uma área onde Haskell eo GHC runtime realmente brilha. Não é apenas um experimento e não para programas de brinquedo somente.

Estamos construindo um componente diferente do nosso sistema clincal em Scala e têm vindo a utilizar Atores até agora, mas estamos realmente faltando STM. Se alguém tem experiência de como é a utilização uma das implementações Scala MCT na produção Eu adoraria ouvi-lo. : -)

Temos implementado todo o nosso sistema rel="nofollow">

O desempenho é bom, mas para acelerar as coisas que já desenvolveu um costume sistema operacional em colaboração com ETH Zurich. O sistema suporta nativamente memória transacional.

Mas existem alguns desafios causados ??pela STM também. Especialmente com as transações maiores e hotspots que causam conflitos de transação desnecessários. Se, por exemplo, duas operações de colocar um item em uma lista ligada, um conflito desnecessário ocorrerá que poderia ter sido evitado usando uma estrutura de dados livre de bloqueio.

Atualmente estou usando Akka em alguns PGAS sistemas de investigação. Akka é uma biblioteca Scala para o desenvolvimento de sistemas concorrentes escaláveis ??usando atores, STM e recursos de tolerância a falhas embutidos modelado após Erlang de " Let It Falha / Bater / Crater / ROFL" filosofia. implementação STM de Akka é supostamente construído em torno de uma porta Scala de implementação STM do Clojure. Uma visão geral do módulo STM de Akka pode ser encontrada aqui .

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top