I'm FanJae.

[SYSTEM PROGRAMMING] WIN32와 WIN64 본문

System Programming

[SYSTEM PROGRAMMING] WIN32와 WIN64

FanJae 2024. 9. 9. 22:22

1. 64비트와 32비트의 구분 방법

1-1. 구분의 두 가지 기준

① 한 번에 전송 및 수신할 수 있는 데이터의 크기 (I/O BUS)

- 한 번에 송수신 가능한 데이터의 크기에 따라서 32비트 시스템과 64비트 시스템이 나뉜다.

② 데이터 처리 능력 (CPU)

- CPU는 외부로부터 들어오는 데이터를 처리하는 능력에 대한 차이가 있다.

 

1-2. 32비트 -> 64비트

① 프로그래머 입장에서 볼 때 32비트->64비트

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

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

- 여기서 고려할 점은 포인터의 크기는 크면 클 수록 좋다는 점과 버스의 크기를 고려해야 한다.

② 포인터 크기가 무작정 크면 발생하는 문제점

- 포인터의 크기는 128bit로 두었는데 버스를 64bit이면, 주소 정보를 전달할때, 메모리 전달시 2번의 연산이 발생한다.

- 이렇게 되면 시스템의 전체적 성능 저하가 발생한다.

- 만약 32비트 시스템에서 64비트 주소 표현을 한다고 생각해보자.

- 그러면, 하나의 주소 표현을 위해서 I/O BUS에 2번 전달을 해야한다. -> 상당한 성능 저하가 발생한다.

메모리는 크면 클 수록 좋되, 버스에서 한번에 전송할 수 있는 데이터 크기 만큼 키워주는게 일반적이다.

 

- 32비트에서는 메모리가 충분하다는 가정하에서 표현할 수 있는 메모리의 크기는 32비트가 최고였을 것이다.

- 즉, 이는 4GB이다. 이에 반면 64비트면 2^64승 이다.

32비트 시스템

- 이론상 0번지부터 2^64-1 까지 표현이 가능한 아주 큰 범위이다.

결론 : 32비트에서 64비트로 넘어간 것은 프로그래머 입장에서 표현할 수 있는 최대 메모리의 증가라고 볼 수 있다.

 

1-3. 그렇다면 메모리 확장을 하지 않는다면 무의미한 행위인가?

- 주소 공간이 확장 된다는건 큰 의미가 존재한다. 애플리 케이션이 훨씬 더 큰 데이터 세트를 효율적으로 사용 가능하다.

- 또한, 한 번에 더 많은 데이터를 처리할 수 있어, 동일한 클럭 속도에서 더 많은 계산을 수행 가능하다.

- 일반적으로는 가상 메모리를 통해 이러한 메인 메모리(RAM)의 부족을 극복한다.

int _tmain(void)
{
   TCHAR str[100];
   _tscanf(_T("%s"),str);
   _tprintf(_%("%s"),str);
   return 0;
}

//

int _tmain(void)
{
   TCHAR ch;
   do
   {
      _tscanf(_T("%c", &ch);
      _tprintf(_T("%c"),ch);
   }while(ch != '\n');
   return 0;
}

- 크기만 충분하다면 일반적으로는 전자(코드 기준 위)가 훨씬 편하다.

- 하지만, 메모리 공간이 충분하지 않은 상황(임베디드 시스템)의 경우, 메모리가 제한적이다.

- 따라서 메모리 공간이 넓어짐에 따라서 프로그래밍을 편하게 할 수 있다는 의미이기도 하다.

 

※ 프로그래머 입장에서는 32비트 컴퓨터는 포인터가 32비트, 64비트 컴퓨터는 포인터가 64비트인게 이상적이다.

Comments