Pregunta Sistemas de 32 bits frente a sistemas de 64 bits


¿Cuáles son las diferencias entre los sistemas de 32 bits y de 64 bits?

Si los ha usado a ambos, ¿qué tipo de diferencias agudas ha experimentado?

¿Sería un problema utilizar programas de 32 bits en sistemas de 64 bits en algunos casos?


219


origen


Aquí hay muchas confusiones y, en otro lugar, en la web, entre el direccionamiento físico (acceso al ram), el PEA afecta esto, el motherboard afecta esto y el direccionamiento lógico (memoria virtual por proceso). En un sistema operativo de 32 bits, la memoria virtual está limitada a 4 GB menos lo que reserva el kernel. Es independiente de la RAM, podría tener 0.1MB u 8GB de RAM y tendría exactamente 4GB de memoria virtual (pero algunos reservados por kernel). PEA se puede usar para tener más RAM, pero no es una respuesta perfecta ya que el kernel NO PUEDE acceder a todo. - ctrl-alt-delor


Respuestas:


Nota: Estas respuestas se aplican a las CPU de PC estándar basadas en x86 (Intel y AMD) y Windows (como las que se suelen configurar para los usuarios finales). Otros chips de 32 bits o 64 bits, otros sistemas operativos y otras configuraciones de sistema operativo pueden tener diferentes ventajas y desventajas.

Desde una perspectiva técnica, un sistema operativo de 64 bits te ofrece:

  • Permite que los procesos individuales aborden más de 4 GB de RAM cada uno (en la práctica, la mayoría pero no todos los sistemas operativos de 32 bits también limitan la RAM del sistema total utilizable a menos de 4 GB, no solo el máximo por aplicación).

  • Todos los punteros toman 8 bytes en lugar de 4 bytes. El efecto en el uso de RAM es mínimo (porque no es probable que tenga una aplicación llena de gigabytes de punteros), pero en el peor caso teórico, esto puede hacer que la memoria caché de la CPU sea capaz de contener 1/2 punteros (haciendo será efectivamente 1/2 del tamaño). Para la mayoría de las aplicaciones, esto no es un gran problema.

  • Hay muchos más registros de CPU de propósito general en el modo de 64 bits. Los registros son la memoria más rápida en todo su sistema. Solo hay 8 en el modo de 32 bits y 16 registros de propósito general en el modo de 64 bits. En las aplicaciones informáticas científicas que he escrito, he visto un aumento del rendimiento de hasta un 30% mediante la recompilación en modo de 64 bits (mi aplicación realmente podría usar los registros adicionales).

  • La mayoría de los sistemas operativos de 32 bits realmente solo permiten que las aplicaciones individuales usen 2 GB de RAM, incluso si tiene 4 GB instalados. Esto se debe a que los otros 2 GB de espacio de direcciones están reservados para compartir datos entre aplicaciones, con el sistema operativo y para comunicarse con los controladores. Windows y Linux le permitirán ajustar esta compensación para que sea de 3 GB para aplicaciones y 1 GB compartida, pero esto puede causar problemas para algunas aplicaciones que no esperan el cambio. También creo que podría paralizar una tarjeta gráfica que tiene 1 GB de RAM (pero no estoy seguro). Un sistema operativo de 64 bits puede dar a las aplicaciones individuales de 32 bits más cerca de los 4 GB completos para jugar.

Desde la perspectiva de un usuario:

  • La velocidad de la aplicación suele ser más rápida para una aplicación de 64 bits en un sistema operativo de 64 bits en comparación con la versión de 32 bits de la aplicación en un sistema operativo de 32 bits, pero la mayoría de los usuarios no verán esta aceleración. La mayoría de las aplicaciones para usuarios normales realmente no aprovechan los registros adicionales o los beneficios se equilibran con punteros más grandes que llenan la caché.

  • Si tiene alguna aplicación de memoria (como editores de fotos, procesamiento de video, informática científica, etc.), si tiene (o puede comprar) más de 3 GB de RAM, y puede obtener una versión de 64 bits de la aplicación, la elección es fácil: use el sistema operativo de 64 bits.

  • Algunos hardware no tienen controladores de 64 bits. Verifique su placa base, todas las tarjetas de plug-in y todos los dispositivos USB antes de hacer el cambio. Tenga en cuenta que en los primeros días de Windows Vista, había muchos problemas con los controladores. En estos días, las cosas en general son mejores.

  • Si ejecuta tantas aplicaciones a la vez que se está quedando sin memoria RAM (generalmente puede ver esto porque su computadora comienza a estar muy lenta y escucha el crujido de la unidad de disco duro), entonces querrá un sistema operativo de 64 bits (y suficiente RAM).

  • Puede ejecutar aplicaciones de 32 bits (pero no controladores) en Windows de 64 bits sin problemas. La peor ralentización que he medido para una aplicación de 32 bits en Windows de 64 bits es de aproximadamente 5% (lo que significa que si tardó 60 segundos para hacer algo en Windows de 32 bits, tardó como máximo 60 * 1.05 = 65 segundos con la misma aplicación de 32 bits en Windows de 64 bits).

