SERVER > WINNT - Tip&Tech > 64비트와 32비트 차이
 
SERVER
LINUX
Windows NT
 
아파치
WINNT - Tip&Tech
  HOME > SERVER > WINNT - Tip&Tech
 
작성일 : 12-07-11 11:24
64비트와 32비트 차이
 글쓴이 : 덩벙이 (211.♡.155.28)
조회 : 1,566   추천 : 0   비추천 : 0  
   http://blog.naver.com/kater102/133055974 [276]

 64비트를 설명하기 전에 전번 포스팅에서 보았던 컴퓨터 시스템 구조 그림을 다시 한번 볼까합니다.

 

(출처:뇌를자극하는윈도우즈시스템프로그래밍)

 

 Windows 7 이 나오면서 64비트 컴퓨터, 또는 64비트 운영체제.. 64비트기반이라는 말을 많이 하게됩니다. 그럼 도대체 우리가 쓰고 있는 32비트, 64비트 무슨 말일까요?

 

 1. 한 번에 전송 및 수신할 수 있는 데이터의 크기 (I/O버스를 통해)

    오가는 데이터의 크기가 32비트이면 32비트 컴퓨터, 64비트면 64비트 컴퓨터랍니다.

 

 2. 데이터 처리능력 (CPU에서)

    CPU에서는 전송받은 데이터를 처리하는 데 그 데이터를 한번에 32비트 처리하면 32비트 컴퓨터, 64비트를 처리하면 64비트인 것이죠.

 

 "한 번에 송, 수신할 수 있는 데이터 크기와 한 번에 처리할 수 있는 데이터 크기를 기준으로 32비트 컴퓨터와 64비트 컴퓨터를 구분 짓는다"

 

 라고 할수있겠죠 ^^ 이제 32비트 컴퓨터, 64비트 컴퓨터가 뭔지 아셨나요?

 

 *프로그래머 입장에서의 64비트 컴퓨터

 

 

(출처:윈도우즈시스템프로그래밍)

 32비트, 64비트를 공부하기전에 먼저 위 그림 4비트 컴퓨터를 보겠습니다. 주소값을 사용하기 위해서 4비트 컴퓨터 즉 4비트의 주소값을 사용한다면 메모리는 1GB 는 되는데 사용할수있는 메모리는 16개밖에 안되니깐 나머지 공간은 모두 낭비하게 되는 것입니다.

 

 마찬가지로 32비트 컴퓨터는 메모리 주소값으로 32비트, 즉 4바이트 (포인터 자료형크기) 로 계산을 하는 것이고, 64비트(8Byte)는 8Byte의 주소값 크기를 갖는 것이죠.

 

 젠장, 포인터 크기를 4바이트로 알고있는데 8바이트라고!!!? 이런 말도 안되는!!

 

 (....) 컴퓨터는 발전...합니다. 포인터 자료형의 크기는 무조건 4바이트가 아닙니다. 64비트 컴퓨터에서는 8바이트로 계산되어진답니다.

 

 4비트는 2의 4승으로 16개 메모리(16바이트)를 사용했고, 32비트는 2의 32승이니 대략 4GB의 주소의 범위를 사용합니다. 이것도 충분했었는데 이제는 64비트 2의 64승.. (알아서 계산하시길.)

 

 32비트와 64비트는 호환성의 여러 문제를 가지고 있습니다. 32비트 프로그램이 64비트 체제에서 작동하면 그만큼 남은 처리능력을 낭비하는 것이고 ..( 어차피 데이터 전송은 32비트가 될것이니)

 

 64비트 프로그램을 32비트 체제에서 동작시키면 두번이나 동작을 해야되기때문에 상당한 프로그램 처리 속도의 저하를 가지고 오겠죠. (옛날 컴퓨터에 64bit Windows 7 을  깔면?? 안해봐서..)

 

 32비트에서 64비트로 올라간다는 의미는 다음 두가지로 요약될 수 있습니다.

1. 프로그램으로 표현할 수 있는 범위의 증가

2. 표현할 수 있는 메모리 전체의 크기

 

 즉, 프로그래머에게 좀 더 많은 메모리의 양을 제공해주게 되는 것입니다. (나쁜게 아니라 좋은거죠.)

 

 그럼 도대체 64비트 프로그래밍은 어떻게 해야되고 32비트 프로그램과의 차이점은 무엇일까요?

 

 운영체제

모델 

char 

short 

int 

long 

 포인터 

 Windows 

LLP64 

1Byte 

 2Byte 

 4Byte

 4Byte

 8Byte

 UNIX

LP64

