Pergunta

Quais são algumas Característica fundamental/Arquitectónico diferença entre o FEIXE e a JVM?

  1. Sim, eu sei:foi originalmente construído em torno de java e a outra construída em torno de erlang
  2. Eu entendo a JVM (um pouco) e deseja comparar suas estruturas
  3. Por exemplo, eu sei que a JVM possui um Global GC e o FEIXE tem um por processo
Foi útil?

Solução

Primeiro de tudo, o Feixe é um registo da máquina, não é uma máquina de pilha.Como o WAM para Prolog, ele usa o "X-registra" que são normais de registros (implementado como uma matriz em C), e "Y-registra", que são nomes de slots no local de ativação da função de registro (o "moldura de chamada") na pilha.Não há nenhuma pilha instruções de manipulação.

Segundo, há instruções para a rápida alocação de mais algumas palavras de memória de heap, para inicializar o de tuplas e outras estruturas de dados na pilha, para a seleção de elementos de tuplas, etc.A JVM é focada em objetos, e tem um 'novo' operação que esconde os detalhes de alocação de memória e inicialização básica.

O FEIXE tem uma instrução para decrescendo o "contador de redução" para o processo e decidir se é o momento de rendimento para permitir que outro processo de execução.JVM, por outro lado tem instruções de sincronização de threads.

Uma diferença importante é que o FEIXE tem cauda chamada de instruções, que a JVM não tem.

Finalmente, tanto para o FEIXE e JVM, o conjunto de instruções utilizado em arquivos de objeto são realmente apenas um de transporte de formato.O FEIXE de emulador reescreve as instruções do arquivo em uma versão interna com muitos otimizado caso especial de instruções (que pode mudar de uma versão para outra).Alternativamente, você pode compilar o código nativo.A maioria das JVMs fazer a mesma coisa.

Outras dicas

Alguns outros pontos interessantes são:

  1. Os processos são cidadãos de feixe e são gerenciados pela própria VM, enquanto a JVM delega sua administração no sistema operacional. Isso permite que o feixe gerencie (crie, exclua, comutador de contexto, ...) muito rapidamente e, portanto, possa gerenciar centenas de milhares de processos contra poucas centenas de threads java em uma máquina razoável.

  2. No feixe, as comunicações entre processos são baseadas na troca de mensagens que elimina a maioria, senão todas as situações que podem levar a uma condição de corrida. No Java, você precisa sincronizar threads que são difíceis e propensos a insetos.

  3. Um ponto importante é que a coleta de lixo é feita por processo no feixe, enquanto é um processo global na JVM. O impacto é que um GC na JVM pode congelar toda a VM por possivelmente alguns segundos, enquanto no feixe cada processo deve fornecer algumas de suas operações de execução (reduções) ao GC sem impacto nos outros processos.

Recentemente, algumas novas bibliotecas como Vertx (Eu realmente não sei Akka Mas acredito que é o caso), pois os idiomas da JVM começaram a implementar comportamentos de processo semelhantes para tentar resolver os problemas 1. e 2. Acredito que o problema do GC não pode ser resolvido com simplicidade com uma biblioteca.

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