¿Qué hace 32 bits frente a 64 bits? no implicar:

En sistemas x86, 32 bits frente a 64 bits directamente se refiere al tamaño de los punteros. Eso es todo.

  • No se refiere al tamaño de la C int tipo. Eso es decidido por la implementación particular del compilador, y la mayoría de los compiladores populares eligen 32 bits int en sistemas de 64 bits.

  • No es asi directamente consulte el tamaño de los registros normales que no sean punteros. Sin embargo, el uso de registros aritméticos de 64 bits requiere que la aplicación y el sistema operativo se ejecuten también en el modo de puntero de 64 bits.

  • No es asi directamente consulte el tamaño del bus de direcciones físicas. Por ejemplo, un sistema con líneas de caché de 64 bits de ancho y un máximo de 512 Gb de memoria solo necesita 33 bits en su bus de direcciones (es decir, log2(512*1024**3) - log2(64) = 33)

  • No se refiere al tamaño del bus físico de datos: eso está más relacionado con los costos de fabricación (número de pines en el zócalo de la CPU) y el tamaño de la línea de caché.


262



Muy buena respuesta. Especialmente porque notó que en realidad no hay un límite de RAM de 4 gb, pero límite de uso de memoria de proceso. Solo para su información, creo que debería echar un vistazo a este enlace: unawave.de/windows-7-tipps/32-bit-ram-barrier.html?lang=EN - Breakthrough
Son aplicaciones que no funcionan en una ventana de 64 bits: aplicaciones de 16 bits / aquellas que usan controladores de 32 bits o kernel sin firmar. Eso es mucho para un adicto al software como yo ... - fluxtendu
@flextendu, dados los requisitos de rendimiento de esos viejos programas, casi con seguridad podría ejecutarlos en una máquina virtual. Con VMware Player, Virtual PC y Virtual Box, no hay ninguna razón para no probar uno de ellos, si tiene una licencia de 32 bits de Windows. Si no quiere meterse con eso, probablemente también funcionará en "Modo Windows XP". - Mark Booth
Por cierto, las aplicaciones de 32 bits no usarán más de 2 GiB de RAM a menos que se active un indicador específico en su manifiesto. Fuente: blogs.technet.com/b/markrussinovich/archive/2008/11/17/... - Hello71
Sí, estoy seguro de que Hello71 ha encontrado algo muy importante que no se trata aquí: la mayoría de las aplicaciones de 32 bits nunca se aprovecharán directamente de la RAM extra. Creo que esto vale la pena mencionar, ¿no? - Django Reinhardt


Básicamente puedes hacer todo a una escala mayor:

  1. RAM por sistema operativo: Límite de RAM de 4 GB en x86 para el sistema operativo (la mayoría de las veces)
  2. RAM por proceso: Límite de RAM de 4 GB en x86 para procesos (siempre). Si crees que esto no es importante, intenta ejecutar una gran aplicación de base de datos MSSQL. Utilizará> 4GB en sí si lo tienes disponible y funciona mucho mejor.
  3. Direcciones: Las direcciones son 64 bits en lugar de 32 bits, lo que le permite tener programas "más grandes" que usan más memoria.
  4. Manijas disponibles para programas: Puede crear más manejadores de archivos, procesos, ... Ejemplo en Windows x64 puede crear> 2000 hilos por proceso, pero en x86 más cerca de unos cientos.
  5. Programas más amplios disponibles: Desde un x64 puede ejecutar programas x86 y x64. (Ventanas de ejemplo: wow64, windows32 en la emulación de Windows64)
  6. Opciones de emulación: Desde un x64 puede ejecutar máquinas virtuales x86 y x64.
  7. Más rápido: Algunos cálculos son más rápidos en una CPU de 64 bits
  8. División de múltiples recursos del sistema: Una gran cantidad de memoria RAM es muy importante cuando desea ejecutar al menos una máquina virtual que divide los recursos de su sistema.
  9. Programas exclusivos disponibles: Varios programas nuevos solo son compatibles con x64. Ejemplo de Exchange 2007.
  10. ¿Future x86 obsoleto ?: Con el tiempo, se usarán más y más 64 bits y no se usará más y más x86. Por lo tanto, los proveedores admitirán solo 64 bits más y más.

