컴퓨터의 주소표현 (포인터의 크기 & 표현가능한 메모리 주소가 크면 좋은 이유)

APT0·2022년 6월 2일
1

작성자 : juntheworld
원본 : https://juntheworld.tistory.com/115

컴퓨터의 주소개념을 이해할때 헷갈리는 가장 큰 이유는

개인적으로 주소를 나타내는 방법도 "숫자"이고 안에 들어가는 값도 "숫자"이기 때문이라고 생각한다.

무슨 말이냐면, 우선 어떤 호텔이 있다고 생각해보자.

이 호텔은 101호부터 503호까지 있는 5층짜리 호텔이다.

자, 이 호텔이 만약 101호부터 1003호까지 있는 10층짜리 호텔이면,

당연히 손님을 많이 받을 수 있을 것이다.

결론부터 이야기하면 컴퓨터에서 표현가능한 메모리 주소가 커지면 좋은이유

호텔이 커지면(방을 많이 가지면) 손님을 더 많이 받을 수 있는 이유와 같다.

아니 방이 많으면 당연히 많은 손님들을 받을 수 있지 않을까? 어려운 논리가 전혀아니다.

컴퓨터도 표현가능한 주소가 많아질수록, 당연히 넣을 수 있는 데이터가 많아진다.

이게 표현이 어려워서 그렇지 메모리 주소 관련된 이야기들은 다 이논리로 귀결된다.

이제 컴퓨터 메모리를 봐보자.

0x0000부터 0x0014까지 메모리 주소를 가지고있는 메모리가 있다고 했을때,

아까 봤던 호텔이랑 다른건 이 안에 들어가는 값이 사람이 아니라 숫자라는 것 밖에는 없다.

이처럼 호텔은 방번호(주소)는 숫자이고 안에 들어가는건 손님(값)이니, 헷갈릴게 없는데

메모리는 주소도 숫자고 들어가는 값도 숫자라 매우 헷갈린다.

여기서 이제 몇가지 개념을 좀 더 추가하면,

64비트 컴퓨터는 메모리 주소를 나타내는 비트 수가 64비트 라는 뜻인데

그러면 총 2^64 경우의 수를 나타낼 수 있고 주소로 사용할 수 있는 방번호의 갯수가 2^64개인 셈이다.

조금만 정리하면, "메모리 주소를 나타내는 비트 수"는 컴퓨터가 메모리 주소(방번호)를 표현하기위해 사용하기로 약속한 비트의 양이고, 비트의 양은 결국 경우의 수 크기와 완벽하게 동일한 말이기 때문에 메모리 주소를 나타내는 비트 수는 메모리 주소가 0부터 시작할때 가장 큰 메모리 주소를 결정한다.

자자 쉽게 생각하자.

우선 컴퓨터가 메모리 주소를 표현하기위해 사용하기로 약속한 비트 수란,

메모리 주소를 표현하기위해서 얼만큼의 경우의 수들을 할당할거냐에 관한 문제이다.

비트로 표현하고 이걸다시 2^비트로 표현하고 그런 과정이 있는 이유는 컴퓨터가 0과 1로 숫자를 표현하고 비트라는 단위를 이용에 값을 다루기 때문에 어쩔 수 없이 거쳐야하는 과정일 뿐이다.

요약해보면 이 호텔에 몇번 방까지 있어요? 라는건 사용가능한 방이 몇개 있어요?와 완벽하게 동일한 말이라는거다.

어떤 호텔의 가장 큰 방번호가 503이라면, 사용가능한 방이 101, 102, 103... 502, 503 까지 총 15개가 있는거다.

그리고 메모리 주소를 나타내기 위해 사용하는 비트수는 포인터의 크기와 완벽하게 동일한 말이다.

포인터의 크기가 4byte (32bit 컴퓨터인 경우)이면, 메모리 주소를 나타내기 위해 사용하는 비트수가 32bit이다.

따라서 2^32 가지의 경우의 수 주소를 나타낼 수 있고 이에 주소 0x00000000부터 0xffffffff까지의 주소들을 표현할 수 있다. (즉 0x00000000번방부터 0xffffffff번방 까지를 가진다.)

