Existe um bom motivo para executar o software de 32 bits em vez de 64 bits em máquinas de 64 bits?

56

Existe algum bom motivo para fornecer uma versão de 32 bits e uma versão de 64 bits de qualquer software direcionado a máquinas desktop modernas, executando sistemas operacionais de 64 bits modernos em hardware de 64 bits?

Parece que o software de 64 bits seria mais eficiente, permitiria maior uso de memória, se necessário, etc. A Apple ainda usa processadores de 64 bits para seus telefones, mesmo que eles tenham apenas 1 a 2 GB de RAM, bem abaixo dos 4 GB limite para CPUs de 32 bits.

Filip Haglund
fonte
16
Não cada máquina moderna é executado de 64 bits do sistema operacional
Bálint
4
Você tem algum exemplo?
Filip Haglund
8
Pergunte aos seus clientes.
Murphy
22
Pergunta retórica: existe uma razão para fornecer uma versão de 64 bits de qualquer software, já que os sistemas operacionais de 64 bits mais modernos permitem executar aplicativos de 32 e 64 bits também?
Doc Brown
2
Não é um @gnat duplicado. Essa pergunta é sobre o ajuste de um carimbo de data e hora e um ID de desenvolvedor no código de erro retornado quando um programa é encerrado.
precisa saber é o seguinte

Respostas:

80

Benefícios do software de 32 bits em ambientes de 64 bits

  • Menor consumo de memória, especialmente em aplicativos com muitos ponteiros, 64 bits vs 32 bits pode facilmente duplicar os requisitos de memória.
  • Os arquivos de objetos também são menores.
  • Compatibilidade com ambientes de 32 bits.
  • Os vazamentos de memória são limitados a 2 GB, 3 GB ou 4 GB e não inundam todo o sistema.

Desvantagens do software de 32 bits em ambientes de 64 bits

  • Limite de memória de 2 GB, 3 GB ou 4 GB por processo. (Apenas por processo, em suma, vários processos de 32 bits podem usar a memória total do sistema disponível.)
  • Não usar registros adicionais e extensões do conjunto de instruções, dependendo de x64. Isso é altamente compilador e específico da CPU.
  • Pode exigir versões de 32 bits de todas as bibliotecas (a maioria das distribuições Linux) ou incomuns (a maioria das versões do Windows) e ambientes de tempo de execução. Se uma versão de 32 bits de uma biblioteca compartilhada for carregada exclusivamente para o seu aplicativo, isso conta para o seu espaço ocupado. Não há nenhuma diferença se você estiver vinculando estaticamente.

Outros aspectos

  • Drivers geralmente não são um problema. Somente bibliotecas de espaço do usuário devem diferir entre 32 bits e 64 bits, não a API dos módulos do kernel.
  • Cuidado com diferentes larguras padrão para tipos de dados inteiros, testes adicionais são necessários.
  • A arquitetura da CPU de 64 bits pode nem mesmo suportar 32 bits.
  • Certas técnicas, como ASLR e outras, dependendo de um espaço de endereço muito maior que a memória física, não funcionarão bem (ou nada) no modo de execução de 32 bits.

A menos que compare aqui uma arquitetura de CPU muito específica, sistema operacional e infraestrutura de biblioteca, não poderei entrar em mais detalhes.

Ext3h
fonte
8
"A arquitetura da CPU de 64 bits pode nem mesmo suportar 32 bits." Isso é mais uma preocupação teórica ou existe no mundo?
Mucaho 15/04
10
@mucaho Certamente existem arquiteturas de CPU de apenas 64 bits, como o Alpha e o IA64. Ambos são moribundos, no entanto. Não sei se existem arquiteturas atualmente produzidas apenas em 64 bits - AArch64, talvez? Alguém sabe se o ARM de 32 bits é um componente obrigatório disso?
Zwol 15/04
10
@zwol Não, 32 bits não é obrigatório para o ARM e nem 64 bits. Existem apenas CPUs ARM de 64 bits, enquanto outras suportam processos de 32 e 64 bits.
Ext3h 15/04/16
3
Há um benefício adicional em simplesmente escolher uma arquitetura e segui-la: desenvolvimento e teste mais simples.
Jl6
7
@ Josué Sempre existiu? Os faraós sabiam disso?
candied_orange
7