Los dos grandes tipos de arquitecturas de 64 bits son las arquitecturas x64 e IA64. Pero x64 es el más popular de lejos.

x64 puede ejecutar comandos x86 y comandos x64. IA64 también ejecuta comandos x86, pero no hace extensiones SSE. Hay hardware dedicado en Itanium para ejecutar instrucciones x86; es un emulador, pero en hardware.

Como @Phil mencionó, puedes obtener una mirada más profunda de cómo funciona aquí.


107



Um. IA64 ejecuta comandos x86. Sin embargo, no hace extensiones SSE. Hay hardware dedicado en Itanium para ejecutar instrucciones x86; es un emulador, pero en hardware. - tzot
Hace unos años, Raymond Chen publicó sobre el "límite" del hilo de 2000, y es más o menos una leyenda urbana: blogs.msdn.com/oldnewthing/archive/2005/07/29/444912.aspx - bk1e
Voto a favor de Arstechnica por su explicación. - Avihu Turzion
El límite de memoria RAM de 4 GB no es del todo cierto (más bien es un límite artificial para los usuarios de sistemas domésticos de Windows), verifique PAE. Con el hardware más actualizado, un kernel PAE de Linux (que es el que se utiliza de forma predeterminada para 32 bits) puede resolver más de 4 GB sin problemas. Lo mismo se aplica a FreeBSD y NetBSD. - Izzy
Los sistemas de 32 bits no pueden usar más de 4 GB (1er punto) debido a esas "direcciones" (3er punto). Porque el número más alto de 32 bits es 4.294.967.296 (= 4 GB). Entonces, sus 1er y 3er punteo son los MISMOS. Puedes eliminar el 3er punto. :) - Jet


El mayor impacto que la gente notará en este momento es que una PC de 32 bits solo puede abordar un máximo de 4 GB de memoria. Cuando elimine la memoria asignada para otros usos por el sistema operativo, su PC probablemente solo muestre alrededor de 3,25 GB de memoria utilizable. Pasa a 64 bits y este límite desaparece.

Si estás haciendo un desarrollo serio, entonces esto podría ser muy importante. Intente ejecutar varias máquinas virtuales y pronto se quedará sin memoria. Es más probable que los servidores necesiten la memoria extra, por lo que descubrirá que el uso de 64 bits es mucho mayor en los servidores que en los equipos de escritorio. La ley de Moore garantiza que tendremos cada vez más memoria en las máquinas y, por lo tanto, en algún momento las computadoras de escritorio también cambiarán a 64 bits como estándar.

Para una descripción mucho más detallada de las diferencias del procesador, consulte este excelente artículo de ArsTechnica.


46



