Existe-t-il une bonne raison pour exécuter un logiciel 32 bits au lieu de 64 bits sur des ordinateurs 64 bits?

56

Existe-t-il une bonne raison de fournir une version 32 bits ainsi qu'une version 64 bits de tout logiciel destiné aux ordinateurs de bureau modernes, exécutant des systèmes d'exploitation 64 bits modernes sur du matériel 64 bits?

Il semble que les logiciels 64 bits seraient plus efficaces, permettraient une utilisation plus importante de la mémoire si nécessaire, etc. Apple utilise même des processeurs 64 bits pour ses téléphones, même s'ils ne disposent que de 1 à 2 Go de RAM, bien en dessous des 4 Go. limite pour les processeurs 32 bits.

Filip Haglund
la source
16
Toutes les machines modernes ne fonctionnent pas avec un système d’exploitation 64 bits
Bálint
4
Avez-vous des exemples?
Filip Haglund
8
Demandez à vos clients.
Murphy
22
Question rhétorique: existe-t-il une raison de fournir une version 64 bits de tout logiciel puisque la plupart des systèmes d'exploitation 64 bits modernes permettent également d'exécuter des applications 32 bits et 64 bits?
Doc Brown
2
Pas un doublon @gnat. Cette question concerne l'ajustement d'un horodatage et un identifiant de développeur dans le code d'erreur renvoyé à la sortie du programme.
Filip Haglund

Réponses:

80

Avantages du logiciel 32 bits dans les environnements 64 bits

  • Encombrement réduit de la mémoire, en particulier dans les applications comportant beaucoup de pointeurs, les versions 64 bits et 32 ​​bits peuvent facilement doubler les besoins en mémoire.
  • Les fichiers objet sont également plus petits.
  • Compatibilité avec les environnements 32 bits.
  • Les fuites de mémoire sont limitées à 2 Go, 3 Go ou 4 Go et ne saturera pas tout le système.

Inconvénients du logiciel 32 bits dans les environnements 64 bits

  • Limite de mémoire de 2 Go, 3 Go ou 4 Go par processus. (Juste par processus, plusieurs processus 32 bits peuvent utiliser la totalité de la mémoire système disponible.)
  • Ne pas utiliser de registres supplémentaires ni d’extensions de jeux d’instructions selon x64. Ceci est hautement compilateur et spécifique au processeur.
  • Peut nécessiter des versions 32 bits de toutes les bibliothèques et de tous les environnements d’exécution (la plupart des distributions Linux) ou rares (la plupart des versions de Windows). Si une version 32 bits d'une bibliothèque partagée est chargée exclusivement pour votre application, cela compte pour votre empreinte. Aucune différence du tout si vous liez statiquement.

Autres aspects

  • Les conducteurs ne sont généralement pas un problème. Seules les bibliothèques d'espace utilisateur doivent différer entre 32 bits et 64 bits, et non l'API des modules du noyau.
  • Attention aux différentes largeurs par défaut pour les types de données entiers, des tests supplémentaires sont nécessaires.
  • L'architecture de la CPU 64 bits peut même ne pas prendre en charge la version 32 bits.
  • Certaines techniques, comme ASLR et d’autres qui dépendent d’un espace d’adresse beaucoup plus grand que la mémoire physique, ne fonctionneront pas bien (ou pas du tout) dans un mode d’exécution 32 bits.

À moins de comparer ici une architecture de processeur, un système d'exploitation et une bibliothèque très spécifiques, je ne pourrai pas entrer dans les détails.

Ext3h
la source
8
"L'architecture de la CPU 64 bits peut même ne pas prendre en charge la version 32 bits." Est-ce une préoccupation plus théorique, ou existe-t-il dans le monde?
mucaho
10
Il @mucaho certainement eu 64 bits uniquement les architectures CPU, comme l'Alpha et l'IA64. Les deux sont moribonds, cependant. Je ne sais pas par cœur s'il existe actuellement des architectures 64 bits uniquement - AArch64, peut-être? Est-ce que quelqu'un sait si l'ARM 32 bits est une composante obligatoire de cela?
dimanche
10
@zwol Non, 32 bits n'est pas obligatoire pour ARM, pas plus que 64 bits. Il existe des processeurs ARM 64 bits uniquement, tandis que d'autres prennent en charge les processus 32 bits et 64 bits.
Ext3h
3
Le fait de choisir une architecture et de s'y tenir offre un avantage supplémentaire: un développement et des tests plus simples.
JL6
7
@ Josué a toujours existé? Les pharaons le savaient-ils?
candied_orange
7

