3장 64비트 기반 프로그래밍

Lamjwi·2023년 12월 26일

Section 01: Win32 vs Win64

  • Win32와 Win64는 마이크로소프트 Windows 운영 체제에서 사용되는 두 가지 중요한 프로그래밍 인터페이스(API)입니다. 이들은 각각 32비트와 64비트 시스템 아키텍처를 대상으로 합니다. 이 섹션에서는 두 시스템 간의 주요 차이점과 그들이 프로그래밍에 미치는 영향에 대해 살펴보겠습니다.

Win32 vs Win64의 주요 차이점

  • 데이터 처리 능력
    • Win32
      • 32비트 시스템에서는 한 번에 32비트의 데이터를 처리합니다.(4바이트)
    • Win64
      • 64비트 시스템에서는 한 번에 64비트의 데이터를 처리할 수 있습니다. 이는 더 큰 데이터 블록을 효율적으로 처리할 수 있음을 의미합니다.(8바이트)
  • 주소값 표현의 확장
    • Win32
      • 32비트 주소 체계를 사용하여, 메모리 주소의 범위(4GB)가 제한됩니다.
    • Win64
      • 64비트 주소 체계를 사용하여, 훨씬 더 큰 메모리 주소 공간을 활용할 수 있습니다. 이는 프로그래머가 더 큰 메모리 영역을 활용할 수 있게 하며, 대규모 데이터를 효과적으로 처리할 수 있도록 돕습니다.
  • 자료형의 다형성(Polymorphism):
    • Win64
      • Polymorphic 자료형의 도입으로, 환경과 상황에 따라 자료형의 의미가 유동적으로 변할 수 있습니다. 예를 들어, LONGPTR, ULONGPTR, INT_PTR, UINT_PTR 등이 이에 해당합니다. 이러한 자료형은 32비트 시스템과 64비트 시스템 간의 호환성을 유지하면서, 시스템 특성에 맞게 최적화된 성능을 제공합니다.
  • 호환성과 성능:
    • Win32
      • 오래된 시스템과의 호환성 유지에 중점을 두며, 32비트 애플리케이션에 적합합니다.
    • Win64
      • 더 높은 성능과 확장된 메모리 관리 기능을 제공합니다. 64비트 애플리케이션 개발에 적합하며, 더 큰 데이터 집합과 복잡한 계산을 처리하는 데 유리합니다.

결론

  • Win32와 Win64는 각각의 시스템 아키텍처에 맞추어 최적화된 성능과 기능을 제공합니다.
  • 프로그래머는 자신이 작업하는 시스템의 요구사항과 성능 기대치를 고려하여 적절한 API를 선택해야 합니다.
  • Win64는 현대적인 컴퓨팅 환경에서의 대규모 데이터 처리와 복잡한 계산을 위한 강력한 도구로 자리매김하고 있습니다.

Section 02: 프로그램 구현 관점에서의 WIN32 vs WIN64

LLP64 vs LP64

  • LP64와 LLP64는 64비트 시스템에서 사용되는 두 가지 주요 데이터 모델입니다.
  • LP64 모델
    • 대부분의 Unix시스템에서 사용되며, 여기서 'long'은 4바이트이고 'pointer'는 64비트입니다.
  • LLP64 모델
    • Windows에서 사용되며, 'long'과 'pointer'가 64비트입니다.

64비트와 32비트 공존의 문제점

  • 64비트 시스템에서는 32비트 시스템과 호환성을 유지하면서도 더 큰 메모리 주소 공간과 데이터 처리 능력을 제공합니다.
  • 그러나 32비트와 64비트 코드 간의 상호 운용성 문제가 발생할 수 있으며, 이는 특히 주소값이나 데이터 크기가 중요한 경우 문제가 됩니다.
#include <stdio.h?
int main(void)
{
	int arr[10] ={ 0, };
    int arrVal = (int)arr; 				// 1
    printf("pointer : %d \n", arrVal);
}
  • 1번에서는 64비트 Windows LLP64가 기본 모델이므로 int는 4바이트 포인터는 8바이트다 위 예제는 그래서 형 변환 과정에서 데이터 손실이 발생할 수 있다.

첫번쨰 결론 : 64비트 시스템에서는 포인터가 지니고 있는 주소값을 4바이트 정수형으로 형 변환하지말자

