Window OS를 설치할때 32비트 혹은 64비트 윈도우를 설치할 것인지 사용자에게 묻는다.
본인이 중학생, 고등학생때는 64비트? 더 높으니까 32비트보다는 좋아보여서,
그리고 32비트 윈도우에서는 RAM을 4GB밖에 인식을 못하니, 64비트 윈도우를 '무지성'으로 설치했던 기억이 있다.
그렇다면, 32비트 윈도우에서는 왜 메모리를 4GB밖에 인식하지 못할까?
라는 의문이 컴공과 2학년이 되어서야 들기 시작했다..
그 이유를 알고자 전공책과 구글서치를 한 결과를 포스팅하려한다.
32비트 CPU
우선, 우리가 현재 사용하고 있는 CPU는 크게 2가지로 나뉜다.
- 32비트 CPU
- 64비트 CPU
레지스터는 CPU가 처리할 데이터들을 잠깐 담아두는 일종의 메모리이다.
32비트 CPU는 한번에 최대 32비트의 데이터를 처리할 수 있으며, 레지스터 또한 32비트의 데이터를 담아 둘 수 있다.
즉, 한번에 32비트(2의 32승), 약 40억까지 표현할 수 있다는 뜻이다.
CPU는 메모리에서 데이터를 가져오는데, 그전에 메모리의 주소를 알아야한다.
32비트 CPU는 최대 2의 32승까지 표현할 수 있기 때문에, 0~2의32승 까지의 메모리주소만 접근 가능 하다.
4GB의 메모리만 인식하는 이유
일단 데이터의 단위에 대해서 살펴보자.
- Bit : 1 또는 2
- Byte : 8Bit = 2^3
- KB : 1024Byte = 2^10 * Byte
- MB : 1024KB = 2^20(mega) * Byte
- GB : 1024MB = 2^30(giga) * Byte
만약, 32비트 컴퓨터라면
메모리주소의 공간이 1Byte이고, 0부터 2^32개의 메모리 주소를 읽을 수 있기때문에
총 2^32 * 1Byte 의 용량을 사용할 수 있다.
그리고 2^32는 2^2 * 2^30으로 나타낼 수 있으며,
2^30은 GIGA로 표현된다. 그러면, 2^2 * 2^30 = 4 * GIGA이다.
즉, 2^32 * 1Byte는 4 * GIGA * 1Byte이므로,
4GB가 되는 것이다.
만약, 이 이상의 메모리를 장착한다면 CPU가 처리할 수 있는 메모리주소를 넘기 때문에,
인식하지 못한다.
64비트 컴퓨터도 같은 방식으로 계산해보면 된다.
C언어에서 포인터의 sizeof
만약, C언어에서 포인터를 선언하고 그 포인터 변수를 sizeof함수로 계산하면,
어떻게 될까?
#include <stdio.h>
int main(void) {
int *p; //포인터 변수
int size;
size = sizeof(p);
printf("%d\n", size);
return 0;
}
결과는 8이 출력된다.
왜 포인터 변수의 크기가 8일까?
sizeof의 반환값은 byte단위이다.
8이 출력되었다는 것은, 8byte라는 뜻이다.
그렇다면 왜 포인터 변수의 sizeof의 값은 8byte일까?
64Bit 컴퓨터라고 가정해보자
64비트 컴퓨터는 한번에 64비트의 데이터를 처리할 수 있다.
즉, 0~2^64의 메모리 주소에 접근할 수 있다.
그것은, 2^64개의 수를 표현할 수 있는 변수가 필요하다는 뜻으로 8Byte라면 가능하기 때문에
메모리 주소를 가리키는 포인터 변수의 크기는 8Byte되어야 한다.
틀린 부분이 있다면 지적해주세요)
'컴퓨터 공학(Computer Science)' 카테고리의 다른 글
정적 링킹(Static Link), 동적 링킹(Dynamic Link), 그리고 컴파일 (2) | 2024.06.24 |
---|---|
책 - 그래서 컴퓨터는 어떻게 동작하나요? 후기 (3) | 2023.06.19 |
버퍼(Buffer)란? (0) | 2023.04.17 |