La différence entre un logiciel 32 bits et un logiciel 64 bits réside dans la taille des pointeurs et peut-être aussi dans la taille des registres d'entiers. C'est ça.

Cela signifie que tous les indicateurs de votre programme sont deux fois plus grands. Et (au moins sur une architecture ILP32 / LP64), votre longtaille est également deux fois plus grande. Cela correspond généralement à une augmentation d'environ 30% de la taille du code de l'objet. Cela signifie que …

  • le code de votre objet prendra environ 30% plus de temps à charger du disque dans la RAM
  • votre code objet prendra environ 30% plus d'espace en mémoire
  • vous avez effectivement réduit votre bande passante mémoire (pour le code objet) d'environ 20%
  • vous avez effectivement réduit la taille du cache d'instructions d'environ 20%

Ceci a un effet négatif non négligeable sur les performances.

Cela n'a de sens que si vous pouvez "racheter" ces coûts de performance d'une manière ou d'une autre. En gros, il existe deux façons de procéder: vous faites beaucoup de calculs sur les nombres entiers de 64 bits ou vous avez besoin de plus de 4 mégaoctets de mémoire mappée. Si l'une ou les deux est vraie, il est logique d'utiliser un logiciel 64 bits, sinon ce n'est pas le cas.

Remarque: dans certaines architectures, il n’existe pas de variantes 32 ou 64 bits correspondantes. Dans ce cas, la question n'a évidemment aucun sens. Les plus connus sont IA64, qui n’est que 64 bits et n’a pas de variante 32 bits, et x86 / AMD64, qui sont, bien que étroitement liés, des architectures différentes , x86 n’ayant que 32 bits, AMD64 n’ayant que 64 bits.

En fait, cette dernière affirmation n’est plus vraie à 100%. Linux a récemment ajouté l’ABI x32, qui vous permet d’exécuter du code AMD64 avec des pointeurs 32 bits. Ainsi, même si ce n’est pas une architecture de processeur "correcte", c’est une façon d’utiliser l’architecture AMD64 de telle sorte qu’elle ait une architecture native. Variante 32 bits. Cela a été fait précisément parce que la surcharge de performances que j'ai mentionnée ci-dessus posait de véritables problèmes quantifiables et mesurables aux utilisateurs du monde réel exécutant du code réel dans des systèmes réels.

Jörg W Mittag
la source
8
Qu'en est-il des registres supplémentaires et des instructions dans amd64 par rapport à x86? Dans quelle mesure cela améliore-t-il les performances?
Filip Haglund
2
Google pour les "pointeurs marqués" utilisés dans Objective-C sur MacOS X et iOS. Des quantités très substantielles d'objets n'ont aucune mémoire allouée, mais l'objet entier est falsifié dans le pointeur sur les systèmes 64 bits. (J'ai entendu Java faire quelque chose de similaire). En C ++, std :: string sur 64 bits contient souvent jusqu'à 22 caractères dans l'objet même, sans aucune allocation de mémoire. Économies de mémoire substantielles et améliorations de la vitesse.
gnasher729
3
La taille des pointeurs et des entiers est-ce? Qu'en est-il de l'espace d'adressage plus important et des registres supplémentaires dans la plupart des architectures 64 bits?
1
"vous avez [réduit] le cache d'instruction d'environ 20%" est sans objet, car le jeu d'instructions est complètement différent (et souvent plus efficace)
BlueRaja - Danny Pflughoeft
3
"Cela a un effet négatif non négligeable sur les performances." Bien que cette affirmation soit vraie dans un sens absolu, elle ignore le fait que la grande majorité des goulots d'étranglement des performances des applications ne sont pas liées au temps de chargement, à l'utilisation de la mémoire / à la bande passante ou au nombre d'instructions dans le cache.
Ian Kemp
6

Si le logiciel doit s’interfacer directement avec des systèmes, des pilotes ou des bibliothèques hérités, vous devrez peut-être fournir une version 32 bits, car AFAIK, le système d’exploitation (en général Windows et Linux AFAIK) ne permet pas le mélange de versions 32 bits et 32 ​​bits. -bit code dans un processus.

