As rotinas em ambas as linguagens são baratas : as goroutines têm 2 KB cada, enquanto os processos Elixir têm 0,5 KB cada.
Entendo que para iniciar um processo no BEAM é necessário 0,5KB de memória. Por ser tão leve no caso de Elixir e Erlang, e em menor grau no caso de Go , parece ser a vantagem de usar esses tempos de execução quando comparados com outras linguagens que dependem de seus próprios processos e threads não tão baratos ou em os processos e threads do SO subjacente (que também supostamente requerem mais memória).
Eu quero saber quanta memória requer iniciar um processo em um sistema baseado em Linux. Estou ciente de que o uso de memória depende do que o processo está fazendo. Mas suponho que há um custo de memória de apenas iniciar um processo que não faz nada). Qual é esse custo?
Onde posso ler mais sobre isso? Existem arquivos / comandos com os quais posso inspecionar isso?
No Linux, qualquer thread ou processo incorre pelo menos no custo de a
task_struct
no kernel; no meu sistema,pahole task_struct
me diz que isso leva 9.344 bytes. No espaço do usuário, um thread também precisará de uma pilha para ser alocado a ele, mas o custo real disso dependerá de quanto espaço de pilha ele realmente usa (já que apenas as páginas que são tocadas serão alocadas).Você pode usar os programas de exemplo em
man pthread_attr_init
epthread_create
. O último, em particular, permite controlar o tamanho da pilha e o número de threads criados, o que significa que o custo de um único thread no espaço do usuário pode ser estimado executando-o e medindo a quantidade de memória que ele usa. GNUtime
, com média de um grande número de execuções, sugere uma penalidade de 48KiB por thread neste cenário específico, com uma pilha de 64KiB.A bifurcação é um pouco mais cara, pois envolve a criação de um novo espaço de endereço para o processo, com estruturas associadas no kernel e nas entradas da tabela de páginas.