일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 개발자
- 파헤쳐보자
- ngrinder
- C++
- Router
- 특징
- Stream
- socket.io
- node.js
- scrum
- Groovy
- java
- 스크럼
- 소켓
- 자바
- Django
- 스크럼 마스터
- benchmark
- 노드
- 이벤트 루프
- RDF
- 노드js
- Knowledge Graph
- express
- Python
- 지식 그래프
- 스레드
- nodejs
- 예제
- node
- Today
- Total
라봉이의 개발 블로그
Window 64, 32bit 차이와 메모리 주소의 상관관계[c++][컴파일러][운영체제] 본문
일단 Window 64비트와 32비트의 차이는 CPU가 처리하는 데이터의 최소 단위인 레지스터의 비트 개수를 나타냅니다.
그러니까 32비트 운영체제는 32 비트의 데이터를 계산, 처리할 수 있고 64비트 운영체제는 64비트의 데이터를 계산, 처리할 수 있다는 의미이다.
하지만 운영체제가 64비트라면 CPU도 64비트를 지원해야한다. 하지만 요즘 CPU는 거의 대부분 64비트를 지원하기때문에 상관없다.
이때 한가지 의문점이 생긴다.
64비트 윈도우 환경에서 32비트 윈도우에서 만든 응용프로그램이 문제 없이 잘 돌아갈까? 32비트 윈도우에서 만든 프로그램은 바이너리 코드가 32비트 운영체제와 32비트 프로세서에 맞춰 컴파일러에 의해 번역되었을테고 CPU가 계산하는 비트 수가 32비트일텐데 여러가지 문제가 생길 것 같지 않은가? 하지만 문제 없이 돌아간다.
64비트 윈도우는 WoW64(Window 32 On Window 64)라는 시스템이 탑재되어있는데 이 WoW64는 운영체제의 하위 시스템으로 모든 64비트 버전의 마이크로소프트 윈도우에서 32비트 응용 프로그램들이 돌아가도록 도와준다.
그래서 윈도우 64비트에서 32비트 응용프로그램은 자신이 윈도우 32비트 환경에 있는 걸로 착각하고 실행이 된다.
윈도우 32비트에서 윈도우 64비트로 넘어가게 된 사연을 읊어보자면 아까 CPU가 계산하는 비트 수가 32비트라고 했는데 이는 2^32까지의 수만 계산 할 수 있다는 소리이다.
프로그램이 실행되려면 프로그램이 메인 메모리에 올라간 뒤에 CPU가 메모리 내에 있는 명령문을 불러와서 계산하고 동작해야 프로그램이 실행되는 것이다.
그리고 메인 메모리에 저장 된 명령문을 불러오려면 메인 메모리 내의 어느 위치에 어떤 명령문을 불러와야 할 지 결정해야하는데 그 위치를 담당하는게 메모리 주소다.
따라서 특정 위치에 있는 명령문을 불러오려면 그 메모리 위치의 주소를 가져와야하는데 CPU가 계산할 수 있는 비트 수가 32비트이므로 2^32 = 4294967296개의 주소공간을 가리킬 수 있으므로 4294967296BYTE = 4GB 까지의 메모리만 인식이 가능하다.
따라서 그 이외에 추가를 해도 윈도우 내에서 사용할 수 있는 메모리 크기는 4GB이고 요즘 시대에 4GB 메모리로는 여러 프로그램을 돌리는 게 한계가 있다.
그리고 CPU가 데이터를 64 비트 단위로 한번에 처리하면 32 비트를 처리하는 CPU 보다 이론 적으론 2배 빠르므로 64 비트 운영체제로 넘어가게 되었다.
★★★
방금 메모리 주소라고 하였는데 C++ 포인터는 그 메모리 주소를 가리키는 변수이다. 따라서 포인터를 모니터에 출력하게 되면 0x00000000 부터 0xFFFFFFFF까지 나오게 된다. 각각 숫자마다 16진수 -> 2^4비트가 필요하고 8자리이므로 (2^4)^8 = 2^32비트이고 2^32비트 -> 총 4Bytes의 공간이 필요하게 되어 sizeof 함수로 출력하게 되면 4가 출력된다. 이때 int 형 변수는 컴파일러마다 크기가 다르지만 보통 4바이트이다.
visual studio 2013환경에서 출력한 커멘드 창이다.
하지만 작성자의 컴퓨터 환경은 윈도우 64비트에 cpu는 64비트인 Intel® Core™ i7-6700HQ Processor를 사용하고 있다. 왜 그렇다면 포인터 크기가 4Bytes인걸까??
이유는 컴파일러에 있다. 사진의 상단 오른쪽에 보면 Debug : Win32라고 나와있는데 이는 32비트 윈도우 환경에 맞추어 컴파일했기 때문에 포인터 크기가 4Bytes라고 나온 것이다. 이를 64 비트 환경으로 바꾸어보자
포인터 값도 16개의 숫자로 바뀌었다.
이를 보면 알 수 있듯이 Visual studio는 컴퓨터의 다양한 환경에 맞추어 컴파일 할 수 있도록 만들었다. 워낙 많은 컴퓨터가 세상에 존재하기 때문에 호환성을 위해 Visual Studio가 만들어졌나보다.
'컴퓨터 사이언스 > 개인 연구' 카테고리의 다른 글
리눅스 쓰레드(linux thread) 처리, 커널 레벨(kernal level) 쓰레드와 유저 레벨(user level) 쓰레드 (0) | 2018.04.30 |
---|---|
CPU와 어셈블리 언어, 기계어, 어셈블러, 컴파일러, 링커의 상관관계 [용어][c][컴퓨터구조] (0) | 2018.02.27 |