하드웨어 입장에서의 64bit 시스템
일반적으로 32비트 시스템을 많이 사용 하지만 현재 64비트 시스템으로 많이 옮겨 갔다.
64비트와 32비트의 구분 방법
구분의 두가지 기준
한번에 송수신 가능한 데이터 크기
이 부분은 I/O 버스에 의존적이다. 즉 BUS 시스템이 32bit냐 64bit냐가 중요하다.
데이터 처리 능력
이 부분은 CPU 능력에 의존적이다.
CPU가 한번에 읽어들일 수 있는 명령어의 크기를 의미한다.
ALU만 생각하지 말고 CPU가 전체적으로 한번에 읽어들일 수 있는 명령어라 생각하자.
만약 32bit 시스템이라 하면 내가 읽어들일 수 있는 명령어는 32bit이다.
16bit 명령어가 2개가 있다고 하면 시스템에 따라서는 2개의 명령어를 한번에 fetch 할 수 있다.
- 명령어는 I/O 버스를 통해서 데이터가 이동한다
- 명령어A는 명령어만을 의미하는게 아니라 연산에 필요한 데이터가 될 수 있다.
- 이때 한번에 64bit를 이동 시킬 수 있으면 64bit 시스템 32bit면 32bit 시스템이다.
- 데이터를 CPU로 이동 시키고 나서 64bit 데이터를 레지스터에 한번에 저장을 하고 컨트롤 유닛에 의해서 해석이 되고 ALU에 의해서 처리가 되는 이렇게 전체적으로 64bit 데이터를 한번에 처리 할수가 있으면 64bit 시스템이다. 32bit밖에 처리가 안되면 32bit 시스템이다.
64bit 만큼의 데이터를 이동시켰는데 CPU가 내부적으로 처리하는것은 32bit면 완벽한 64bit 시스템이라고 말할 수 없다. 반대로 CPU는 64bit 처리를 하는데 데이터 이동이 32bit면 이것도 완벽한 64bit 시스템이라고 말할 수 없다.
데이터를 처리하는 CPU와 데이터를 송수신 하는 I/O 버스가 동일한 사이즈로 데이터를 주고 받아야 정확한 퍼포먼스가 나오지 하나라도 32bit 이면 완벽한 64bit 처리가 안되고 어디선가 bottleneck이 발생한다. CPU와 I/O 버스의 처리 데이터가 둘다 64bit여야 완벽한 64bit 시스템이다.
프로그래머 입장에서의 64bit 컴퓨터
포인터 크기가 64bit이면 메모리의 64bit만큼 접근할 수 있다. 일반적으로 32bit 시스템에서는 포인터가 32bit이다. 64bit 시스템에서는 포인터도 64bit 포인터를 사용한다.
포인터가 크면 클수록 프로그래머들한테 유리하다. 포인터가 크다는 것은 접근 가능한(표현 가능한) 주소의 값이 크다는 거다.
4bit를 가지고 주소를 표현할때는 총 16개를 표현할 수 있다. 이러한 경우 총 4개의 bit만을 가지고 주소를 가리킨다. 이럴 경우 메모리가 아무리 1GB가 있다 하더라도 총 16개의 주소만 어드레싱 할 수 있기 때문에 메모리의 대부분의 영역을 사용할 수 없다.
이런 문제점 때문에 포인터의 크기는 최대한 크면 클수록 좋다. 포인터의 크기가 크다는 것은 메모리에 접근할 수 있는 범위가 그만큼 크다는 의미다.
포인터의 크기가 128bit 인데 I/O의 이동 가능한 데이터 크기가 64bit라면 주소 정보를 전달할때 총 두번에 걸쳐서(64bit씩) 주소 데이터를 보내야한다. 하나의 주소를 표현하기 위해 I/O 버스를 두번 사용하는 것은 시스템의 전체적인 성능 저하를 부른다.
따라서 보편적으로 메모리는 크면 클수록 좋지만 어느 정도로 커야 하냐면 버스에서 한번에 전송할 수 있는 데이터 크기만큼 키워주는게 좋다. 다시 얘기하면 64bit 시스템에서는 포인터를 즉 addressing 하는 것을 64bit로 하여 데이터 송수신 하는것이 성능에 도움이 된다. 그래서 64bit 시스템에서는 64bit의 포인터가 나온거다.
포인터는 크면 클수록 좋지만 허용 가능한 크기가 I/O 버스 시스템이 한번에 송수신할 수 있는 크기만큼 제한해야 한다. 그 이상 커버리면 쪼개서 보내버리기 때문에 성능이 저하된다.
- 우리가 사용할 수 있는 메모리 공간이 1GB라고 하자
- 메인 메모리는 언제든지 접근 가능한 메모리다. 가장 윗 부분에 접근할 수 있고 가장 아랫 부분에 접근할 수 있다.
- 윗 부분을 접근할 수 있는 addressing(주소 지정) 방법과 동일하게 아랫 부분도 접근이 가능해야 한다. 즉 윗부분과 아랫 부분의 addressing 타입은 일치해야 한다.
- 메모리 공간이 1GB라면 1GB를 전부 표현할 수 있는 그러한 메모리 쳬계를 가지고 있어야 한다라는 소리다.
- 전체를 addressing 할 수 있도록 포인터 즉 주소값의 크기가 충분히 커야한다.
- 32bit 시스템에서는 한번에 접근할 수 있는 크기가 2^32bit가 최고다 즉 4GB이다.
- 64bit 시스템에서는 표현할 수 있는 주소의 범위가 0 ~ 2^64 - 1이다.
- 프로그래머 입장에서 32bit 시스템에서 64bit 시스템으로 넘어 간다는 것은 프로그램 상에서 활용할 수 있는 최대 메모리의 크기가 증가했다는 의미다.
그러면 64bit 시스템에서 메인 메모리를 늘려봤자 의미가 없냐??
64bit 시스템과 64bit를 초과한 메인 메모리 사이의 핸디캡은 가상 머신을 통해 극복한다.
정리
64비트 주소 공간을 가리킨다는 것은 포인터가 메모리 상의 주소를 나타내기 위해 64비트 크기를 사용한다는 것을 의미합니다. 이는 컴퓨터가 64비트 아키텍처를 사용하고 있고, 주소 공간이 64비트인 경우 해당 주소 공간의 크기에 대한 표현을 의미합니다.
컴퓨터 메모리의 각 위치(또는 바이트)는 고유한 주소를 가지고 있습니다. 이 주소는 메모리 내의 위치를 식별하는 데 사용됩니다. 포인터는 이러한 주소를 저장하고 참조하여 특정 메모리 위치로 이동할 수 있습니다. 따라서 포인터의 크기가 64비트인 경우, 이 포인터는 64비트 주소 공간 내의 모든 주소를 표현할 수 있습니다. 이것은 포인터가 사용할 수 있는 주소 범위를 의미합니다.
간단히 말해, 포인터가 64비트 주소 공간을 가리킨다는 것은 해당 포인터가 64비트 크기의 주소를 저장하고 이 주소를 통해 메모리 내의 어떤 위치든지 접근할 수 있다는 것을 의미합니다.
참고
https://www.youtube.com/watch?v=GVX-m3RF-K0&list=PLVsNizTWUw7E2KrfnsyEjTqo-6uKiQoxc
'운영체제 > 뇌를 자극하는 윈도우즈 시스템 프로그래밍' 카테고리의 다른 글
뇌를 자극하는 윈도우즈 시스템 프로그래밍 6장 (0) | 2024.09.05 |
---|---|
뇌를 자극하는 윈도우즈 시스템 프로그래밍 5장 (0) | 2024.05.04 |
뇌를 자극하는 윈도우즈 시스템 프로그래밍 4장 (0) | 2024.05.04 |
뇌를 자극하는 윈도우즈 시스템 프로그래밍 2장 (0) | 2024.05.03 |
뇌를 자극하는 윈도우즈 시스템 프로그래밍 1장 (0) | 2024.05.02 |