64 비트 컴퓨터에서 64 비트 대신 32 비트 소프트웨어를 실행해야 할 이유가 있습니까?


56

최신 데스크톱 컴퓨터를 대상으로 64 비트 하드웨어에서 최신 64 비트 운영 체제를 실행하는 소프트웨어의 64 비트 버전과 함께 32 비트 버전을 제공해야 할 이유가 있습니까?

64 비트 소프트웨어가 더 효율적이고 필요한 경우 더 높은 메모리 사용을 허용하는 것처럼 보입니다. Apple은 1-2GB의 RAM 만 있어도 4GB 이하의 전화에도 64 비트 프로세서를 사용합니다. 32 비트 CPU에 대한 제한.


16
모든 최신 컴퓨터가 64 비트 OS를 실행하는 것은 아닙니다.
Bálint

4
예가 있습니까?
Filip Haglund

8
고객에게 물어보십시오.
머피

22
수사적 질문 : 대부분의 최신 64 비트 운영 체제에서도 32 비트 및 64 비트 응용 프로그램을 실행할 수 있으므로 64 비트 버전의 소프트웨어를 제공해야하는 이유가 있습니까?
Doc Brown

2
중복 @gnat이 아닙니다. 그 질문은 타임 스탬프를 맞추는 것과 프로그램이 종료되면 반환되는 오류 코드의 개발자 ID에 관한 것입니다.
Filip Haglund

답변:


80

64 비트 환경에서 32 비트 소프트웨어의 이점

  • 메모리 사용량이 적으며, 특히 포인터가 많은 응용 프로그램에서 64 비트와 32 비트는 메모리 요구 사항을 쉽게 두 배로 늘릴 수 있습니다.
  • 객체 파일도 더 작습니다.
  • 32 비트 환경과의 호환성
  • 메모리 누수는 2GB, 3GB 또는 4GB로 하드 캡핑되어 전체 시스템을 습격하지 않습니다.

64 비트 환경에서 32 비트 소프트웨어의 단점

  • 프로세스 당 2GB, 3GB 또는 4GB 메모리 제한 (복합의 32 비트 프로세스는 사용 가능한 시스템 메모리를 모두 사용할 수 있습니다.)
  • x64에 따라 추가 레지스터 및 명령어 세트 확장을 사용하지 않습니다. 이것은 컴파일러와 CPU에 따라 다릅니다.
  • 32 비트 버전의 모든 (대부분의 Linux 배포) 또는 흔하지 않은 (대부분의 Windows 버전) 라이브러리 및 런타임 환경이 필요할 수 있습니다. 32 비트 버전의 공유 라이브러리가 응용 프로그램 전용으로로드 된 경우 사용자 공간을 차지합니다. 정적으로 연결하는 경우 아무런 차이가 없습니다.

다른 측면들

  • 드라이버는 일반적으로 문제가되지 않습니다. 커널 모듈의 API가 아닌 32 비트와 64 비트 사이에는 사용자 공간 라이브러리 만 달라야합니다.
  • 정수 데이터 유형에 대해 다른 기본 너비를주의하십시오. 추가 테스트가 필요합니다.
  • 64 비트 CPU 아키텍처는 32 비트를 전혀 지원하지 않을 수도 있습니다.
  • 실제 메모리보다 훨씬 큰 주소 공간에 따른 ASLR 및 기타 기술과 같은 특정 기술 은 32 비트 실행 모드에서 제대로 작동하지 않습니다.

매우 구체적인 CPU 아키텍처, 운영 체제 및 라이브러리 인프라를 비교하지 않으면 자세한 내용을 알 수 없습니다.


8
"64 비트 CPU 아키텍처는 32 비트를 전혀 지원하지 않을 수도 있습니다." 이것이 이론적 인 문제일까요, 아니면 세상에 존재합니까?
mucaho

10
@mucaho 확실히이 있었다 같은 알파와 IA64 같은 64 비트 전용 CPU 아키텍처. 그러나 둘 다 끔찍하다. 현재 제작 된 64 비트 전용 아키텍처 (AArch64) 가 있는지 아는 사람이 없습니다 . 32 비트 ARM이 필수 구성 요소인지 여부를 아는 사람이 있습니까?
zwol

10
@zwol 아니요, 32 비트는 ARM에 필수가 아니며 64 비트도 아닙니다. 64 비트 전용 ARM CPU가 있지만 다른 프로세서는 32 비트 및 64 비트 프로세스를 모두 지원합니다.
Ext3h