La plataforma de 32 bits y la limitación de 4 GB es un nombre poco apropiado y es (principalmente) un límite de elección / diseño arquitectónico del sistema operativo. Realmente, el 4GB de 32 bits está realmente en un límite en un espacio VA de proceso. La dirección física admite 36 bits en CPU Intel de 32 bits - Tall Jeff
Haces un buen punto que es ciertamente cierto. Pero el impacto en el mundo real de los usuarios de PC es que allí la máquina no va a usar los 4GB completos que pagaron. Mi padre tenía este problema y todavía está confundido de que los 4 GB que pagó no se pueden usar por completo.
Aprecie su punto, pero simplemente tratando de impulsar la idea de que la solución no está en el procesador o yendo a 64 bits, es solo cuestión de un diseño del sistema operativo ligeramente mejorado. Esto se aborda, por ejemplo, en las versiones empresariales de Windows incluso en versiones de 32 bits. Permite 64 GB de RAM. - Tall Jeff
Técnicamente, el límite no desaparece. Se mueve más allá donde no es práctico / imposible instalar tanta RAM en una máquina en cualquier momento en la próxima década más o menos.
Ver mi comentario sobre PAE arriba: el límite de 4 GB no es verdadero para todo el sistema, pero solo se aplica a procesos individuales (ningún proceso puede acceder a 4 GB y sí mismo), pero todo el sistema, es decir, todos los procesos en conjunto, puede con PAE habilitado). Entonces, a menos que uno tenga aplicaciones que se beneficien de poder acceder a 4GB y más (como editores de video / conversores con grandes archivos de video) y 8GB + instalado, no debería hacer mucha diferencia si usa 32 bits o 64 bits. - Izzy


Nada es gratis: aunque las aplicaciones de 64 bits poder acceder a más memoria que las aplicaciones de 32 bits, el inconveniente es que necesitar más memoria. Todos esos punteros que solían necesitar 4 bytes, ahora necesitan 8. Por ejemplo, el requisito predeterminado en Emacs es un 60% más de memoria cuando está diseñado para una arquitectura de 64 bits. Esta huella extra perjudica el rendimiento en todos los niveles de la jerarquía de la memoria: los archivos ejecutables más grandes tardan más en cargarse desde el disco, los conjuntos de trabajo más grandes causan más paginación y los objetos más grandes significan un menor ajuste en los cachés del procesador. Si piensa en una CPU con una memoria caché de 16K L1, una aplicación de 32 bits puede funcionar con 4096 indicadores antes de que falle y vaya a la caché L2, pero una aplicación de 64 bits debe alcanzar la caché L2 después de solo 2048 indicadores.

En x64, esto se ve mitigado por otras mejoras arquitectónicas, como más registros, pero en PowerPC, si su aplicación no puede usar> 4G, es probable que se ejecute más rápido en "ppc" que "ppc64". Incluso en Intel hay cargas de trabajo que se ejecutan más rápido en x86, y pocas ejecutan más de un 5% más rápido en x64 que x86.


31



Esta respuesta sugiere que PowerPC64 no es tan bueno como x86-64. La verdad es que powerpc64 no mejoró powerpc, ya que powerpc no se rompió. - ctrl-alt-delor
Linux ahora tiene un ABI x32, con todos los beneficios de velocidad de x86-64 (más registros, ABI rediseñado), pero con punteros de 32 bits. +1 para señalar que los beneficios del modo de 64 bits no provienen del aumento del ancho real, sino de la posibilidad de dejar caer una gran parte del equipaje que estaba reteniendo la arquitectura. Regs de 64 bits tienen valor para algunas aplicaciones, pero el espacio del puntero de 64 bits se necesita con menos frecuencia. - Peter Cordes


Un sistema operativo de 64 bits puede usar más RAM. Eso es todo, en la práctica. Vista / 7 de 64 bits utiliza características de seguridad más elegantes para colocar componentes vitales en la RAM, pero eso no es realmente "notorio" como tal.

De ChrisInEdmonton:

Un sistema operativo de 32 bits en un ix86   sistema con PAE puede abordar hasta 64   GB de RAM. Un sistema operativo de 64 bits   en x86-64 puede acceder a hasta 256 TB de   espacio de direcciones virtuales, aunque esto puede   ser criado en procesadores posteriores, hasta   a 16 EB. Tenga en cuenta que algunos operativos   los sistemas limitan el espacio de direcciones   más, y la mayoría de las placas base   tiene restricciones adicionales


19