1Byte 

 2Byte

 4Byte

 8Byte

 8Byte

 

 각각의 64비트 운영체제에서 따르는 데이터 표현 모델입니다. 거의 똑같죠? 하지만 저희가 차이점을 느끼는 이질감을 느낄수 있는 부분이 바로 포인터는 8Byte 라는 것입니다.

 

 

 

 

 주소값 (배열의 이름 ) arr 을 정수형으로 표시하기 위해서  int 로 캐스팅을 했는데 이때 64비트 시스템에서는 데이터 손실이 발생할 수 있는 것입니다. (왜냐하면 64비트에서는 포인터는 8바이트이니깐)

 

 64비트 시스템에서는 포인터가 지니고 있는 주소값을 4바이트 정수형(int는 4바이트)으로 캐스팅하지마라라는 결론을 내릴 수 있겠죠. 

 

 *책에서는 수많은 Windows 자료형을 소개하고 있는데 (윈도우즈 시스템 프로그래밍이니깐) 이 표를 모두 적기엔 시간이 많이 걸릴것 같기도하고.. MSDN 이라는 좋은 놈을 놔두고 굳이 따로 정리할 필요는 없겠다 싶어서 표 내용은 뺐습니다.

 

 대신 해당 자료형에다가 우측 마우스 클릭을 해서 Go To Definition 을 클릭하면 해당 자료형이 어떻게 정의되어있는지 살펴볼 수 있답니다. MSDN 에서 검색하셔도 좋구요. http://msdn.microsoft.com/en-us

 

*Polymorphic 자료형



 아스키코드/유니코드 기반의 프로그래밍, 즉 두개의 호환성을 갖는 프로그래밍을 하기 위해서 http://blog.naver.com/kater102/132971764

 

 에서  MBCS 와 WBCS 의 동시 지원(UNICODE)

할수있는 프로그래밍에 대해서 알아보았습니다. 그러면 이제 저희는 32비트와 64비트 호환성을 위해서 어떻게 프로그래밍을 할지 알아보겠습니다.

 

 32비트와 64비트 프로그래밍을 할 때 큰 차이점은 딱 하나 포인터가 8Byte라는 것입니다. 물론 64비트 자료형 INT64 라던지 DWORD64 등의 자료형도 있지만^^

 

 여기서는 주소값을 계산하기위해 쓰이는 자료형 중 Polymorphic 자료형에 대해서 살펴보겠습니다. 객체지향언어를 공부하셨다면 다형성에 대해서 어느 정도 아시고 계실듯? 한데요. 말 그대로 하나의 물체가 여러가지 형태를 가질수 있는 성질이라고 생각하시면 됩니다.

 

 

 #if defined(_WIN64)

 

    typedef _int64  LONG_PTR;

    typedef unsigned  _int64 ULONG_PTR;

 

    typedef _int64 INT_PTR;

    typedef unsigned _int64  UINT_PTR;

 

#else

    typedef long LONG_PTR;

    typedef unsigned  long ULONG_PTR;

    typedef int INT_PTR;

    typedef unsigned  int UINT_PTR;

 

#endif 



 윈도우즈 자료형에서는 PTR 이 붙은 위와 같은 자료형을 제공합니다. PTR 이 붙어서 포인터 자료형이라고 생각하실 수 있는데 포인터 자료형이 아닌 포인터를 계산하기 위한 (주소 값 차이) 자료형이라고 할 수 있겠네요. 감이 안오신다면 예제를 살펴보겠습니다.

 

 *대문자로 표시된 INT UINT 는 Windows 자료형으로 int, unsigned int 와 동일하다. (32비트 기반의 Windows 프로그래밍)

 

 이 코드는 32비트 기반 프로그래밍이라서 64비트 시스템에서는 4바이트로 표현 불가능한 주소의 범위 값이 나오면 프로그램 에러가 날 수 있습니다. (데이터가 손실되기때문에 제대로된 주소 차이 값을 계산하지 못하겠죠.)

 

 유니코드 프로그래밍을 위해서 #define UNICODE, #define _UNICODE 로 조건부 컴파일을 해줬는데 여기서는 Polymorphic 자료형으로 호환성 문제를 해결할 수 있습니다.

 

 

 

 UINT 대신에 UINT_PTR 로 트랜스포밍 해줌으로써 호환성을 갖춘 프로그램이 되었네요.

 

지금 이 프로그램이 그러면 32비트일까요? 64비트일까요?

 

 그건 여러분들의 컴퓨터 실행환경이 32비트면 32비트 프로그램, 64비트면 64비트 프로그램이겠죠?

 

 지금까지 64비트 시스템의 특징과 64비트 프로그래밍 방법에 대해서 알아보았습니다 ^^

 

 감사합니다.

 

 

 --By Flow

 

(참고 : 뇌를자극하는윈도우즈시스템프로그래밍)


 
 

Total 4
번호 제   목 글쓴이 날짜 추천 비추천 조회
4 http 와 https 간에 세션 공유 덩벙이 08-24 0 0 90
3 윈도우 서버 예약된 작업으로 asp (classic) 파일 자동 실행 시… 덩벙이 08-24 0 0 103
2 64비트와 32비트 차이 덩벙이 07-11 0 0 1567
1 윈도우 XP IIS에서 접속자 수 늘리는 방법 (403.9에러) 덩벙이 10-20 0 0 2200
 
개인홈페이지 덤벙닷컴은 프로그래머와 디자이너위한 IT커뮤니티 공간입니다.
Copyright ⓒ www.dumbung.com. All rights reserved.