3
단순히 하나의 아키텍처를 선택하고이를 고수하는 것 (추가 개발 및 테스트)에 추가적인 이점이 있습니다.
jl6

7
@Joshua 항상 존재 했습니까? 파라오가 이것을 알고 있었습니까?
candied_orange

7

32 비트 소프트웨어와 64 비트 소프트웨어의 차이점은 포인터의 크기와 정수 레지스터의 크기입니다. 그게 다야.

이는 프로그램의 모든 포인터가 두 배 크기임을 의미합니다. 그리고 (적어도 ILP32 / LP64 아키텍처에서는) long크기도 두 배입니다. 이는 일반적으로 객체 코드 크기가 약 30 % 증가합니다. 이것은…

  • 디스크에서 RAM으로로드하는 데 객체 코드가 ~ 30 % 더 오래 걸립니다
  • 객체 코드는 메모리에서 ~ 30 % 더 많은 공간을 차지합니다
  • 객체 코드의 경우 메모리 대역폭을 효과적으로 20 % 줄였습니다.
  • 명령 캐시 크기를 효과적으로 20 % 줄였습니다.

이것은 성능에 무시할 수없는 부정적인 영향을 미칩니다.

이렇게하면 성능 비용을 "구매"할 수있는 경우에만 의미가 있습니다. 기본적으로이 작업을 수행하는 방법에는 두 가지가 있습니다. 64 비트 정수 연산을 많이 수행하거나 4GB 이상의 매핑 된 메모리가 필요합니다. 이들 중 하나 또는 둘 다에 해당되는 경우 64 비트 소프트웨어를 사용하는 것이 좋습니다. 그렇지 않으면 그렇지 않습니다.

참고 : 해당 32 또는 64 비트 변형이없는 아키텍처가 있습니다. 이 경우 질문은 분명히 이해가되지 않습니다. 가장 잘 알려진 것은 64 비트이고 32 비트 변형이없는 IA64와 x86 / AMD64는 서로 다른 아키텍처 이지만 밀접하게 관련되어 있지만 x86은 32 비트이며 AMD64는 64 비트입니다.

실제로, 그 후자의 진술은 더 이상 100 % 사실이 아닙니다. Linux는 최근 x32 ABI를 추가하여 32 비트 포인터로 AMD64 코드를 실행할 수있게했는데, 이것이 "적절한"CPU 아키텍처가 아니더라도, 네이티브가있는 것처럼 AMD64 아키텍처를 사용하는 방법입니다 32 비트 변형. 이 정확하게 이루어졌다 때문에 제가 위에서 언급 한 성능 오버 헤드가 발생시킨 실제 실제 시스템에서 실제 코드를 실행하는 실제 사용자를위한 측정, 정량화 문제.


8
x86과 비교하여 amd64의 추가 레지스터 및 명령어는 어떻습니까? 성능이 얼마나 향상됩니까?
Filip Haglund

2
MacOS X 및 iOS의 Objective-C에서 사용되는 "태그 된 포인터"에 대한 Google. 매우 많은 양의 객체에는 메모리가 할당되지 않지만 64 비트 시스템의 포인터 내에서 전체 객체가 위조됩니다. (Java가 비슷한 것을한다고 들었습니다). C ++에서, 64 비트의 std :: string은 종종 메모리 할당없이 객체 자체에 최대 22자를 포함합니다. 상당한 메모리 절약 및 속도 향상.
gnasher729

3
포인터와 정수의 크기는 무엇입니까? 대부분의 64 비트 아키텍처에서 더 큰 주소 공간과 추가 레지스터는 어떻습니까?