Para un sistema operativo, SÓLO 32 bits frente a 64 bits se refiere al tamaño de los indicadores (lo que su primer párrafo discute correctamente). -1: Algunos sistemas operativos eligen bloquear el tamaño entero predeterminado al tamaño del puntero, pero ni Windows ni Linux lo hacen. La precisión matemática entera no se modifica. Ningún sistema operativo ampliamente utilizado cambia la precisión del punto flotante (lo que dice el segundo párrafo). "flotante" o "simple" es de 32 bits, "doble" es de 64 bits, independientemente de si el sistema operativo usa punteros de 32 bits o de 64 bits. - Mr Fooz
Ah, estaba claramente equivocado, gracias por aclarar eso :) - Phoshi
No hay problema. -1 -> +1 - Mr Fooz
Puede valer la pena editar su respuesta para indicar la cantidad de memoria RAM que se puede acceder. Un sistema operativo de 32 bits en un sistema ix86 con PAE puede gestionar hasta 64 GB de RAM. Un sistema operativo de 64 bits en x86-64 puede acceder a hasta 256 TB de espacio de direcciones virtuales, aunque esto puede plantearse en procesadores posteriores, hasta 16 EB. Tenga en cuenta que algunos sistemas operativos limitan aún más el espacio de direcciones, y la mayoría de las placas base tendrán restricciones adicionales. - ChrisInEdmonton
Quería hacerlo simple, ya que los números son principalmente lo suficientemente alto como para ser irrelevante en este momento, pero no puede hacer daño meterlos ahora. - Phoshi


No estoy seguro de poder responder todas sus preguntas sin escribir un ensayo completo (siempre hay Google ...), pero no necesita diseñar sus aplicaciones de manera diferente para 64 bits. Supongo que lo que se refiere es que hay que tener en cuenta que los tamaños de los punteros ya no son del mismo tamaño que los enteros. Y tiene una gran cantidad de problemas potenciales con suposiciones incorporadas sobre ciertos tipos de datos que tienen cuatro bytes de largo y que pueden no ser verdaderos.

Es probable que esto afecte a todo tipo de cosas en su aplicación, desde guardar / cargar desde un archivo, iterar a través de datos, alineación de datos, hasta operaciones en bits en datos. Si tiene una base de código existente que está tratando de portar, o si trabaja en ambas, es probable que tenga muchos inconvenientes para solucionar.

Creo que este es un problema de implementación, en lugar de uno de diseño. Es decir. Creo que el "diseño" de, por ejemplo, un paquete de edición de fotos será el mismo sea cual sea el tamaño de palabras. Escribimos código que se compila en versiones de 32 bits y de 64 bits, y el diseño ciertamente no difiere entre los dos: es la misma base de código.

El "gran problema" fundamental en 64 bits es que obtienes acceso a un espacio de direcciones de memoria mucho más grande que 32 bits. Esto significa que realmente puedes agregar más de 4 Gb de memoria a tu computadora y realmente hacer que marque la diferencia.

Estoy seguro de que otras respuestas entrarán en detalles y se beneficiarán más que yo.

En términos de detección de la diferencia, entonces programáticamente solo verifica el tamaño de un puntero (por ejemplo, sizeof (void *)). La respuesta de 4 significa sus 32 bits, y 8 significa que se está ejecutando en un entorno de 64 bits.


14



Si escribe programas que supongan casualmente que ciertos tipos de apuntadores son del mismo tamaño que ciertos tipos integrales, lo hará. Esto ha sido así por mucho tiempo. - David Thornley
@David: Tienes toda la razón. Desafortunadamente, hay un montón de código que hace exactamente eso.


Un proceso de 32 bits tiene un espacio de direcciones virtuales de 4 GB; esto podría ser muy poco para algunas aplicaciones. Una aplicación de 64 bits tiene un espacio de direcciones prácticamente ilimitado (por supuesto, es limitado, pero lo más probable es que no llegue a este límite).

En OSX hay otras ventajas. Ver el Artículo siguiente, por qué tener kernel ejecutado en el espacio de direcciones de 64 Bits (independientemente de si su aplicación ejecuta 64 o 32) o ejecutar su aplicación en el espacio de direcciones de 64 Bits (mientras el kernel sigue siendo de 32 Bits) mejora el rendimiento. Para resumir: si cualquiera de los dos es de 64 bits (kernel o aplicación, o ambos, por supuesto), el TLB ("translation lookaside buffer") no tiene que vaciarse siempre que cambie de núcleo para usar espacio y volver (lo que acelerará) acceso a RAM).

También tiene ganancias de rendimiento cuando trabaja con variables "long long int" (variables de 64 bits como uint64_t). Una CPU de 32 bits puede agregar / dividir / restar / multiplicar dos valores de 64 bits, pero no en una sola operación de hardware. En su lugar, necesita dividir esta operación en dos (o más) operaciones de 32 bits. Por lo tanto, una aplicación que funciona mucho con números de 64 bits tendrá una ganancia de velocidad de poder hacer cálculos de 64 bits directamente en el hardware.

