소프트웨어 관점에서 64비트 컴퓨팅은 64비트 가상 메모리 주소를 사용하는 기계어를 사용하는 것을 의미한다. 하지만 모든 64비트 명령어 집합이 전체 64비트 가상 메모리 주소를 지원하는 것은 아니다. 예를 들어 X86-64와 AArch64는 48비트의 가상 주소만을 지원하며, 나머지 16비트 가상 주소는 모두 0(000...)이거나 모두 1(111...)이어야 한다. 또한 여러 64비트 명령어 집합은 64비트 미만의 물리적 메모리 주소를 지원한다.
'64비트'라는 용어는 64비트 프로세서가 표준인 컴퓨터 세대를 지칭하기도 한다. 64비트는 컴퓨터 구조, 버스, 메모리, CPU, 그리고 이를 기반으로 실행되는 소프트웨어의 특정 등급을 정의하는 워드 크기이다. 64비트 CPU는 1970년대부터 슈퍼컴퓨터(Cray-1, 1975년)에 사용되었으며, 1990년대 초부터는 축소 명령어 집합 컴퓨터(RISC) 기반의 워크스테이션과 서버에서 사용되었다. 2003년에는 X86-64 프로세서와 파워PC G5 형태로 주류 PC 시장에 64비트 CPU가 도입되었다.
64비트 레지스터는 264개(18경 개 이상, 즉 1.8×1019개 이상)의 서로 다른 값을 보유할 수 있다. 64비트로 저장할 수 있는 정수 값의 범위는 사용되는 정수 표현 방식에 따라 달라진다. 가장 흔한 두 가지 표현 방식의 경우, 범위는 (unsigned) 이진수 표현 시 0부터 18,446,744,073,709,551,615(264 − 1)까지이며, 2의 보수 표현 시 −9,223,372,036,854,775,808(−263)부터 9,223,372,036,854,775,807(263 − 1)까지이다. 따라서 64비트 메모리 주소를 가진 프로세서는 264 바이트(16 엑사바이트 또는 EB)의 바이트 주소 지정 가능 메모리에 직접 접근할 수 있다.
별도의 수식어가 없는 한, 64비트 컴퓨터 구조는 일반적으로 64비트 폭의 정수 및 주소 지정용 프로세서 레지스터를 갖추고 있어 64비트 데이터 형식과 주소를 직접 지원한다. 하지만 CPU의 외부 데이터 버스나 주소 버스는 레지스터와 다른 크기(예를 들어, 32비트 펜티엄은 64비트 데이터 버스를 가짐)를 가질 수 있다.
구조적 영향
프로세서 레지스터는 일반적으로 정수, 부동 소수점, SIMD, 제어 레지스터, 그리고 주소, 인덱스, 베이스 레지스터 등 다양한 용도와 이름으로 불리는 주소 연산용 특수 레지스터 등으로 나뉜다. 그러나 현대적 설계에서는 이러한 기능을 더 범용적인 정수 레지스터가 수행하는 경우가 많다. 대부분의 프로세서에서 정수 레지스터나 주소 레지스터만이 메모리의 데이터 주소를 지정하는 데 사용될 수 있으며, 다른 유형의 레지스터는 사용할 수 없다. 따라서 부동 소수점 레지스터처럼 더 넓은 레지스터가 존재하더라도, 이러한 레지스터들의 크기가 직접 주소 지정이 가능한 메모리 양을 제한하게 된다.
대부분의 고성능 32비트 및 64비트 프로세서(일부 구형 또는 임베디드 ARM 아키텍처 및 32비트 MIPS 아키텍처 CPU는 예외)는 통합 부동 소수점 하드웨어를 갖추고 있으며, 이는 대개 64비트 데이터 단위를 기반으로 한다. 예를 들어, X86/X87 아키텍처는 메모리에서 64비트(및 32비트) 부동 소수점 값을 로드하고 저장할 수 있는 명령어를 가지고 있지만, 내부 부동 소수점 데이터 및 레지스터 형식은 80비트인 반면 범용 레지스터는 32비트이다. 이와 대조적으로 64비트 알파 계열은 64비트 부동 소수점 데이터 및 레지스터 형식과 64비트 정수 레지스터를 사용한다.
역사
많은 컴퓨터 명령어 집합은 단일 정수 레지스터가 컴퓨터의 물리적 또는 가상 메모리 내의 임의 위치에 대한 메모리 주소를 저장할 수 있도록 설계되었다. 따라서 메모리의 총 주소 개수는 종종 이 레지스터들의 폭에 의해 결정된다. 1960년대의 IBM시스템/360은 초기 32비트 컴퓨터였으며, 32비트 정수 레지스터를 갖추고 있었으나 주소 지정에는 워드의 하위 24비트만을 사용하여 16 MiB(16 × 10242 바이트)의 주소 공간을 가졌다. 1970년대에는 DECVAX와 같은 32비트 미니슈퍼컴퓨터가 보편화되었고, 1980년대 중반에는 모토로라 68000 시리즈와 인텔 80386부터 시작하는 X86 계열의 32비트 프로세서들이 등장하면서 32비트가 편리한 레지스터 크기로 사실상의 표준이 되었다.
32비트 주소 레지스터는 232개의 주소, 즉 4 GB의 랜덤 액세스 메모리(RAM)를 참조할 수 있음을 의미했다. 이러한 아키텍처가 설계될 당시 4GB의 메모리는 설치 환경의 일반적인 양(4 MiB)을 훨씬 뛰어넘는 수치였기에 충분한 여유 공간으로 간주되었다. 42억 9천만 개의 주소는 또 다른 중요한 이유로 적절한 크기로 여겨졌는데, 이는 데이터베이스와 같은 애플리케이션의 대부분의 개체에 고유한 참조를 할당하기에 충분한 정수 개수였기 때문이다.
대부분의 현대 컴퓨터는 랜덤 액세스 메모리 내부에 80억~320억 개의 고유 주소를 담을 수 있는 공간을 포함하고 있으며, 64비트 아키텍처는 20억 배 더 높은 주소에 접근할 수 있다. 전체 64비트 공간이 전부 사용될 일은 없을 것으로 보인다.
크레이-1과 같은 1970년대 및 1980년대의 일부 슈퍼컴퓨터 아키텍처들은 최대 64비트 폭의 레지스터를 사용하고 64비트 정수 연산을 지원했지만, 64비트 주소 지정은 지원하지 않았다. 1980년대 중반에는 인텔 i860 개발이 시작되어 1989년에 출시되었다. i860은 32비트 정수 레지스터와 32비트 주소 지정을 가졌기에 완전한 64비트 프로세서는 아니었으나, 그래픽 유닛이 64비트 정수 연산을 지원했다. 그러나 메모리 가격의 지속적인 하락으로 RAM 용량이 4GB에 근접하고, 4GB 제한을 넘는 가상 메모리 공간의 사용이 특정 유형의 문제를 해결하는 데 바람직해진 1990년대 초까지 32비트가 표준으로 남았다. 이에 대응하여 MIPS와 DEC는 초기에 고성능 워크스테이션 및 서버용으로 64비트 마이크로프로세서 아키텍처를 개발했다. 1990년대 중반까지 HAL 컴퓨터 시스템즈, 썬 마이크로시스템즈, IBM, 실리콘 그래픽스, 휴렛 팩커드는 워크스테이션 및 서버 시스템용 64비트 아키텍처를 개발했다. 이 추세의 예외적인 사례로 당시 32비트 데이터와 31비트 주소 크기를 사용하던 IBM의 메인프레임이 있었으며, IBM 메인프레임은 2000년이 되어서야 64비트 프로세서를 포함했다. 1990년대 동안 여러 저가형 64비트 마이크로프로세서가 가전제품과 임베디드 애플리케이션에 사용되었다. 특히 닌텐도 64와 플레이스테이션 2는 개인용 컴퓨터에 도입되기 전에 64비트 마이크로프로세서를 탑재했다. 고성능 프린터, 네트워크 장비, 산업용 컴퓨터도 퀀텀 이펙트 디바이시스의 R5000과 같은 64비트 마이크로프로세서를 사용했다. 64비트 컴퓨팅은 2003년부터 애플의 매킨토시 제품군 일부 모델이 파워PC 970 프로세서(애플은 G5라 명명)로 전환하고, AMD가 최초의 64비트 X86-64 프로세서를 출시하면서 개인용 컴퓨터 데스크톱으로 점차 확산되었다. 물리적 메모리는 결국 32비트 한계를 따라잡았다. 2023년 기준으로 노트북 컴퓨터는 일반적으로 16GB를, 서버는 64GB 이상의 메모리를 장착하여, 32비트의 4GB 주소 수용량을 크게 초과했다.
인터내셔널 컴퓨터즈 리미티드가 32비트, 64비트, 128비트 2의 보수 정수, 64비트 및 128비트 부동 소수점, 32비트, 64비트, 128비트 팩형 십진수 및 128비트 누산기 레지스터를 갖춘 ICL 2900 시리즈를 출시. 이 아키텍처는 이후 여러 ICL 및 후지쯔 머신을 거쳐 생존함. 최신 기종인 후지쯔 슈퍼노바는 64비트 인텔 프로세서에서 원래 환경을 에뮬레이션함.
1976년
크레이 리서치가 64비트 워드 아키텍처를 기반으로 하며 이후 크레이 벡터 슈퍼컴퓨터의 기초가 될 첫 크레이-1 슈퍼컴퓨터를 출시.
1983년
Elxsi가 Elxsi 6400 병렬 미니슈퍼컴퓨터를 출시. Elxsi 아키텍처는 64비트 데이터 레지스터를 가졌으나 32비트 주소 공간을 가짐.
1989년
인텔이 인텔 i860축소 명령어 집합 컴퓨터(RISC) 프로세서를 도입. "64비트 마이크로프로세서"로 마케팅되었으나 실제로는 32비트 아키텍처에 64비트 정수 연산이 가능한 3D 그래픽 유닛이 강화된 형태였음.
인텔이 32비트 IA-32 프로세서의 후속작으로 (휴렛 팩커드와 공동 개발한) 64비트 IA-64 아키텍처 계획을 발표. 1998~1999년 출시를 목표로 함.
1995년
썬 마이크로시스템즈가 64비트 SPARC 프로세서인 울트라스팍을 출시. 후지쯔 소유의 HAL 컴퓨터 시스템즈가 64비트 CPU인 1세대 SPARC64 기반 워크스테이션을 출시. IBM이 최초의 64비트 파워PC AS 프로세서인 A10 및 A30을 출시. IBM은 또한 운영체제, 데이터베이스, 애플리케이션을 변환할 수 있는 64비트 AS/400 시스템 업그레이드를 출시.
인텔이 시장 출시 지연 끝에 IA-64 프로세서 라인을 출하. 현재 아이테니엄으로 브랜드화되어 고성능 서버를 타겟팅했으나 판매량이 기대에 미치지 못함.
2003년
AMD가 최초의 x86 기반 64비트 프로세서 아키텍처인 AMD64 아키텍처를 기반으로 하는 옵테론 및 애슬론 64 프로세서 라인을 도입. 애플 또한 IBM에서 생산한 64비트 "G5" 파워PC 970 CPU를 탑재한 제품을 출시. 인텔은 아이테니엄 칩이 자사의 유일한 64비트 프로세서로 남을 것이라고 주장.
2004년
인텔이 AMD의 시장 성공에 대응하여 IA-32e(나중에 EM64T, 이후 인텔 64로 이름 변경)라는 이름의 AMD64 확장 복제품을 개발했음을 인정. 인텔은 새로운 64비트 명령어 집합을 지원하는 제온 및 펜티엄 4 프로세서 제품군을 업데이트하여 출하.
소니, IBM, 도시바가 플레이스테이션 3, 서버, 워크스테이션 및 기타 기기에 사용될 64비트 셀 프로세서 제조를 시작. 인텔은 모바일, 데스크톱, 워크스테이션 제품군을 위한 최초의 주류 x86-64 프로세서로 코어 2 듀오를 출시. 이전 64비트 확장 프로세서 제품군은 소비자 소매 시장에서 널리 이용 가능하지 않았으며(64비트 펜티엄 4/D 대부분은 OEM), 64비트 펜티엄 4, 펜티엄 D, 셀러론은 수율 문제로 2006년 말까지 대량 생산되지 못함(양품 웨이퍼 대부분은 서버와 메인프레임을 목표로 했고 주류 시장은 2006년까지 130nm 32비트 프로세서 라인에 머물렀음). AMD가 최초의 64비트 모바일 프로세서를 90nm 공정으로 출시.
1월 4일, 마이크로소프트는 전년 9월 이후 IA-64 프로세서 PC가 없었다는 이유로 윈도우 XP 프로페셔널 x64 에디션을 단종하고, 이를 대체하기 위해 윈도우의 x86-64 버전을 개발 중이라고 발표. 1월 31일, 썬 마이크로시스템즈가 AMD64 및 EM64T 프로세서를 지원하는 솔라리스 10을 출시. 4월 29일, 애플이 파워PC 970 프로세서 탑재 기기에서 64비트 명령줄 애플리케이션에 대한 제한적 지원을 제공하는 맥 OS X 10.4 "타이거"를 출시; 인텔 기반 맥을 위한 이후 버전들은 EM64T 프로세서 탑재 맥에서 64비트 명령줄 애플리케이션을 지원함. 4월 30일, 마이크로소프트가 AMD64 및 EM64T 프로세서를 위한 윈도우 XP 프로페셔널 x64 에디션 및 윈도우 서버 2003 x64 에디션을 출시.
2006년
마이크로소프트가 32비트 호환성을 유지하면서 AMD64/EM64T 프로세서를 위한 64비트 버전을 포함하는 윈도우 비스타를 출시. 64비트 버전에서는 모든 윈도우 애플리케이션과 구성 요소가 64비트이나, 호환성을 위해 플러그인 등 여러 32비트 버전도 포함됨.
마이크로소프트가 윈도우 비스타와 마찬가지로 AMD64/인텔 64 프로세서를 위한 풀 64비트 버전을 포함하는 윈도우 7을 출시; 대부분의 새 컴퓨터에는 64비트 버전이 기본 탑재됨. 마이크로소프트는 또한 최초의 64비트 전용 서버 운영체제인 윈도우 서버 2008 R2를 출시. 애플은 AMD64/인텔 64 프로세서용 64비트 커널을 탑재한 맥 OS X 10.6 "스노 레퍼드"를 출시했으나, 일부 최신 맥 모델만 64비트 커널을 기본으로 실행함. 맥 OS X 10.6에 번들된 대부분의 애플리케이션도 이제 64비트임.
2010년
윈도우 7 (64비트)이 윈도우 XP (32비트)를 제치고 Steam에서 가장 인기 있는 운영체제가 됨.
2011년
애플이 지원 기기에서 기본적으로 64비트 커널을 실행하는 맥 OS X 10.7 "라이언"을 출시. 64비트 커널을 실행할 수 없는 구형 기기는 32비트 커널로 실행되지만, 이전 릴리스와 마찬가지로 64비트 애플리케이션은 여전히 실행 가능함; 라이언은 32비트 프로세서 탑재 기기를 지원하지 않음. 아이튠즈를 포함하여 맥 OS X 10.7에 번들된 거의 모든 애플리케이션이 이제 64비트임.
2012년
마이크로소프트가 UEFI Class 3(CSM 없는 UEFI) 및 보안 부팅을 지원하는 윈도우 8을 출시. 애플이 OS X 마운틴 라이언을 출시하여 이전까지 지원되지 않던 일부 구형 기기에서 64비트 커널을 기본값으로 설정하고 32비트 커널을 제거함.
마이크로소프트가 10월 5일, IA-32 및 AArch32 시스템 지원을 중단하고 64비트 시스템만 지원하는 윈도우 11을 출시.
2022년
구글이 32비트 애플리케이션 지원을 중단한 픽셀 7을 출시. 애플이 애플 워치 시리즈 4 이상, 애플 워치 SE(1세대) 이상 및 신규 출시된 애플 워치 울트라 등 64비트 프로세서 탑재 애플 워치 모델에서만 독점적으로 실행되는 첫 watchOS 버전인 watchOS 9를 출시하고, 마지막 32비트 프로세서 탑재 모델인 애플 워치 시리즈 3에 대한 지원을 중단.
이론적으로 64비트 마이크로프로세서는 16 엑사바이트(16 × 10246 = 264 = 18,446,744,073,709,551,616 바이트)의 메모리를 주소 지정할 수 있다. 하지만 모든 명령어 집합과 해당 명령어 집합을 구현하는 모든 프로세서가 전체 64비트 가상 또는 물리적 주소 공간을 지원하는 것은 아니다.
X86-64 아키텍처(2024년 3월월 기준[update])는 가상 메모리에 48비트, 각 프로세서에 대해 최대 52비트의 물리적 메모리를 허용한다. 이러한 제한으로 각각 256 테라바이트(256 × 10244 바이트)와 4 페타바이트(4 × 10245 바이트)의 메모리 크기가 허용된다. PC는 현재 (메모리 칩의 물리적 크기 때문에) 4 페타바이트의 메모리를 담을 수 없지만, AMD는 가까운 미래에 이에 근접할 수 있는 대규모 서버, 공유 메모리 클러스터 및 기타 물리적 주소 공간 사용 사례를 구상했다. 따라서 52비트 물리 주소는 완전한 64비트 물리 주소를 구현하는 비용을 들이지 않고도 확장을 위한 충분한 공간을 제공한다. 마찬가지로 48비트 가상 주소 공간은 32비트 제한인 4GB(4 × 10243 바이트)의 65,536(216)배를 제공하도록 설계되었으며, 나중의 확장을 위한 공간을 마련하고 완전한 64비트 주소 번역에 따른 오버헤드를 발생시키지 않도록 설계되었다.
Power ISA v3.0은 64비트 유효 주소를 허용하며, 이는 가상 메모리를 위해 65~78비트가 허용되는 세그먼트 주소로 매핑되고, 각 프로세서에 대해 물리적 메모리를 위해 최대 60비트를 허용한다.
오라클 SPARC 아키텍처 2015는 가상 메모리에 64비트를 허용하고, 각 프로세서에 대해 물리적 메모리에 40~56비트를 허용한다.
ARM AArch64 가상 메모리 시스템 아키텍처는 가상 메모리에 48~56비트, 각 프로세서에 대해 물리적 메모리에 32~56비트를 허용한다.
DEC 알파 사양은 최소 43비트의 가상 메모리 주소 공간(8TB)을 지원해야 하며, 하드웨어는 나머지 지원되지 않는 비트가 0인 경우 이를 체크하고 트랩해야 한다(향후 프로세서에서의 호환성을 지원하기 위함). 알파 21064는 43비트 가상 메모리 주소 공간(8TB)과 34비트 물리적 메모리 주소 공간(16GB)을 지원했다. 알파 21164는 43비트 가상 메모리 주소 공간(8TB)과 40비트 물리적 메모리 주소 공간(1TB)을 지원했다. 알파 21264는 사용자 구성 가능한 43비트 또는 48비트 가상 메모리 주소 공간(8TB 또는 256TB)과 44비트 물리적 메모리 주소 공간(16TB)을 지원했다.
64비트 응용 프로그램
32비트 vs 64비트
32비트에서 64비트 아키텍처로의 변경은 근본적인 변화인데, 대부분의 운영체제가 소프트웨어를 통해 실제 메모리 주소 지정 하드웨어를 관리해야 하므로 새 아키텍처를 활용하려면 광범위하게 수정되어야 하기 때문이다. 기타 소프트웨어도 새로운 기능을 사용하도록 이식되어야 한다. 구형 32비트 소프트웨어는 64비트 명령어 집합이 32비트 명령어 집합의 상위 집합이어서 64비트 명령어 집합을 지원하는 프로세서가 32비트 명령어 집합용 코드도 실행할 수 있거나, 소프트웨어 에뮬레이션을 통하거나, 또는 인텔의 일부 아이테니엄 프로세서처럼 32비트 X86 애플리케이션을 실행하기 위해 64비트 프로세서 내에 실제 32비트 프로세서 코어를 구현함으로써 지원될 수 있다. 해당 64비트 아키텍처용 운영체제는 일반적으로 32비트 및 64비트 애플리케이션을 모두 지원한다.
이에 대한 중요한 예외 사례는 IBM AS/400으로, 이를 위한 소프트웨어는 TIMI(Technology Independent Machine Interface)라는 가상 명령어 집합 구조(ISA)로 컴파일된다. TIMI 코드는 실행 전에 저수준 소프트웨어에 의해 네이티브 기계어로 번역된다. IBM이 AS/400의 네이티브 명령어 집합을 구형 32/48비트 IMPI에서 Amazon이라는 코드명의 신형 64비트 파워PC-AS로 전환했을 때처럼, 전체 운영체제와 모든 소프트웨어를 새 플랫폼으로 옮기려면 번역 소프트웨어만 다시 작성하면 된다. IMPI 명령어 집합은 32비트 파워PC와도 완전히 달랐기에, 이 전환은 명령어 집합을 32비트에서 64비트로 옮기는 것보다 훨씬 큰 규모의 작업이었다.
X86-64 아키텍처(AMD64)를 사용하는 64비트 하드웨어에서는 대부분의 32비트 운영체제와 애플리케이션을 호환성 문제 없이 실행할 수 있다. 64비트 아키텍처의 더 큰 주소 공간은 디지털 영상, 과학 컴퓨팅, 대규모 데이터베이스와 같은 애플리케이션에서 대용량 데이터 세트를 더 쉽게 다룰 수 있게 해주지만, 64비트 아키텍처나 그들의 32비트 호환성 모드가 다른 작업에서 가격 대비 성능이 비슷한 32비트 시스템보다 빠를지에 대해서는 상당한 논쟁이 있었다.
컴파일된 자바 프로그램은 수정 없이 32비트 또는 64비트 자바 가상 머신에서 실행될 수 있다. char, short, int, long, float, double과 같은 모든 내장 유형과 배열 인덱스로 사용할 수 있는 유형의 길이와 정밀도는 표준에 의해 지정되며 기본 아키텍처에 의존하지 않는다. 64비트 자바 가상 머신에서 실행되는 자바 프로그램은 더 큰 주소 공간에 접근할 수 있다.
32비트와 64비트 프로세서를 비교할 때 속도만이 고려할 유일한 요소는 아니다. 멀티태스킹, 스트레스 테스트, 클러스터링과 같은 애플리케이션은 적절히 배포되었을 때 64비트 아키텍처에 더 적합할 수 있다. 이러한 이유로 64비트 클러스터는 IBM, HP, 마이크로소프트와 같은 대규모 조직에서 널리 배포되어 왔다.
요약:
64비트 프로세서는 64비트 소프트웨어에서 가장 잘 작동한다.
64비트 프로세서는 하위 호환성을 가질 수 있어 32비트 명령어 집합 버전에 대한 32비트 응용 프로그램 소프트웨어를 실행할 수 있으며, 32비트 명령어 집합 버전에 대한 32비트 운영체제 실행도 지원할 수 있다.
32비트 프로세서는 64비트 소프트웨어와 호환되지 않는다.
장점과 단점
일반적인 오해 중 하나는 컴퓨터가 4 GB 이상의 랜덤 액세스 메모리를 가지고 있지 않으면 64비트 아키텍처가 32비트 아키텍처보다 나을 것이 없다는 것이다. 이는 완전히 사실이 아니다.
일부 운영체제와 특정 하드웨어 구성은 IA-32 시스템에서 3~4GB 영역이 하드웨어 주소 지정을 위해 예약되어 있기 때문에 물리적 메모리 공간을 3GB로 제한한다(참조: 3 GB barrier); 64비트 아키텍처는 4GB보다 훨씬 더 많은 메모리를 주소 지정할 수 있다. 그러나 펜티엄 프로부터의 IA-32 프로세서는 물리 주소 확장(PAE)을 사용하여 36비트 물리적 메모리 주소 공간을 허용하며, 이는 64GB 물리적 주소 범위를 제공하고 그중 최대 62GB까지 메인 메모리로 사용할 수 있다. PAE를 지원하는 운영체제는 IA-32 프로세서에서도 4GB 물리적 메모리로 제한되지 않을 수 있다. 하지만 드라이버와 기타 커널 모드 소프트웨어(특히 구형 버전)는 PAE와 호환되지 않을 수 있는데, 이것이 마이크로소프트 윈도우의 32비트 버전이 4GB 물리적 RAM으로 제한되는 이유로 거론되어 왔다. (다만 이 설명의 타당성에 대해서는 논란이 있다).
일부 운영체제는 프로세스주소 공간의 일부를 OS 사용을 위해 예약하며, 이는 사용자 프로그램을 위한 메모리 매핑 가용 주소 공간을 효과적으로 줄인다. 예를 들어, 32비트 윈도우는 커널을 위해 총 주소 공간의 1~2GB(설정에 따라 다름)를 예약하며, 이는 사용자 모드를 위해 단 3GB 또는 2GB의 주소 공간만을 남긴다. 이 제한은 64비트 운영체제에서 훨씬 높다.
4GB 이상의 파일이 보편화됨에 따라 메모리 맵 파일은 32비트 아키텍처에서 구현하기 어려워지고 있다. 그러한 대용량 파일은 32비트 아키텍처에 쉽게 메모리 매핑될 수 없는데, 한 번에 파일의 일부만 주소 공간에 매핑할 수 있고 메모리 매핑으로 파일에 접근하려면 매핑된 부분을 필요에 따라 주소 공간으로 스와핑해야 하기 때문이다. 운영체제에 의해 적절히 구현될 경우 메모리 매핑이 가장 효율적인 디스크-메모리 방식 중 하나라는 점에서 이는 문제이다.
인코더, 디코더, 암호화 소프트웨어와 같은 일부 64비트 프로그램은 64비트 레지스터로부터 큰 이득을 볼 수 있는 반면, 3D 그래픽 지향 프로그램 등 다른 프로그램의 성능은 32비트에서 64비트 환경으로 전환해도 영향을 받지 않는 경우가 있다.
X86-64 및 AArch64와 같은 일부 64비트 아키텍처는 (워드 길이와 직접적인 관련은 없지만) 32비트 대응 장치보다 더 많은 범용 레지스터를 지원한다. 이는 프로세서가 데이터를 캐시나 메인 메모리에서 가져올 필요가 없고 가용 레지스터에 데이터를 저장할 수 있다면 루프에 대해 상당한 속도 향상으로 이어진다.
이 코드는 먼저 5개의 값(a, b, c, d, e)을 생성하고 루프에 넣는다. 루프 동안 이 코드는 b의 값을 a의 값으로, c의 값을 b의 값으로, d의 값을 c의 값으로, e의 값을 d의 값으로 변경한다. 이는 모든 값을 a로 변경하는 것과 동일한 효과를 낸다.
프로세서가 레지스터에 두세 개의 값이나 변수만 보관할 수 있다면, d와 e 변수까지 처리하기 위해 메모리와 레지스터 사이에서 값을 이동시켜야 하며 이는 많은 CPU 사이클을 소요하는 과정이다. 모든 값과 변수를 레지스터에 유지할 수 있는 프로세서는 반복할 때마다 레지스터와 메모리 사이에서 데이터를 이동시킬 필요 없이 루프를 처리할 수 있다. 이 동작은 컴파일러에 따라 결과가 달라질 수 있지만 가상 메모리와 쉽게 비교될 수 있다.
64비트 아키텍처의 주된 단점은 32비트 아키텍처에 비해 동일한 데이터가 메모리에서 더 많은 공간을 차지한다는 점이다(긴 포인터와 기타 데이터 형식, 정렬 패딩 때문). 이는 특정 프로세스의 메모리 요구량을 증가시키며 효율적인 프로세서 캐시 사용에 영향을 줄 수 있다. 부분적인 32비트 모델을 유지하는 것은 이를 처리하는 한 방법이며 일반적으로 상당히 효과적이다. 예를 들어, Z/OS 운영체제는 프로그램 코드가 31비트 주소 공간(하위 기반 하드웨어 플랫폼의 주소 계산에서는 상위 비트가 사용되지 않음)에 상주하도록 요구하고 데이터 객체는 선택적으로 64비트 영역에 상주하도록 하는 방식을 취한다. 모든 애플리케이션이 대규모 주소 공간을 필요로 하거나 64비트 데이터 항목을 조작하는 것은 아니므로, 이러한 애플리케이션은 해당 기능으로부터 이득을 보지 못한다.
소프트웨어 가용성
x86 기반 64비트 시스템은 종종 32비트 아키텍처용으로 작성된 소프트웨어의 대안이 부족하다. 마이크로소프트 윈도우에서 가장 심각한 문제는 구형 하드웨어용 장치 드라이버 호환성이다. 대부분의 32비트 응용 소프트웨어는 WoW64 기술과 같은 호환성 모드(에뮬레이션 모드)를 통해 64비트 운영체제에서 실행될 수 있다. 64비트 윈도우 네이티브 모드 드라이버 환경은 32비트 Win32 서브시스템 코드를 호출할 수 없는 64비트 NTDLL.DLL 위에서 실행된다(Winprinters처럼 실제 하드웨어 기능이 사용자 모드 소프트웨어에서 에뮬레이션되는 장치들). 2007년 초(비스타 x64)까지 대부분의 장치용 64비트 드라이버를 구할 수 없었기 때문에 64비트 윈도우를 사용하는 것은 도전으로 간주되었다. 그러나 메모리 가격이 하락하고 4GB 이상의 RAM 사용이 증가하면서 64비트 컴퓨팅으로 트렌드가 이동했다. 대부분의 제조사가 신규 장치에 대해 32비트 및 64비트 드라이버를 모두 제공하기 시작하면서 64비트 드라이버의 부재 문제는 해결되었다. 64비트 드라이버가 제공되지 않는 많은 구형 장치는 결과적으로 64비트 시스템에서 사용할 수 없게 되었다.
오픈 소스 드라이버의 경우 32비트 드라이버를 64비트용으로 수정할 수 있어 드라이버 호환성 문제가 덜했다. 2007년 초 이전에 만들어진 하드웨어에 대한 지원은 사용자 수가 상대적으로 적어 오픈 소스 플랫폼에서도 문제가 되었다.
64비트 버전의 윈도우는 16비트 응용 프로그램을 실행할 수 없다. 하지만 대부분의 32비트 애플리케이션은 잘 작동한다. 64비트 사용자는 16비트 애플리케이션을 실행하거나 NTVDM의 대안을 사용하기 위해 16비트 또는 32비트 운영체제의 가상 머신을 설치해야 한다.
맥 OS X 10.4 "타이거"와 맥 OS X 10.5 "레퍼드"는 32비트 커널만 가졌지만, 64비트 프로세서에서 64비트 사용자 모드 코드를 실행할 수 있었다. 맥 OS X 10.6 "스노 레퍼드"는 32비트 및 64비트 커널을 모두 가졌고, 대부분의 맥에서 64비트 프로세서에서도 32비트 커널을 사용했다. 이를 통해 해당 맥들은 64비트 프로세스를 지원하면서도 32비트 장치 드라이버를 지원할 수 있었으나, 64비트 드라이버와 그에 따른 성능 향상은 누릴 수 없었다. 맥 OS X 10.7 "라이언"은 더 많은 맥에서 64비트 커널로 실행되었으며, OS X 10.8 "마운틴 라이언" 및 이후 macOS 릴리스는 64비트 커널만 갖추고 있다. 64비트 프로세서가 탑재된 시스템에서 32비트 및 64비트 macOS 커널은 32비트 사용자 모드 코드를 실행할 수 있으며, macOS 모하비(10.14)까지의 모든 버전에는 32비트 애플리케이션이 사용하는 라이브러리의 32비트 버전이 포함되어 있어 32비트 사용자 모드 소프트웨어가 해당 시스템에서 실행된다. 라이브러리의 32비트 버전은 macOS 카탈리나(10.15)에서 애플에 의해 제거되었다.
리눅스와 대부분의 다른 유닉스 계열 운영체제, 그리고 그들을 위한 C 및 C++툴체인은 수년간 64비트 프로세서를 지원해 왔다. 해당 플랫폼을 위한 많은 애플리케이션과 라이브러리는 C 및 C++로 작성된 오픈 소스 소프트웨어이므로, 64비트 안전(64-bit-safe)하다면 64비트 버전으로 컴파일될 수 있다. 빈번한 릴리스를 강조하는 이러한 소스 기반 배포 모델 덕분에 해당 운영체제에서 애플리케이션 소프트웨어 가용성 문제는 덜한 편이다.
64비트 데이터 모델
32비트 프로그램에서 포인터와 정수 같은 데이터 형식은 일반적으로 동일한 길이를 가진다. 64비트 머신에서는 반드시 그렇지는 않다. C와 그 후손인 C++ 및 오브젝티브-C와 같은 프로그래밍 언어에서 데이터 형식을 혼용하면 32비트 구현에서는 작동할 수 있으나 64비트 구현에서는 작동하지 않을 수 있다.
64비트 머신의 C 및 C 파생 언어를 위한 많은 프로그래밍 환경에서 int 변수는 여전히 32비트 폭이지만 long 정수와 포인터는 64비트 폭이다. 이들은 "Long, Pointer, 64"의 약자인 LP64 데이터 모델을 가진다고 설명된다. 다른 모델로는 모든 데이터 형식 유형이 64비트 폭인 ILP64 데이터 모델과 short 정수도 64비트 폭인 SILP64 모델이 있다. 그러나 대부분의 경우 필요한 수정은 비교적 작고 간단하며, 잘 작성된 많은 프로그램은 변경 없이 새 환경에 대해 단순히 다시 컴파일될 수 있다. 또 다른 대안은 32비트 코드와의 호환성을 유지하기 위해 int와 long을 모두 32비트로 남겨두는 LLP64 모델이다. LL은 long long 정수 유형을 나타내며, 이는 32비트 환경을 포함한 모든 플랫폼에서 최소 64비트이다.
64비트 long long 정수를 추가한 ILP32 데이터 모델을 사용하는 64비트 프로세서 시스템도 있으며, 이는 32비트 프로세서가 탑재된 많은 플랫폼에서도 사용된다. 이 모델은 주소 공간이 훨씬 작아지는 대가로 코드 크기와 포인터를 포함하는 데이터 구조의 크기를 줄이며, 일부 임베디드 시스템에 좋은 선택이다. 64비트 명령어 집합 버전이 32비트 버전보다 더 많은 레지스터를 가지는 X86 및 ARM과 같은 명령어 집합의 경우, 공간적 불이익 없이 추가 레지스터에 접근할 수 있게 해준다. 이는 64비트 RISC 머신에서 일반적이며, X86에서는 X32 ABI로 탐구되었고, 최근에는 애플 워치 시리즈 4와 5에서 사용되었다.
프로그래밍 모델은 특정 컴파일러에 맞게 선택하는 것이며, 같은 운영체제 내에서 여러 모델이 공존할 수 있다. 그러나 운영체제 응용 프로그램 인터페이스(API)의 기본 모델로 선택된 프로그래밍 모델이 일반적으로 지배적이다.
또 다른 고려 사항은 장치 드라이버에 사용되는 데이터 모델이다. 드라이버는 대부분의 현대 운영체제 코드의 상당수를 차지하며(운영체제 실행 시 로드되지 않는 경우도 많음), 많은 드라이버가 데이터를 조작하기 위해 포인터를 많이 사용하고, 경우에 따라 직접 메모리 접근(DMA)을 위해 지원하는 하드웨어에 특정 크기의 포인터를 로드해야 한다. 예를 들어, 64비트 머신의 상위 영역 메모리에 DMA 데이터를 요청하는 32비트 PCI 장치용 드라이버는 운영체제로부터 장치에서 메모리로 데이터를 로드하라는 요청을 만족시킬 수 없는데, 해당 주소에 대한 포인터가 장치의 DMA 레지스터에 맞지 않기 때문이다. 이 문제는 운영체제가 드라이버에 DMA 요청을 생성할 때 장치의 메모리 제한을 고려하거나 IOMMU를 사용하여 해결한다.
현재 64비트 아키텍처
2023년 08월 기준[update] 현재 제조되는 64비트 아키텍처용 프로세서는 다음과 같다:
AMD가 인텔의 X86 아키텍처에 만든 64비트 확장(이후 인텔이 라이선스); 통칭 X86-64, AMD64, 또는 x64:
동일 아키텍처의 32비트 버전에서 파생된 대부분의 64비트 아키텍처는 32비트 버전용 코드를 성능 저하 없이 네이티브로 실행할 수 있다. 예를 들어, X86-64 프로세서는 IA-32 애플리케이션을 최대 속도로 실행할 수 있다. 이러한 지원은 일반적으로 bi-arch 지원 또는 더 넓게 multi-arch 지원이라고 불린다.
↑“NEC Offers Two High Cost Performance 64-bit RISC Microprocessors” (보도자료). NEC. 1998년 1월 20일. 2011년 1월 9일에 확인함. Versions of the VR4300 processor are widely used in consumer and office automation applications, including the popular Nintendo 64틀:TM video game and advanced laser printers such as the recently announced, award-winning Hewlett-Packard LaserJet 4000 printer family.
↑Andi Kleen. 《Porting Linux to x86-64》(PDF). Ottawa Linux Symposium 2001. Status: The kernel, compiler, tool chain work. The kernel boots and work on simulator and is used for porting of userland and running programs