A diferença entre o software de 32 bits e o de 64 bits é o tamanho dos ponteiros e talvez o tamanho do número inteiro. É isso aí.

Isso significa que todos os ponteiros do seu programa têm o dobro do tamanho. E (pelo menos em uma arquitetura ILP32 / LP64), seus longs também têm o dobro do tamanho. Isso normalmente resulta em um aumento de cerca de 30% no tamanho do código do objeto. Isso significa que …

  • seu código de objeto levará ~ 30% mais tempo para carregar do disco na RAM
  • seu código de objeto ocupará ~ 30% mais espaço na memória
  • você reduziu efetivamente a largura de banda da memória (para código de objeto) em ~ 20%
  • você reduziu efetivamente o tamanho do cache de instruções em ~ 20%

Isso tem um efeito negativo não negligenciável no desempenho.

Fazer isso só faz sentido se você puder "recomprar" esses custos de desempenho de alguma forma. Basicamente, existem duas maneiras de fazer isso: você faz muita matemática de número inteiro de 64 bits ou precisa de mais de 4 memória mapeada de GiByte. Se um ou os dois forem verdadeiros, faz sentido usar software de 64 bits, caso contrário, não.

Nota: existem algumas arquiteturas nas quais não existem variantes correspondentes de 32 ou 64 bits. Nesse caso, a pergunta obviamente não faz sentido. Os mais conhecidos são o IA64, que tem apenas 64 bits e não possui variante de 32 bits, e x86 / AMD64, que são, embora estreitamente relacionados, arquiteturas diferentes , x86 sendo apenas 32 bits e AMD64 sendo apenas 64 bits.

Na verdade, essa última afirmação não é mais 100% verdadeira. O Linux adicionou recentemente o x32 ABI, que permite executar o código AMD64 com ponteiros de 32 bits; portanto, mesmo que essa não seja uma arquitetura de CPU "adequada", é uma maneira de usar a arquitetura AMD64 de maneira a ter uma arquitetura nativa. Variante de 32 bits. Isso foi feito precisamente porque a sobrecarga de desempenho que mencionei acima estava causando problemas reais mensuráveis ​​e quantificáveis ​​para usuários do mundo real que executam código do mundo real em sistemas do mundo real.

Jörg W Mittag
fonte
8
E os registros e instruções extras no amd64 em comparação com o x86? Quanto isso melhora o desempenho?
precisa saber é o seguinte
2
Google para "ponteiros com tags" usados ​​no Objective-C no MacOS X e iOS. Quantidades muito substanciais de objetos não possuem memória alocada, mas todo o objeto é falsificado no ponteiro em sistemas de 64 bits. (Ouvi dizer que Java faz algo semelhante). No C ++, std :: string em 64 bits geralmente contém até 22 caracteres no próprio objeto sem nenhuma alocação de memória. Economias substanciais de memória e melhorias de velocidade.
precisa saber é o seguinte
3
Tamanho de ponteiros e números inteiros é? E o espaço de endereço maior e os registros adicionais na maioria das arquiteturas de 64 bits?
11
"você [reduziu] o cache de instruções em ~ 20%" é discutível, já que o conjunto de instruções é completamente diferente (e geralmente mais eficiente)
BlueRaja - Danny Pflughoeft 15/16
3
"Isso tem um efeito negativo não negligenciável no desempenho". Embora essa afirmação seja verdadeira em sentido absoluto, ela ignora o fato de que a grande maioria dos gargalos de desempenho dos aplicativos não está no tempo de carregamento, nem no uso de memória / largura de banda ou no número de instruções no cache.
22816 Ian Kemp
6

