본문 바로가기

공부방

윈도우 xp!! 너는 왜 4기가까지만 지원하는거야?


윈도우 XP는 왜 메인메모리를 4기가바이트까지박에 지원하지 않을까???

윈도우xp 는 32비트 운영체제이다(물론 64비트버젼도 있다.)

펜티엄4 시리즈의 CPU는 32비트 시스템이다.
즉 한번에 32비트를 처리함고, 명령어 최대 길이가 32비트라는 것이다.

시스템버스에서 주소버스(Address Bus)를 통해 CPU에서 메인메모리로 주소를 전송하는데
이 주소버스도 32비트이다. 즉 32차선의 도로가 CPU와 메인메모리를 연결해주고,
이 도로를 통해 각각 한 비트씩 총 32비트가 이동할수있다.
즉 메모리에 주소를 2의 32승개만큼 할당지정하수있다느것이다.


아래 그림을 보고 쉽게 이해하자



이는 간략하게 시스템 버스를 나타낸 것이다.
 빨 : 데이터 버스(Data bus),    흑: 제어버스(Control bus),    청:주소버스(Address bus) 다.
이 3개를 합하여 시스템 버스라고 한다.
CPU에서 메인 메모리로 가는 길목의 개수는 32개다. 저렇게 생겼다.
저렇게 생겼으니 32비트를 한번에 보낼수 있는 것이다. 


다시 돌아가서

32비트라 함은
0000 0000 0000 0000 0000 0000 0000 0000
부터
1111 1111 1111 1111 1111 1111 1111 1111
까지 데이터 표현이 가능하다

이것은 2의 32승까지 표현이 가능하단 뜻이다.
10진수로 표시하면 0~4,294,967,296 이다.

 4,294,967,296개 지정 가능하단 소리다.

메모리주소 한개마다 1byte 의 데이터가 들어감으로

4,294,967,296 * 1byte = 4,294,967,296 byte = 4Gbyte 가 되는 것이다.
그리고 이것이 32비트 시스템에서 지정할수있는 최대 메인메모리의 크기다.

일반적으로 말하는 " 32비트 운영체제는 최대 메모리가 2의 32승 해서 4Gbyte다"
라고 말하지만 이는 정확히 말해 틀린 표현법이다.

말하는 사람이 메모리의 주소마다 1byte의 자료를 저장한다는 사실을 알고있고,
이를 생략해서 단순히 2의 32승Gbyte라고 할수있지만 이는 드물 것이다.
물론 알고있는 사람도 있겠지만, 몰랐던 사람이 더 많았을 것이다.

위 표현을 정확한 표현으로 하면,
32비트 시스템이니까 CPU가 한번에 32비트를 처리한다 그리고 주소버스 역시 32비트 임으로
2의 32승개의 주소지정이 가능하고, 각각의 주소에 1byte의 정보를 담을수 있음으로,
최데 메인메모리는 2의 32승(주소갯수) * 1byte = 2의 32승byte = 4Gbyte 이다.
라고 해야 정확한 표현이다.

이 글을 쓴 이유는
"32비트시스템이니 2의 32승byte다" 에서 시작됬다.
분명 저장장치의 용량을 나타내는 단어는 byte고,
2의 32승개는 주소의 개수를 나타내는 단어인데,(이는 몇개 라고 할수있다.)
즉 'byte' 와 '개' 는 의미가 다른데 어떻게 동급으로 저렇게 말할수있지??
라는 호기심 때문이었다. 독자가 궁금하지 않았다면 할말없다;

마치며 -

이것이 별로 중요치 않다고 생각하는분도 있겠지만,
프로그래머의 입장에서는 단수히 메모리의 한 주소에 1byte 가 들어간다는 것은 매우 중요한 자료일 것이다.

자~ 누군가 "윈도우 xp 메모리는 왜 4기가가 최고야????" 라고  물어보면 자신있게 답하자~.










여담으로 위 내용과 연관되는 부분이 있어 조금 나열해 보았다.
이것의 의미는 각자 찾도록 하자. 메모리 구조를 생각해보면서 하면 도움이 될것이다.

C 에서 character 형은 1byte 요, int 형은 4byte다.

void main()
{
 int a,i;
 int *ip;
 char *p;
 a=12345;//사용자 지정 임의의 수
 p=(char*)&a;
 ip=&a;
 
 for(i=0;i<4;i++) 
  printf(" p 가 가르키는 주소 : %d\n",p++); // %d 10진수로 표시했으니 1씩 증가.
 
 p=(char *)&a;
 
 for(i=0;i<4;i++)
        printf(" p 가 가르키는 주소의 값 : %d\n",*p++);//4바이트의 내용을 1바이트씩 끊어서 출력
 
 for(i=0;i<4;i++) 
  printf(" ip 가 가르키는 주소 : %d\n",ip++);// %d 10진수로 표시했으니 4씩 증가.
 
 ip=&a;
 
 for(i=0;i<4;i++)
  printf(" ip 가 가르키는 주소의 값 : %d\n",*ip++); //4바이트의 내용을 4바이트씩 끊어서 출력
                                                       // 따라서 두번째 부터는 알수없는 값(쓰레기값)출력. 
}