Por último, la arquitectura x86-64 ofrece más registros que las arquitecturas x86 clásicas. Trabajar con registros es mucho más rápido que trabajar con RAM y cuantos más registros tiene la CPU, menos necesita intercambiar valores de registro a RAM y volver a los registros.

Para saber si su CPU puede funcionar en modo de 64 bits, puede ver varias variables de sysctl. P.ej. abrir una terminal y escribir

sysctl machdep.cpu.extfeatures

Si enumera EM64T, su CPU admite espacio de direcciones de 64 bits según el estándar x86-64. También puedes buscar

sysctl hw.optional.x86_64

Si dice 1 (verdadero / habilitado), su CPU admite el modo de bits x86-64, si dice 0 (falso / deshabilitado), no lo hace. Si la configuración no se encuentra, considere que es falsa.

Nota: También puede obtener variables sysctl desde una aplicación C nativa, sin necesidad de utilizar la herramienta de línea de comandos. Ver

man 3 sysctl

10



error: "machdep.cpu.extfeatures" es una clave desconocida
Supongo que tampoco se llama EM64T, si no tienes la mala suerte de tener Intel.


Tenga en cuenta que el espacio de direcciones puede usarse para más que la memoria (real). También se puede mapear en memoria los archivos de gran tamaño, lo que puede mejorar el rendimiento en patrones de acceso más extraños, ya que se activa el almacenamiento en caché de nivel VM a nivel de bloque más potente y eficiente. También es más seguro asignar bloques de memoria grandes en 64 bits. es probable que encuentre fragmentación del espacio de direcciones que no le permita asignar un bloque grande.

Algunas de las cosas que se dicen en este hilo (como el doblamiento de # registros) solo se aplican a x86-> x86_64, no a 64-bit en general. Al igual que el hecho de que bajo x86_64 uno tiene SSE2, 686 códigos de operación y una forma económica de hacer PIC. Estas características estrictamente no son de 64 bits, sino que recortan el legado y solucionan las limitaciones conocidas de x86.

Además, a menudo las personas señalan que duplicar los registros es la causa de la aceleración, mientras que es más probable que el uso de SSE2 predeterminado sea el truco (aceleración de memcpy y funciones similares). Si habilita el mismo conjunto para x86, la diferencia es mucho menor. (*) (***)

También tenga en cuenta que a menudo hay una penalización inicial porque la estructura de datos promedio aumentará simplemente porque el tamaño de un puntero es mayor. Esto también tiene efectos de caché, pero es más notable en el hecho de que el promedio de memcpy () (o lo que sea el equivalente para la copia de memoria está en su idioma) tomará más tiempo. Esto es solo en la magnitud de un pequeño porcentaje por cierto, pero las aceleraciones mencionadas anteriormente también tienen esa magnitud.

Por lo general, la sobrecarga de alineación también es mayor en las arquitecturas de 64 bits (los registros previamente de 32 bits a menudo se convierten en una mezcla de valores de 32 bits y de 64 bits), lo que hace explotar aún más las estructuras.

En general, mis pruebas simples indican que se cancelarán aproximadamente entre sí, si los controladores y las bibliotecas de tiempo de ejecución se han adaptado completamente, sin dar una diferencia de velocidad significativa para la aplicación promedio. Sin embargo, algunas aplicaciones pueden volverse más rápidas (por ejemplo, dependiendo de AES) o más lentas (la estructura de datos crucial se mueve / escanea / camina constantemente y contiene muchos punteros). Sin embargo, las pruebas se realizaron en Windows, por lo que la optimización PIC no se comparó.

Tenga en cuenta que la mayoría de los lenguajes JIT-VM (Java, .NET) utilizan un promedio significativamente mayor de punteros (internamente) que p. Ej. C ++. Probablemente su uso de memoria aumente más que para el programa promedio, pero no me atrevo a equipararlo directamente con los efectos de ralentización (ya que estos son animales realmente complejos y funky y, a menudo, difíciles de predecir sin medir).

(*) un hecho poco conocido es que el número de registros SSE también se duplica en el modo de 64 bits

(**) El Dr. Dobbs tuvo un buen artículo al respecto hace unos años.


9