Se o software precisar interagir diretamente com sistemas, drivers ou bibliotecas herdados, talvez seja necessário fornecer uma versão de 32 bits, pois o AFAIK, geralmente, o SO (definitivamente AFAIK do Windows e Linux) não permite a mistura de 64 e 32 bits. código de bits dentro de um processo.

Por exemplo, se o seu software precisar acessar hardware especial, não é incomum os clientes operarem modelos mais antigos para os quais apenas drivers de 32 bits estão disponíveis.

O que outras pessoas estão dizendo

Michael Borgwardt
fonte
2
Você pode misturar 32 e 64 bits no mesmo processo no Windows e no Linux: stackoverflow.com/q/12716419/703382
Navin
11
@ Navin: Mas é prático? Você poderia usar um componente COM em um aplicativo do Windows de 64 bits (por exemplo, um aplicativo .NET marcado como Qualquer CPU executando em uma versão de 64 bits do Windows)?
Peter Mortensen
3

Se o seu software é uma DLL, você DEVE fornecer as versões de 32 e 64 bits. Você não tem idéia se o cliente usará software de 32 ou 64 bits para conversar com a DLL, e a DLL precisará usar o mesmo tamanho de bit que o aplicativo. Isso não é negociável.

Se o seu software é um executável independente, fica menos claro. Se você não precisar que seu software seja executado em sistemas operacionais mais antigos, talvez não seja necessário fornecer uma versão de 32 bits. Apenas atenha-se a 64 bits, especifique que ele requer um sistema operacional de 64 bits e faça o trabalho.

No entanto, se você precisar que seu software seja executado em sistemas operacionais mais antigos, NÃO é possível fornecer ativamente uma versão de 64 bits. Se você tiver duas versões, terá o dobro do teste, e testar corretamente o software em várias versões e idiomas do SO não é um processo rápido. Como o software de 32 bits é executado perfeitamente em uma plataforma de 64 bits, ainda é bastante comum que o software seja lançado apenas como 32 bits, especialmente por desenvolvedores menores.

Observe também que a maioria dos celulares é de 32 bits. Talvez alguns dos mais sofisticados sejam de 64 bits agora, mas há poucas razões convincentes para dar esse passo. Portanto, se você estiver desenvolvendo uma plataforma cruzada e desejar que seu código seja executado no Android também, permanecer 32 bits é uma opção segura.

Graham
fonte
Eu argumentaria contra sua posição em testes reduzidos. Em vez disso, eu argumentaria que testaria em várias plataformas, principalmente não apenas com tamanhos de registro diferentes, mas com ordens de bytes diferentes, como uma maneira fácil de aumentar os testes e detectar erros sutis. Além disso, eu também faria testes em computadores que não atendam aos requisitos mínimos de hardware recomendados, pois também expõem problemas adicionais que podem não aparecer de outra forma, exceto com conjuntos de dados muito grandes.
Hildred #
@hildred Com recursos ilimitados de teste, eu concordo. Na prática, porém, se você tiver mais controle sobre seu alvo, poderá não precisar fazer esse teste imediatamente. Também não é uma "maneira fácil" - com certeza você pode simular algumas dessas plataformas em uma VM, mas se precisar de configuração de hardware físico, isso envolve grandes quantidades de trabalho manual (não automatizável). Isso pode evitar que você escreva um equipamento de teste para testá-lo explicitamente, mas não é gratuito de forma alguma.
Graham
11
Não é grátis, mas é absolutamente barato. Se você limitar o teste fora da plataforma a testes automatizados, o teste ocasional idiota, o hardware usado Além da configuração, seus custos para testes bem-sucedidos após a configuração inicial seriam limitados à energia e cerca de 7 minutos por passagem de teste. Obviamente, o custo para testes com falha seria mais alto, mas esses geralmente valeriam mais (sempre há falha de hardware). Esse tipo de configuração é particularmente útil para programadores porque expõe prontamente uma certa classe de problemas de ponteiros que, de outra forma, seriam difíceis de rastrear.
Hildred