Windows 스타일 자료형

  • Windows API는 고유한 스타일의 자료형을 사용합니다 (예: DWORD, HANDLE 등).
  • 이러한 자료형들은 Windows 프로그래밍에서 일관성과 호환성을 유지하는 데 중요합니다.
  • WINDOWS 자료형
    • 천천히 보자.

두번쨰 결론: 유니코드와 아스키코드를 공통으로 지원하도록 예제를 작성하되, 64비트 시스템에서 새롭게 정의된 자료형은 가급적 사용하지 않겠다.

Windows 자료형 확인하기

  • Windows 개발 환경에서는 Visual Studio와 같은 툴을 사용하여 자료형을 확인하고 이해할 수 있습니다.

  • 자료형이 어떻게 정의되어 있는지 직접 찾는 방법을 통해 개발자는 필요한 자료형에 대한 깊은 이해를 얻을 수 있습니다.

  • 자료형 확인 방법

    • 마이크로소프트가 정의한 모든 자료형을 일일이 설명하는 대신,
    • 개발자들은 Visual Studio와 같은 개발 도구를 사용하여 자료형이 어떻게 정의되어 있는지 직접 확인할 수 있습니다.
      • 예를 들어, INT64 자료형에 마우스 오른쪽 버튼을 클릭하여 해당 자료형이 정의된 위치로 이동할 수 있습니다.(f12)

Polymorphic 자료형

  • Windows에서 WIN64 기반으로 이동하면서 도입되었습니다.
    • 이 자료형은 상황과 환경에 따라 다른 의미를 가질 수 있으며, 32비트 시스템에서는 32비트로, 64비트 시스템에서는 64비트로 선언됩니다.
    • 이는 32비트와 64비트 시스템 간의 호환성을 높이는데 중요한 역할을 합니다.
    • 개발 과정에서 이 자료형을 직접 선언하는 일은 드물지만, Windows에서 제공하는 시스템 함수 중 많은 부분이 이 자료형을 기반으로 구현되어 있습니다
  • 조건부 컴파일
    • _WIN32와 WIN64를 기반으로 상황에 맞게 적절히 컴파일 되도록 함수를 구현하는 것이다.
#if defined(_WIN64)
UINT64 CalDistance(UINT64 a, UINT64 b)
#else
UINT CalDistance(UINT a, UINT b)
#endif
{
    return a - b;
}
  • 더러운 코드라는 의견이 주.
    • 매크로로 인해서 가독성이 많이떨어짐

Section 03: 오류의 확인

GetLastError 함수와 에러코드

  • 프로그래밍 과정에서 오류가 발생하는 것은 피할 수 없는 일입니다.
  • 중요한 것은 발생한 오류의 원인을 파악하고 해결하는 능력입니다.
    • Windows 시스템 프로그래밍에서는 GetLastError 함수가 핵심적인 역할을 합니다.
  • GetLastError 함수의 중요성
    • 오류 발생시 대응: Windows 시스템 함수를 호출하는 과정에서 오류가 발생하면, GetLastError 함수를 호출하여 해당 오류의 원인을 파악할 수 있습니다.
    • 이 함수는 마지막으로 발생한 오류 코드를 반환합니다.
DWORD GetLastError(void);
  • unsigned long과 동일합니다.
  • 오류 코드의 이해
    • GetLastError 함수가 반환하는 오류 코드를 이해하고 해석하는 것은 프로그래밍 과정에서 발생하는 문제를 효율적으로 해결하는 데 필수적입니다.

오류 코드의 활용

  • 오류 코드 확인
    • 프로그램이 예상치 못한 방식으로 동작할 때, GetLastError를 호출하여 반환된 오류 코드를 확인합니다.
    • 이 코드는 MSDN과 같은 문서에서 해당 오류의 상세한 설명과 해결 방법을 찾는 데 사용될 수 있습니다.
  • 디버깅 및 문제 해결
    • GetLastError 함수를 통해 얻은 오류 코드는 프로그램의 버그를 해결하고 시스템의 정확한 동작을 보장하는 데 중요한 정보를 제공합니다.

Syetem Programming Project Design

  • 주말에 하자.

1차 23.12.26
2차 23.12.27
3차 23.12.28
4차 23.12.29
5차 24.01.02
6차 24.01.03

profile
ㅇㅅㅇ

0개의 댓글