컴퓨터는 하나의 주소에 하나의 바이트를 넣을 수 있고, 이에 실제 컴퓨터의 메모리는 다음과 같은 모습에 가깝다.

(32비트 컴퓨터의 경우)

주소 한 칸당 1byte의 데이터가 들어가고, 1byte는 이내 곧 8비트이니까 실제 메모리는 다음과 같은 모습이겠다.

포인터의 크기 & 표현가능한 메모리 주소가 크면 좋은 이유

이쯤까지 보면 표현가능한 메모리의 주소의 크기(사용하는 비트수)는 포인터의 크기와 완벽하게 동일한 말인걸 알 수 있고, 그래서 얘네들이 크면 뭐가 좋은지를 이해해보자.

(표현가능한 메모리 주소의 크기 == 포인터의 크기)가 크면 좋은 이유는 지금까지 살펴보았듯 많은 양의 데이터를 저장하게 될 수 있어서 좋다.

뿐만 아니라 프로그램을 실행시킬때마다 각 프로그램마다 가상 메모리 주소공간을 가지게 되는데, 많은 양의 데이터를 저장할 수 있게 되면 (== 표현가능한 메모리 주소의 크기가 커지면, 방의 갯수가 늘어나면) 이 가상 메모리 주소 공간 또한 커지게 된다.

간단히 설명하면 프로그램의 어셈블리어 (코드 영역에 저장되는 프로그램의 동작을 설명한 부분) 들도 당연히 메모리에 저장이 되는데 이걸 한줄한줄 표현하려면 역시나 주소안에 값을 넣어줘야한다. (방안에 넣어줘야한다.)

CPU가 코드를 실행하고 다음 명령어 코드가 무엇인지 파악하기 위해서는 (프로그램 내부에서 어딘가로 점프를 하고 돌아오기 위해 RIP 레지스터에 기록을하고 스택에 코드 주소를 푸쉬..등등) 프로그램에 코드들을 주소로 표현해야하는데 그걸 각 프로그램의 가상 메모리 주소공간이라고 이야기한다.

이 가상 메모리 주소공간이 곧 해당 컴퓨터에서 실행가능한 프로그램 크기와도 같은 말인데, 즉 4GB짜리 프로그램을 실행시킬 수 있는 여력이 있냐 없냐 8GB짜리 프로그램을 실행시킬 수 있는 여력이 있냐 없냐를 나타낸다.

가상 메모리 주소공간이 할당이 안되면 프로그램을 실행시킬 수가 없는데,

이 프로그램의 코드들을 일일히 주소를 매기지 못하면, 프로그램을 실행시킬 수조차 없기 때문이다.

32bit 컴퓨터는 표현할 수 있는 주소의 크기가 2^32가지 그러니까 4,294,967,296바이트(=4기가 바이트)가 최대로 제공 가능한 가상메모리의 크기이다.

64비트 컴퓨터는 표현할 수 있는 주소의 크기가 2^64가지 그러니까 16엑사 바이트(=16,777,216 테라바이트)의 가상메모리를 제공할 수 있다.

실행시키기위해 필요한 가상메모리 주소가 4GB가 넘어가는 프로그램은 32bit 컴퓨터에서 실행할 수 없는 것이다.

결론

컴퓨터 주소는 처음 컴퓨터를 배울때 넘어야하는 젤 큰 난관이지 않을까 싶다.

요약을 해보면은

1. 컴퓨터에서 표현가능한 메모리 주소가 커지면 많은 양의 데이터를 저장할 수 있다. (== 표현가능한 메모리 주소가 없다면 데이터를 저장할 수 없다.)

2. 단순히 많은 데이터를 저장할 수 있을 뿐만아니라, 표현가능한 메모리 주소가 커지면 프로그램의 가상 메모리 주소공간이 늘어 큰 프로그램을 실행할 수 있어서 그 효과가 매우 크다.

3. 포인터 주소의 크기 == 표현가능한 메모리 주소의 크기 == 메모리 주소를 표현을 위해 사용하는 비트의 수

표현이 어렵지 논리는 하나 뿐이다.

컴퓨터에서 표현가능한 메모리 주소가 커지면 좋은이유

호텔이 방을 많이 가지면 손님을 더 많이 받을 수 있는 이유와 같다.

profile
hello koera hacking team APT0

0개의 댓글