Par exemple, si votre logiciel doit accéder à du matériel spécialisé, il n'est pas rare que les clients utilisent des modèles plus anciens pour lesquels seuls des pilotes 32 bits sont disponibles.

Un séjour sans faille

Michael Borgwardt
la source
2
Vous pouvez mélanger 32 bits et 64 bits dans le même processus sous Windows et Linux: stackoverflow.com/q/12716419/703382
Navin
1
@Navin: Mais est-ce pratique? Pourriez-vous utiliser un composant COM dans une application Windows 64 bits (par exemple, une application .NET marquée comme N'importe quel processeur s'exécutant sur une version 64 bits de Windows)?
Peter Mortensen
3

Si votre logiciel est une DLL, vous DEVEZ fournir les versions 32 bits et 64 bits. Vous ne savez pas si le client utilisera un logiciel 32 bits ou 64 bits pour communiquer avec la DLL et celle-ci doit utiliser la même longueur de bits que l'application. Ceci est non négociable.

Si votre logiciel est un exécutable autonome, c'est moins clair. Si vous n'avez pas besoin que votre logiciel s'exécute sur des systèmes d'exploitation plus anciens, vous n'avez peut-être pas besoin de fournir une version 32 bits. Il suffit de s'en tenir à la version 64 bits, en précisant qu'elle nécessite un système d'exploitation 64 bits et que le travail est terminé.

Toutefois, si vous avez besoin de votre logiciel pour fonctionner sur des systèmes d'exploitation plus anciens, vous pouvez, de manière active, ne PAS vouloir fournir une version 64 bits. Si vous avez deux versions, le nombre de tests est doublé, et tester correctement les logiciels dans une gamme de versions de systèmes d'exploitation et de langues n'est pas un processus rapide. Étant donné que les logiciels 32 bits fonctionnent parfaitement sur une plate-forme 64 bits, il est encore assez courant que les logiciels ne soient commercialisés qu'en version 32 bits, en particulier par les plus petits développeurs.

Notez également que la plupart des mobiles sont en 32 bits. Certains modèles haut de gamme sont actuellement en 64 bits, mais il existe peu de raisons convaincantes de le faire. Par conséquent, si vous développez plusieurs plates-formes et souhaitez que votre code fonctionne également sur Android, rester en 32 bits est une option sûre.

Graham
la source
Je voudrais discuter contre votre position sur les tests réduits. Je recommanderais plutôt de tester sur plusieurs plates-formes, en particulier avec non seulement des tailles de registres différentes, mais également des ordres d'octets différents, tout comme un moyen simple d'augmenter les tests et de détecter les erreurs subtiles. De plus, je ferais également des tests sur des ordinateurs qui ne répondent pas à la configuration matérielle minimale recommandée car cela exposerait également des problèmes supplémentaires qui pourraient ne pas apparaître, sauf dans le cas de très grands ensembles de données.
hildred
@hildred Avec une ressource de test illimitée, je serais d'accord. En pratique cependant, si vous contrôlez mieux votre cible, vous n’aurez peut-être pas besoin de faire ce test immédiatement. Ce n'est pas du tout un "moyen facile" non plus - vous pouvez certes simuler certaines de ces plates-formes dans une VM, mais si vous avez besoin d'une configuration matérielle physique, cela implique de grandes quantités de travail manuel (non automatisable). Cela peut vous éviter d'écrire un test harnais pour le tester explicitement, mais ce n'est absolument pas gratuit.
Graham
1
Pas gratuit, mais carrément bon marché. Si vous limitez vos tests hors plate-forme à des tests automatisés, des tests idiots occasionnels et du matériel utilisé En plus de votre configuration, vos coûts pour des tests réussis après votre configuration initiale seraient limités à l'alimentation et à environ 7 minutes de travail par test. Le coût des tests ayant échoué serait bien sûr plus élevé, mais ceux-ci auraient généralement plus de valeur (il y a toujours une défaillance matérielle). Ce type de configuration est particulièrement utile pour les programmeurs car il expose facilement une certaine classe de problèmes de pointeur qu'il est difficile de détecter.
hildred