¿Qué significa que un programa sea de 32 o 64 bits?
32bit-64bit (7)
Esta pregunta: ¿Cuántos bits contiene una PALABRA en el SO de 32/64 bit respectivamente? , menciona que el tamaño de la palabra se refiere al tamaño de bit de un registro de procesador, lo que entiendo que significa el número de bits en los que opera un procesador de computadora / es decir, la cantidad "indivisible" más pequeña de bits en que opera un procesador.
¿Es eso correcto? Usando software como Word / Excel / etc, los instaladores tienen la opción de una instalación de 32 bits o de 64 bits. ¿Cuál es la diferencia?
Dado que la arquitectura de la computadora es fija, me parece que el software de ''32 bits ''estaría diseñado para alinearse con una arquitectura de computadora que tenga una arquitectura de 32 bits. Y un programa de 64 bits haría esfuerzos para alinear los conjuntos de instrucciones con tamaños de palabras de 64 bits.
¿Es eso correcto?
Aquí se hace una pregunta muy similar: desde el punto de vista de la programación, ¿qué significa cuando un programa es de 32 o 64 bits? - y la respuesta aceptada menciona que la diferencia es la cantidad de memoria que se puede asignar a una aplicación. Pero esto es demasiado vago, a menos que el software de 32 bits / 64 bits como concepto no tenga ninguna relación con el tamaño del procesador de palabras de 32 bits / 64 bits.
Usando software como Word / Excel / etc, los instaladores tienen la opción de una instalación de 32 bits o de 64 bits. ¿Cuál es la diferencia?
Esto depende de la CPU utilizada:
En las CPU SPARC, la diferencia entre los programas de "32 bits" y "64 bits" es exactamente lo que piensa:
Los programas de 64 bits utilizan operaciones adicionales que no son compatibles con las CPU SPARC de 32 bits. Por otro lado, el sistema operativo Solaris o Linux coloca los datos a los que acceden los programas de 64 bits en áreas de memoria a las que solo se puede acceder mediante instrucciones de 64 bits. Esto significa que un programa de 64 bits incluso DEBE utilizar instrucciones no compatibles con las CPU de 32 bits.
Para CPUs x86 esto es diferente:
Las modernas CPU x86 tienen diferentes modos de operación y pueden ejecutar diferentes tipos de código. En los diferentes modos, pueden ejecutar código de 16, 32 o 64 bits.
En los códigos de 16, 32 y 64 bits, la CPU interpreta los bytes de manera diferente:
Los bytes (hexadecimal)
b8 4e 61 bc 00 c3
se interpretarán como:
mov eax,0xbc614e
ret
... en código de 32 bits y como:
mov ax,0x614e
mov sp,0xc300
... en código de 16 bits.
Los bytes en el archivo EXE de la "instalación de 64 bits" y de la "instalación de 32 bits" deben ser interpretados de manera diferente por la CPU.
Y un programa de 64 bits haría esfuerzos para alinear los conjuntos de instrucciones con tamaños de palabras de 64 bits.
El código de 16 bits (ver arriba) puede acceder a los registros de 32 bits cuando la CPU no es una CPU de 16 bits.
Por lo tanto, un "programa de 16 bits" puede acceder a registros de 32 bits en una CPU x86 de 32 o 64 bits.
menciona que el tamaño de palabra se refiere al tamaño de bit de un registro de procesador
Generalmente sí (aunque hay algunas excepciones / complicaciones)
- lo que entiendo es el número de bits que un procesador de computadora opera / es decir, la cantidad "indivisible" más pequeña de bits que un procesador opera.
No, la mayoría de las arquitecturas de procesadores pueden trabajar con valores más pequeños que su tamaño de palabra nativo. Una definición mejor (pero no perfecta) sería la mayor parte de datos que el procesador puede procesar (a través de la ruta de datos de enteros principal) como una sola unidad.
En general, en los sistemas modernos de 32 bits y 64 bits, los punteros son del mismo tamaño que el tamaño de palabra, aunque en muchos sistemas de 64 bits no todos los bits de dicho puntero son realmente utilizables. Es posible tener un modelo de memoria en el que la memoria direccionable sea mayor que el tamaño de palabra nativo del sistema y era común hacerlo en las eras de 8 bits y 16 bits, pero ha caído en desuso desde la introducción de 32 CPUs de bits.
Dado que la arquitectura de la computadora es fija
Si bien la arquitectura física es, por supuesto, fija, muchos procesadores tienen múltiples modos de funcionamiento con diferentes instrucciones y registros disponibles para el programador. En el modo de 64 bits, las funciones completas de la CPU están disponibles; en el modo de 32 bits, el procesador presenta una interfaz compatible hacia atrás que limita las funciones y el espacio de direcciones. Los modos son lo suficientemente diferentes como para que el código se compile para un modo particular.
Como regla general, un sistema operativo que se ejecute en modo de 64 bits puede admitir aplicaciones que se ejecutan en modo de 32 bits, pero no al revés.
Por lo tanto, una aplicación de 32 bits se ejecuta en modo de 32 bits en un procesador de 32 bits que ejecuta un sistema operativo de 32 bits, un procesador de 64 bits que ejecuta un sistema operativo de 32 bits o un procesador de 64 bits que ejecuta un sistema operativo de 64 bits.
Por otro lado, una aplicación de 64 bits normalmente se ejecuta solo en un procesador de 64 bits que ejecuta un sistema operativo de 64 bits.
El tamaño de la palabra es una gran diferencia, pero no es el único. Tiende a definir la cantidad de bits para los que está clasificada una CPU, pero el tamaño de la palabra y la capacidad general solo están relacionados de forma flexible. Y la capacidad general es lo que importa.
En una CPU Intel o AMD, el software de 32 bits frente a los de 64 bits realmente se refiere al modo en que la CPU opera cuando se ejecuta. El modo de 32 bits tiene menos registros e instrucciones más pequeños disponibles, pero la limitación más importante es la cantidad de memoria disponible. El software de 32 bits generalmente se limita a usar entre 2 GB y poco menos de 4 GB de memoria .
Cada byte de memoria tiene una dirección única, que no es muy diferente de cada casa que tiene una dirección postal única. Una dirección de memoria es solo un número que un programa puede usar para encontrar un dato de nuevo una vez que lo ha guardado en la memoria, y cada byte de memoria tiene que tener una dirección. Si una dirección es de 32 bits, entonces hay 2 ^ 32 direcciones posibles, y eso significa 2 ^ 32 bytes direccionables de memoria. En las CPU Intel / AMD de hoy, el tamaño de una dirección de memoria es el mismo que el tamaño de los registros (aunque esto no siempre fue cierto).
Con las direcciones de 32 bits, 4GB (2 ^ 32 bytes) pueden ser direccionados por el programa, sin embargo, hasta la mitad de ese espacio está reservado por el sistema operativo. En el espacio de memoria disponible debe caber el código del programa, los datos y, a menudo, también los archivos a los que se accede. En las PC de hoy, con muchos gigabytes de RAM, esto no puede aprovechar la memoria disponible. Esa es la razón principal por la que 64 bits se ha vuelto popular. Las CPU de 64 bits estuvieron disponibles y se usaron ampliamente (generalmente en el modo de 32 bits) durante varios años, hasta que los tamaños de memoria superiores a 2 GB se hicieron comunes, momento en el que el modo de 64 bits comenzó a ofrecer ventajas reales y se hizo popular. Los 64 bits del espacio de direcciones de la memoria proporcionan 16 exabytes de memoria direccionable (~ 18 quintillones de bytes), que es más de lo que cualquier software actual puede usar, y ciertamente ninguna PC tiene una RAM cercana.
La mayoría de los datos utilizados en aplicaciones típicas, incluso en el modo de 64 bits, no es necesario que sean de 64 bits, por lo que la mayoría aún se almacena en formatos de 32 bits (o incluso más pequeños). Las representaciones comunes de texto ASCII y UTF-8 utilizan formatos de datos de 8 bits. Si el programa necesita mover un gran bloque de texto de un lugar a otro en la memoria, puede intentar hacerlo de 64 bits a la vez, pero si necesita interpretar el texto, probablemente lo hará de 8 bits a la vez. . De manera similar, 32 bits es un tamaño común para enteros (rango máximo de +/- 2 ^ 31, o aproximadamente +/- 2.1 mil millones). 2.1 mil millones es suficiente para muchos usos. Los datos gráficos generalmente se representan de forma natural píxel por píxel, y cada píxel, por lo general, contiene como máximo 32 bits de datos.
Existen desventajas en el uso innecesario de datos de 64 bits. Los datos de 64 bits ocupan más espacio en la memoria y más espacio en la memoria caché de la CPU (memoria muy rápida utilizada por la CPU para el almacenamiento a corto plazo). La memoria solo puede transferir datos a una velocidad máxima, y los datos de 64 bits son el doble de grandes. Esto puede reducir el rendimiento si se usa desperdiciado. Y si es necesario admitir versiones de software de 32 y 64 bits, el uso de valores de 32 bits siempre que sea posible puede reducir las diferencias entre las dos versiones y facilitar el desarrollo (aunque no siempre funciona de esa manera).
Antes de los 32 bits, la dirección y el tamaño de la palabra eran generalmente diferentes (por ejemplo, 8086/88 de 16 bits con direcciones de memoria de 20 bits pero registros de 16 bits, o 6502 de 8 bits con direcciones de memoria de 16 bits, o incluso principios de 32 bits). ARM de bits con direcciones de 26 bits). Si bien ningún programador ha puesto nunca la cabeza en mejores registros, el espacio de la memoria suele ser la verdadera fuerza motriz para cada generación avanzada de tecnología. Esto se debe a que la mayoría de los programadores rara vez trabajan directamente con registros, pero sí trabajan directamente con la memoria, y las limitaciones de la memoria causan directamente desagrado para el programador, y en el caso de 32 bits a 64 bits, también para el usuario.
En resumen, si bien existen diferencias tecnológicas reales e importantes entre los distintos tamaños de bit, lo que realmente significa 32 bits o 64 bits (o 16 bits u 8 bits) es simplemente una colección de capacidades que tienden a estar asociadas con CPUs de una generación tecnológica particular, y / o software que aproveche esas capacidades. La longitud de la palabra es una parte de eso, pero no la única, o necesariamente la parte más importante.
Fuente: Han sido programadores a través de todas estas eras tecnológicas.
La información que tienes es una buena parte de la imagen, pero no toda. No soy un experto en procesadores, por lo que es probable que falten algunos detalles.
Los 32 bits frente a 64 bits están relacionados con la arquitectura del procesador. Un aumento en el tamaño de la palabra hace algunas cosas:
- El tamaño de palabra más grande permite definir más instrucciones. Por ejemplo, un procesador de 8 bits que realiza una única instrucción de carga solo puede tener 256 instrucciones en total, donde un tamaño de palabra más grande permite definir más instrucciones en el microcódigo de los procesadores. Obviamente, hay un límite a la cantidad de instrucciones realmente útiles que se definen.
- Se pueden procesar más datos con un solo ciclo de instrucciones, ya que hay más bits disponibles. Esto acelera la ejecución.
- Como ha dicho, también permite el acceso a un espacio de memoria más grande sin tener que hacer cosas como ciclos de direcciones múltiples, o multiplexar palabras de datos altos / bajos.
Cuando la arquitectura del procesador se mueva de 32 bits a 64 bits, es probable que el fabricante del chip mantenga la compatibilidad con el conjunto de instrucciones anterior, de modo que todo el software que se desarrolló anteriormente todavía se ejecutará en la nueva arquitectura. Cuando se dirige a la arquitectura de 64 bits, el compilador tendrá nuevas instrucciones disponibles y esquemas de direccionamiento de memoria con los que procesar los datos de manera más eficiente.
La respuesta a la que hace referencia describe los beneficios de 64 bits sobre 32 bits. En cuanto a lo que realmente es diferente acerca del programa en sí, depende de su perspectiva.
En general, el código fuente del programa no tiene que ser diferente en absoluto.
La mayoría de los programas se pueden escribir de modo que se compilen perfectamente bien como programas de 32 bits o de 64 bits, según lo controlado por la elección adecuada de compilador y / o opciones de compilador.
Sin embargo, a menudo hay
algún
impacto en la fuente, ya que un compilador (C) que apunta a 64 bits puede elegir definir sus tipos de manera diferente.
En particular,
long int
tiene una ubicuidad de 32 bits de ancho en plataformas de 32 bits, pero tiene 64 bits de ancho en muchas (pero no todas) plataformas de 64 bits.
Esto puede ser una fuente de errores en el código que hace suposiciones injustificadas sobre tales detalles.
Las principales diferencias están todas en el binario. Los programas de 64 bits hacen uso de los conjuntos completos de instrucciones de sus CPU de destino de 64 bits, que invariablemente contienen instrucciones que las CPU de contraparte de 32 bits no contienen. Usarán registros que las CPU de contraparte de 32 bits no tienen. Usarán las convenciones de llamada de función apropiadas para su CPU de destino, lo que a menudo significa pasar más argumentos en los registros que los programas de 32 bits. El uso de estas y otras funciones de las CPU de 64 bits ofrece ventajas funcionales, como la capacidad de utilizar más memoria y (a veces) un rendimiento mejorado.
Un programa se ejecuta sobre una arquitectura determinada (arco o ISA), que es implementada por los procesadores. Normalmente, una arquitectura define un tamaño de palabra "principal", que es el tamaño que tienen la mayoría de los registros y las operaciones en esos registros (aunque puede diseñar arquitecturas que funcionan de manera diferente). Esto generalmente se denomina tamaño de palabra "nativo", aunque una arquitectura puede permitir operaciones que utilizan registros de diferentes tamaños.
Además, los procesadores usan la memoria, y necesitan abordar esa memoria de alguna manera, esto significa operar con esas direcciones. Por lo tanto, las direcciones generalmente se pueden almacenar y manipular como cualquier otro número, lo que significa que usted tiene registros capaces de retenerlas. Aunque no es necesario que esos registros coincidan con el tamaño de palabra ni que una dirección se calcule a partir de un solo registro, en algunas arquitecturas este es el caso.
A lo largo de la historia, ha habido muchas arquitecturas de diferentes tamaños de palabra, incluso las extrañas. Hoy en día, puede encontrar fácilmente procesadores a su alrededor que no sean solo de 32 y 64 bits, sino también, por ejemplo, de 8 y 16 bits (normalmente en dispositivos integrados). En la computadora de escritorio típica, está utilizando x86 o x64, que son de 32 y 64 bits respectivamente.
Por lo tanto, cuando dice que un programa es de 32 bits o de 64 bits, se refiere a una arquitectura particular. En el escenario de escritorio popular, te refieres a x86 vs. x64. Hay muchas preguntas, artículos y libros que discuten las diferencias entre los dos.
Ahora, una nota final: por razones de compatibilidad, los procesadores x64 pueden operar en diferentes modos, uno de los cuales es capaz de ejecutar el código de 32 bits desde x86. Esto significa que si su computadora es x64 (probable) y si su sistema operativo es compatible (también es probable, por ejemplo, Windows de 64 bits), aún puede ejecutar programas compilados para x86.
Respuesta corta: esta es una convención basada únicamente en el ancho del bus de datos subyacente
Un programa de n bits es un programa que está optimizado para una CPU de n bits. Dicho de otro modo, un programa de 64 bits es un programa binario compiled para una CPU de 64 bits. Una CPU de 64 bits, a su vez, es una que aprovecha un bus de datos de 64 bits para el intercambio de datos entre la CPU y la memoria.
Eso es tan simple, pero puedes leer más abajo.
La definición realmente redirige a la comprensión de lo que es una CPU de 32/64 bits, indirectamente a lo que es un sistema operativo de 32/64 bits, y cómo los compiladores optimizan los binarios para una arquitectura determinada.
La optimización aquí abarca el formato del binario en sí. Los binarios de 32 bits y de 64 bits para un sistema operativo determinado, por ejemplo, un binario de Windows, tienen formatos diferentes. Sin embargo, un determinado SO de 64 bits, por ejemplo, Windows 64, podrá leer y lanzar un archivo binario de 32 bits escrito para la versión de 32 bits y un bus de datos de 32 bits de ancho.
CPU 32/64 bit, primera definición
La CPU puede almacenar / recuperar una cierta cantidad de datos en la memoria en una sola instrucción. Una CPU de 32 bits puede transferir 4 bytes (32 bits) a la vez y una CPU de 64 bits puede transferir 8 bytes (64 bits) a la vez. Por lo tanto, el prefijo "32/64 bit" proviene de la cantidad de RAM transferida en un solo ciclo de lectura / escritura.
Esta cantidad afecta el tiempo de ejecución: cuanto menos ciclos de transferencia se requieren, menos espera la CPU a la memoria, el programa se ejecuta más rápido. Es como llevar una gran cantidad de agua con un cubo pequeño o grande.
El tamaño del depósito (el número de bits utilizados para la transferencia de datos) se utiliza para indicar qué tan eficiente es la arquitectura, por lo tanto, para la misma CPU, una aplicación de 32 bits es menos eficiente que una aplicación de 64 bits.
CPU 32/64 bit, definición técnica.
Obviamente, tanto la RAM como la CPU deben poder administrar una transferencia de datos de 32/64 bits, que a su vez determina la cantidad de cables utilizados para conectar la CPU a la RAM ( bus del sistema ). 32/64 bit es en realidad el número de cables / pistas que componen el bus de datos (generalmente denominado el "ancho" del bus).
(Wikipedia:
Bus del sistema
: el ancho del bus de datos determina el prefijo de 32/64 bits para una CPU, un programa, un SO, ...)
(Otro bus es el bus de dirección , que generalmente es más ancho, pero el ancho del bus de dirección es irrelevante al nombrar una CPU como CPU de 32 o 64 bits. El ancho del bus de dirección determina la cantidad total de RAM que puede alcanzarse / "direccionarse" mediante la CPU, por ejemplo, 2 GB o 32 GB. En cuanto al bus de control , es un bus pequeño que se utiliza para sincronizar todo lo conectado al bus de datos, en particular, indica cuándo el bus de datos está estable y listo para ser muestreado en un dato. operación de transferencia).
Cuando los bits se transfieren entre la CPU y la RAM, el voltaje en las diferentes pistas de cobre del bus de datos debe ser estable antes de leer los datos en el bus, de lo contrario, uno o más valores de bits serían incorrectos. Se necesita menos tiempo para estabilizar 8 bits que 64 bits, por lo que aumentar el ancho del bus de datos no es sin problemas para resolver.
Programa de 32/64 bits: un compilador importa
Los programas no siempre necesitan transferir 4 bytes (bus de datos de 32 bits) u 8 bytes (bus de datos de 64 bits), por lo que usan diferentes instrucciones para leer 1 byte, 2 bytes, 4 bytes y 8 bits, para el rendimiento razones.
Los binarios (programas de lenguaje ensamblador nativo) se escriben teniendo en cuenta la arquitectura de 32 bits o la arquitectura de 64 bits y el conjunto de instrucciones asociado. Así que el nombre del programa de 32/64 bits.
La elección de la arquitectura de destino es una cuestión de compilador / opciones de compilador utilizadas al convertir el programa fuente en un binario. La mayoría de los compiladores pueden producir un binario de 32 bits o 64 desde el mismo programa fuente. Es por eso que encontrará ambas versiones de una aplicación cuando descargue su programa o herramienta preferida.
Sin embargo, la mayoría de los programas se basan en bibliotecas listas para usar escritas por otros programadores (por ejemplo, un programa de edición de video puede usar la biblioteca FFmpeg ). Para producir una aplicación totalmente de 64 bits, el compilador (en realidad el editor de enlaces, pero sea sencillo) necesita acceder a una versión de 64 bits de cualquier biblioteca utilizada, lo que puede no ser posible.
Esto también se aplica a los sistemas operativos, ya que un sistema operativo es solo un conjunto de programas y bibliotecas individuales. Sin embargo, un sistema operativo es en sí mismo una especie de gran biblioteca para los programas del usuario, que actúa como una puerta de enlace entre el hardware de la computadora y los programas del usuario, por razones de eficiencia y seguridad. La forma en que se escribe el sistema operativo del automóvil impide que los programas del usuario accedan a todo el potencial de la arquitectura de CPU subyacente.
Compatibilidad de programas de 32 bits con CPU de 64 bits.
Un sistema operativo de 64 bits puede ejecutar un binario de 32 bits en una arquitectura de 64 bits, ya que el conjunto de instrucciones de la CPU de 64 bits es retro compatible. Sin embargo, se requieren algunos ajustes.
Además del ancho del bus de datos y el subconjunto de instrucciones de lectura / escritura, hay muchas otras diferencias entre la CPU de 32 y 64 bits (operaciones de registro, cachés de memoria, alineación de datos / límites, temporización, ...).
Ejecutando un programa de 32 bits en una arquitectura de 64 bits:
- es más eficiente que ejecutarlo en una arquitectura de 32 bits más antigua (casi solo debido a la mejora de la velocidad del reloj de la CPU en comparación con las generaciones de CPU de 32/64 bits más antiguas)
-
es menos eficiente que ejecutar la misma aplicación compilada en un binario de 64 bits para aprovechar la arquitectura de 64 bits, en particular, la capacidad de transferir 64 bits a la vez desde / a la memoria.
Al compilar una fuente en un binario de 32 bits, el compilador seguirá utilizando pequeños depósitos, en lugar de los más grandes disponibles con el bus de datos de 64 bits. Esto tiene el mayor impacto en la velocidad de ejecución, en comparación con la misma aplicación compilada para usar depósitos grandes.
Para obtener información, las aplicaciones compiladas en binarios de Windows de 16 bits (versiones anteriores de Windows que se ejecutan en 80-286 CPU con un bus de datos de 16 bits) ya no son totalmente compatibles, aunque todavía existe la posibilidad en Windows 10 de activar NTVDM .
El caso de .NET, Java y otros interpretados "byte-code"
Mientras que hasta hace pocos años, los compiladores se utilizaban para traducir un programa fuente (por ejemplo, una fuente C ++) a un programa en lenguaje de máquina, este método ahora está en regresión.
El principal problema es que el lenguaje de máquina para algunas CPU no es el mismo que para otro (piense en las diferencias entre un teléfono inteligente que usa un chip ARM y un servidor que usa un chip Intel ). Definitivamente no puede usar el mismo binario en ambos hardware, no hablan el mismo idioma, e incluso si esto fuera posible, sería ineficiente en ambas máquinas debido a las enormes diferencias en cómo funcionan.
La idea actual es utilizar una representación intermedia (IR) de las instrucciones, derivada de la fuente. Java (Sun, lamentablemente ahora Oracle) e IL (Microsoft) son tales representaciones intermedias. El mismo archivo IR se puede utilizar en cualquier sistema operativo compatible con IR.
Una vez que el sistema operativo abre el archivo, realiza la compilación final en el lenguaje de máquina "local" entendido por la CPU real y teniendo en cuenta la arquitectura final en la que se ejecuta el programa. Por ejemplo, para Microsoft .NET, la versión universal es ejecutada por una máquina virtual CoreCLR ubicada en la computadora final. Por lo general, no hay una noción de ancho de bus de datos en dichos idiomas intermedios, por lo que cada vez menos aplicación tendrá este prefijo de n bits.
Sin embargo, no podemos olvidar la arquitectura real, por lo que aún se producirán versiones de 32 y 64 bits para CoreCLR para optimizar el código final, incluso si la aplicación en sí, en el nivel de IR, no está optimizada para una arquitectura determinada (solo un IR). Versión para descargar e instalar).