Menos uso de memória ao executar um software similar?

2

Eu tenho uma pergunta que muitas vezes me pergunto. Os programas usam menos memória RAM, se um programa semelhante já estiver em execução?

O que quero dizer com semelhante? Bem, por exemplo, eu me pergunto sobre qualquer derivado de cromo e Atom rodando ao mesmo tempo. Não é Atom um navegador Chormium sob o capô? Então, se eles usarem as mesmas bibliotecas em algum momento, isso me poupará memória, em comparação com a execução de algum outro editor hipotético ou navegador com seu próprio consumo de memória como Atom ou Chromium?

Outro exemplo: Firefox e Thunderbird - Alguma gravação lá?

O SO não deve ser tão inteligente para reconhecer dependências semelhantes e economizar memória?

    
por Zelphir 01.08.2016 / 17:44

1 resposta

1

Sim, eles usam menos memória. Na verdade, o seu exemplo de Chromium vs. Atom é uma ilustração perfeita disso. Ambos os navegadores usam a biblioteca WebKit para renderizar páginas da web. Se ambos os navegadores estiverem usando a mesma versão da biblioteca WebKit, o sistema operacional carregará apenas uma cópia na memória para que ambos usem. Esse processo é chamado de vinculação dinâmica, daí o nome Dynamic Link Library (DLL) no Windows. O Linux apenas os chama de 'bibliotecas'.

Quase todos os programas que você executa executam muitas de suas funcionalidades em uma biblioteca externa de algum tipo. Quando o programa invoca uma das funções em uma biblioteca, o sistema operacional carrega uma cópia da biblioteca na memória e, em seguida, mapeia o endereço da função no espaço de memória do programa.

Digamos que o programa X chame uma função na biblioteca A. O sistema operacional carrega a biblioteca A na memória e dá ao programa X um ponteiro para a função de que necessita. Agora digamos que o programa Y também chama a mesma função na biblioteca A. Como a biblioteca A já está na memória (porque o programa X está usando), o sistema operacional não a carrega novamente. Simplesmente passa outro ponteiro para programar Y.

É importante notar que o programa X e o programa Y têm suas próprias referências à mesma função na biblioteca A, e nenhum deles está ciente de que está sendo usado pelo outro. Ambos pensam que a função está mapeada em seu próprio espaço de memória. O sistema operacional está traduzindo dinamicamente os endereços de indicadores virtualizados para seus valores reais em nome de cada programa. O sistema operacional está essencialmente mentindo para cada um deles sobre qual endereço de memória corresponde à função.

Agora, vamos dizer que o programa X modifica alguns bytes de memória mantidos por essa função. Como a memória é compartilhada entre dois programas diferentes, o SO faz uma segunda cópia da função para que o programa Y não seja afetado pela alteração. Neste ponto, a função agora é carregada na memória duas vezes. Nenhum programa está ciente disso, no entanto. O programa X e Y apenas continua fazendo suas coisas e o SO manipula qual deles obtém qual cópia. Essa técnica é chamada copy-on-write .

Dessa forma, muitos programas podem estar trabalhando na mesma cópia de uma determinada parte da memória sem ter várias cópias dela na RAM. Essa virtualização da memória é uma das razões pelas quais é tão difícil obter uma contabilidade adequada de quanto a RAM está realmente em uso em um sistema.

Muitos fornecedores de software têm suas próprias bibliotecas de funções internas, portanto, mesmo que dois programas não sejam similares (como o Firefox e o Thunderbird), o fato de serem do mesmo fornecedor (Mozilla, neste caso) aumenta a probabilidade de que eles poderão usar memória compartilhada para suas funções.

    
por 01.08.2016 / 23:49