데이터 프로세싱
요즘은 스마트폰등 컨슈머 디바이스에 64비트 CPU가 많이 쓰이지만, 여전히 임베디드 분야에서는 고성능의 하이엔드 제품군을 제외하고는 대부분 32비트 계열이 주력으로 사용된다. 로우엔드 제품군에는 아직도 8비트, 16비트 프로세서들이 사용되고 있다. 임베디드의 특징은 결코 오버스펙(Over-spec)하지 않는 것이다. 비용이 최대 관심사이기 때문이다.
각설하고, 64비트 CPU는 주소를 표현하는 비트가 64개라는 얘기다. 그래서 32비트 CPU를 가진 디바이스는 최대 4GB 메모리만을 사용할 수 있다. 실제 4 GB도 전부 사용할 수 있는 것은 아니다. 이 주소공간에는 레지스터라든지 롬(ROM)영역도 다 포함되기 때문이다. OS나 CPU가 32비트 계열이어도 특별한 메모리 확장 기능을 통해 더 많은 공간의 메모리 사용을 가능하게 하기도 한다. 하지만 원론적으로 32비트 계열에서는 4GB의 주소공간만을 사용할 수 밖에 없다.
이번 글에서 다루고 싶은 내용은 64비트, 32비트 CPU나 그 주소공간에 대한 내용이 아니다(나중에 메모리를 다루는 챕터에서 더 자세한 내용을 알아볼 것이다). 임베디드 시스템에서 많이 사용되는 32비트 계열의 CPU에서 64비트의 데어터, 더 정확히는 변수(Variable)를 어떻게 처리하는가에 대해 설명하고자 한다. 이는 내부적으로 어떻게 데이터를 처리하느냐하는 문제로 실제 개발하면서 거의 신경쓰지 않는 부분이기도 하다. 하지만 어느 정도 개발을 해본 경험자라면 당연히 가지고 있어야 할 의문사항이기도 하다.
일단 기본적인 의문부터 해결해보자.
32비트 계열의 프로세서에서 64비트 변수가 사용가능한가?
정답은 사용가능할 수도 있고, 가능하지 않을수도 있다.
컴파일러에 달려 있다. 그렇다면 어떻게 사용하는 것일까?
힌트는 앞서 얘기했듯이, 32비트의 제약은 주소공간에만 있는 것이지, 데이터를 표현하는 방식에는 제약이 없다는 것이다.
컴파일러에서는 64비트 변수가 사용되면 32비트 메모리를 두개를 잡는다.
CPU 내부의 레지스터(register)로 64비트 데이터를 연산할 때는 레지스터를 두 개를 잡아서 데이터를 나누어 담은 후 차례차례로 계산한다. 이런 과정은 컴파일시 기계어코드로 생성되면서 처리되므로, 개발자들은 몰라도 별 상관이 없다.
결론적으로 개발자가 알아야 하는 것은 사용하는 프로세서와 컴파일러에서 64비트 데이터를 사용할 수 있는지 여부 뿐이다.
프로세서의 세계가 아닌 인간세계에서 실제 임베디드 소프트웨어 개발하면서 단일 변수로 64비트를 사용하는 경우는 흔하지 않다. 특정 비즈니스 도메인을 제외한다면, 64비트값으로 표현해야 하는 숫자가 필요한 경우가 별로 없기 때문이다. 대개 32비트 변수로 충분하고, 큰 데이터는 메모리 버퍼(buffer)를 사용해서 처리하는게 일반적이다.
졸저 <개발자 오디세이아> 가 책으로 나왔습니다. 개발자들의 애환과 희망을 담으려 최선을 다했습니다. 많은 사랑 부탁드립니다^^