1
"명령 캐시를 ~ 20 % 줄였습니다" 는 명령 세트가 완전히 다르기 때문에 (그리고 종종 더 효율적
BlueRaja-Danny Pflughoeft

3
"이것은 성능에 무시할 수없는 부정적인 영향을 미칩니다." 이 문장은 절대적인 의미로 적용되지만 방대한 대다수의 응용 프로그램 성능 병목 현상이로드 시간, 메모리 사용 / 대역폭 또는 캐시의 명령 수에 있지 않다는 사실을 무시합니다.
이안 켐

6

소프트웨어가 레거시 시스템, 드라이버 또는 라이브러리와 직접 인터페이스해야하는 경우 AFAIK OS (일반적으로 Windows 및 Linux AFAIK)에서 64 비트와 32 비트를 혼합 할 수 없으므로 32 비트 버전을 제공해야 할 수도 있습니다. 프로세스 내의 비트 코드

예를 들어, 소프트웨어가 특수 하드웨어에 액세스해야하는 경우 고객이 32 비트 드라이버 만 사용할 수있는 구형 모델을 운영하는 것은 드문 일이 아닙니다.


2
Windows와 Linux에서 동일한 프로세스에서 32 비트와 64 비트를 혼합 있습니다 . stackoverflow.com/q/12716419/703382
Navin

1
@Navin :하지만 실용적입니까? 64 비트 Windows 응용 프로그램 (예 : 64 비트 버전의 Windows에서 실행중인 CPU 로 표시된 .NET 응용 프로그램)에서 COM 구성 요소 를 사용할 수 있습니까?
Peter Mortensen

3

소프트웨어가 DLL 인 경우 32 비트 및 64 비트 버전을 모두 제공 해야 합니다. 고객이 32 비트 또는 64 비트 소프트웨어를 사용하여 DLL과 통신하는지 여부는 알 수 없으며 DLL은 응용 프로그램과 동일한 비트 길이를 사용해야합니다. 협상 할 수 없습니다.

소프트웨어가 독립 실행 형 실행 파일이면 덜 명확합니다. 구형 OS에서 소프트웨어를 실행할 필요가없는 경우 32 비트 버전을 제공하지 않아도됩니다. 64 비트 만 사용하고 64 비트 OS가 필요하고 작업이 완료되도록 지정하십시오.

그러나 이전 OS에서 소프트웨어를 실행해야하는 경우 에는 64 비트 버전을 제공하고 싶지 않을 수 있습니다 . 두 가지 버전이있는 경우 테스트가 두 배가되며 다양한 OS 버전 및 언어에서 소프트웨어를 올바르게 테스트하는 것은 빠른 과정이 아닙니다. 32 비트 소프트웨어는 64 비트 플랫폼에서 완벽하게 실행되므로, 특히 소규모 개발자가 소프트웨어를 32 비트로 만 릴리스하는 것이 일반적입니다.

또한 대부분의 모바일은 32 비트입니다. 아마도 일부 고급 제품은 64 비트 일지 모르지만 그 단계를 밟을만한 이유는 거의 없습니다. 따라서 크로스 플랫폼을 개발 중이고 코드가 Android에서도 실행되도록하려면 32 비트를 유지하는 것이 안전합니다.


줄어든 테스트에 대한 당신의 입장에 반대합니다. 대신 테스트를 늘리고 미묘한 오류를 포착하는 쉬운 방법으로 다른 레지스터 크기뿐만 아니라 다른 바이트 순서로 여러 플랫폼에서 테스트한다고 주장합니다. 또한 권장되는 최소 하드웨어 요구 사항을 충족하지 않는 컴퓨터에서 테스트를 수행하기 때문에 대용량 데이터 세트를 제외하고는 표시되지 않는 추가 문제가 발생할 수 있습니다.
hildred

@hildred 무제한 테스트 리소스를 사용하면 동의합니다. 그러나 실제로 대상을보다 잘 제어 할 수 있으면이 테스트를 즉시 수행하지 않아도됩니다. 전혀 "쉬운 방법"도 아닙니다. VM에서 이러한 플랫폼 중 일부를 시뮬레이션 할 수 있지만 물리적 하드웨어 설정이 필요한 경우 대량의 수동 (자동화 불가능) 작업이 필요합니다. 명시 적으로 테스트하기 위해 테스트 하네스를 작성하지 않아도 될 수 있지만 결코 자유롭지는 않습니다.
Graham

1
무료는 아니지만 저렴합니다. 오프 플랫폼 테스트를 자동화 된 테스트로 제한하는 경우, 때때로 바보 테스트는 하드웨어를 사용했습니다. 초기 설정 후 성공적인 테스트 비용은 테스트 패스 당 전력 및 약 7 인 분으로 제한됩니다. 실패한 테스트 비용은 물론 더 높지만 일반적으로 더 많은 가치가 있습니다 (항상 하드웨어 오류가 있음). 이 유형의 설정은 추적하기 어려운 특정 클래스의 포인터 문제를 쉽게 노출시키기 때문에 c 프로그래머에게 특히 유용합니다.
17:00에
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.