2009. 1. 5. 17:25

32bit와 64bit 시스템의 이해

지금껏 32bit 환경에서만 개발을 주로 해왔고 갑자기 64bit의 시대가 대세가 되고 있다고 하니 뭘 어떻게 바꿔야 하는 것인지 어안이 벙벙하다.

그래서 한번 32bit 와 64bit 시스템이 어떻게 다른것이고 어떤 변화가 필요한지에 대해 나름의 정리를 해보고자 한다.

. 차이점

가장 큰 차이는 무엇인가? 

1. CPU와 메모리가 한번에 전송할 수 있는 데이터의 크기

CPU와 메모리는 I/O 버스를 통해 데이터를 송수신 한다. 이때 데이터를 전송하는 경로에서 한번에 32bit를 전송하면 32bit 시스템, 64bit를 전송하면 64bit 시스템이 된다.

2. CPU가 처리할 수 있는 데이터의 크기

CPU가 외부에서 들어오는 데이터를 처리하는 능력에 차이가 있는데 이때 32bit CPU는 한번에 32bit 데이터를, 64bit CPU는 한번에 64bit의 데이터 처리가 가능하다.

1, 2번은 서로 연관되어 어쩌면 1번이 되면 당연히 2번이 되어야 하고 2번이 가능한데 1번이 불가능하다면 아무 쓸모 없는 능력이 되고 마는 것이다.

따라서, 
1, 2번이 가능하므로 인해 사용가능한 메모리의 공간이 넓어 진다.

32bit 컴퓨터에서 사용가능한 메모리 공간은 최대 4GByte (4,294,967,296 byte = 2^32 byte)이다. 어떻게 해서 이런 값이 결정이 되었나?

만약 4bit 로 메모리 공간을 표현한다면 2^4 = 16 개의 주소값을 표현할 수 있다. 즉 16byte 의 메모리를 표현가능 하다. 따라서 주소값을 표현하기 위해서는 표현 범위도 넓을 뿐 아니라 가장 효율적으로 표현할 수 있는 방법으로 주소값을 표현할 bit 를 결정해야 한다.

만약 32bit 컴퓨터에서는 한번에 32bit 의 데이터를 전송하고 처리가 가능하므로 64bit로 주소값을 표현하기로 하였다면 주소 공간은 2^64 개 만큼 넓어지나 CPU에서 처리를 위해서는 주소값을 2번에 걸쳐 전송이 이루어져야 하고 최소 2번 이상의 연산과정이 필요하다.

따라서 32bit 컴퓨터에서 메모리 표현은 32bit로 하게 되었다.
그렇다면 64bit 컴퓨터에서는 메모리 표현을 64bit로 하는 것이 가장 효율적으로 메모리를 표현하는 방법일 것이다.

. 64bit 시스템에서의 프로그래머에게 생기는 변화

1. 데이터 형의 변화

시스템에 따라 데이터형의 크기가 다르다. 예를 들어 Windows 시스템에서는 LLP64라는 데이터 표현모델을 따라 long형이 64bit 시스템에서도 여전히 4byte 인데 반해 UNIX 시스템에서는 LP64라는 데이터 표현모델을 따라 long형이 8byte가 된다.


프로그래머가 기존의 프로그래밍 스타일에서 당면할 수 있는 문제는 포인터와 int 형의 데이터 크기가 맞지 않으므로 인해 발생하는 문제가 대부분 일 것이다.

예를 들어
int array[40] = { 1, 2, 4, 5, };
int arrayPtr = (int) array;

위와 같은 코드가 프로그램 내부에 있을 경우 array가 가르키는 위치가 메모리의 4G 이하의 영역에 존재하는 경우 운좋게 문제가 없을 수 도 있으나 array의 위치가 4G 이상의 범위에 있을 경우 4byte 인 int형의 arrayPtr 는 array 주소값이 가지는 8byte의 값을 담을 수 가 없어 문제가 발생하여 arrayPtr을 통해서는 array의 진짜 주소값을 확인 할 수 없게 된다.

이상 간단하게 64bit 와 32bit 컴퓨터의 차이점에 대해 알아보았다. 아직은 64bit 가 대세라고 할 순 없지만 조만간 그 변화의 물결은 모르는 새에 서서히 다가올 것이며 나만 모르지 벌써 다가와서 무릎까지 적셨을지도 모르겠다. 

한동안 32bit 와 64bit 시스템이 혼용됨으로 인해 프로그래머는 두가지 환경에서 잘 작동할 수 있는 프로그램을 작성하는 수고를 피할 수 없을 것 같다.