윈도우즈 시스템 프로그래밍

윈도우즈 시스템 프로그래밍 3장 - WIN32 vs WIN64

111-000-111 2021. 7. 20. 14:13

 

 

뇌를 자극하는 윈도우즈 시스템 프로그래밍이라는 책과 해당 책의 저자이신 윤성우님의 강의를 통해 공부한 내용을 정리하는 글입니다.

 

 


 

 

 

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

 

⦁ 구분의 두 가지 기준

    ⦁ 한번에 송수신 가능한 데이터 크기 : CPU가 버스를 통해서 한 번에 전송 및 수신할 수 있는 데이터 크기

    ⦁ 데이터 처리 능력 : CPU가 한 번에 외부로부터 읽어들일 수 있는 데이터 크기(명령어를 포함해서)

 

 

 

 

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

 

 

⦁ 32비트 → 64비트

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

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

 

 

32비트 시스템에서는 포인터도 32비트이고, 64비트 시스템에서는 포인터가 64비트이다.

포인터가 크면 클수록 프로그래머에겐 유리하다. 그만큼 표현 가능한 주소의 값이 큰 것이기 때문이다.

예를들어 메모리는 1GB인데 4비트로만 주소값을 표현한다면, 메모리가 아무리 1GB라고 해도 16개의 주소만 활용할 수 있기 때문에 비효율적이다.

또 한가지 예로 32비트 시스템에서 64비트 주소체계를 사용한다고 가정하면 32비트씩 2번에 걸쳐서 버스 시스템이 전송을 해야하기 때문에 시스템의 성능 저하를 야기시킬 수 있다. 따라서 보편적으로 메모리는 클수록 좋되, 버스 시스템에서 한번에 전송할 수 있을 만큼만 큰 것이 성능에 도움이 된다.

 

그렇다면 주소의 표현 범위가 넓을수록 프로그래머에게 유리할까?

예를들어 총 활용 가능한 메모리 크기가 40바이트라고 가정했을 경우에 다음과 같은 프로그램을 실행하려고 한다.

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

 

UNICODE 매크로 정의 유무에 따라 TCHAR는 1바이트가 될 수도 있고, 2바이트가 될 수도 있다.

1바이트라고 가정해도 배열 str은 100바이트가 필요하다. 이때 총 활용 가능한 메모리 크기가 40바이트이므로 실행할 수 없는 프로그램이 되어버린다. 그렇기 떄문에 아래와 같이 프로그램이 수정되어야 실행이 가능하다.

 

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

 

이 프로그램은 문자열의 끝을 만날때 까지 1바이트씩 읽어들이는 프로그램이다.

이처럼 메모리가 제한적인 상황에서는 위와 같은 문제점이 생길 수 있다.

가용 메모리의 크기가 커진 64비트의 경우는 기존의 32비트에 비해 이러한 문제점에서 비교적 자유롭다.