Random Access Memory - RAM
사용자가 자유롭게 내용을 읽고 쓰고 지울 수 있는 기억장치. 컴퓨터가 켜지는 순간부터 CPU는 연산을 하고 동작에 필요한 모든 내용이 전원이 유지되는 내내 이 기억장치에 저장된다. '주기억장치'로 분류되며 보통 램이 많으면 한번에 많은 일을 할 수 있기에 '책상'에 비유되곤 한다.
컴퓨터를 맞출 때 '다다익램'이라고 불리는 주인공이다.
책상이 넓으면 책상에 올려둘 수 있는 것들이 많아지듯이 램도 그렇게 이해하면 편하다.
:: 메모리 구조
프로그래밍 언어마다 조금씩 차이가 있지만 전체적인 구조는 위와 같은 영역으로 나뉜다.
- TEXT 영역 : 코드 영역이라고 불리며, 프로그램을 실행시키기 위해 구성되는 것들이 저장되는 영역. 명령문들이 저장되는 곳. 제어문, 함수 , 상수들이 이 영역에 저장됨
- DATA 영역 : 전역변수, 정적변수 등이 저장되는 공간. 이런애들은 보통 main 함수 전, 프로그래밍 실행 전에 선언되어 프로그램이 끝날 때까지 메모리에 남아있음(JAVA static?). 구체적으로 나뉘면 두개의 영역으로 더 나뉘며 초기화 된 변수 영역(initialized data segment), 초기화되지 않은 변수 영역(uninitialized data segment)로 나뉨
- HEAP 영역 : 쉽게 말해서 사용자에 의해 관리되는 영역. 동적으로 할당 할 변수들이 저장됨. JAVA에서 new 연산자로 생성하는 경우, class, 참조 변수들이 영역을 차지함. '동적 할당 영역'. 대개 낮은 주소에서 높은 주소로 할당됨.
- STACK 영역 : 함수를 호출할 때 지역변수, 매개변수들이 저장되는 영역. main 함수 안에서의 변수들도 당연히 여기에 포함됨. 그리고 함수가 종료되면 해당 함수에 할당된 변수들을 메모리에서 해제시킴(자료구조 stack의 pop 기능). 재귀호출에서 'Stack Overflow' 관련 공부해보기. Stack 영역은 Heap 영역과 반대로 높은주소에서 낮은 주소로 할당됨.
:: 메모리 주소
Windows 운영체제에는 x86(32비트) x64(64비트)가 있다.
32비트는 32개의 비트가 있다는 걸 의미하고, 이는 0000 0000 0000 0000 0000 0000 0000 0000 부터 1111 1111 1111 1111 1111 1111 1111 1111까지의 경우의 수가 존재한다는걸 의미.
64비트는 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 부터 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 까지의 경우의 수가 존재한다.
232= 4,294,967,296 ( 42억 9496만 7296 )
264 = 18,446,744,073,709,551,616 ( 1844경 6744조 ...)
엄청난 차이가 있다.
64비트 운영체제가 데이터 처리 단위가 더 많으므로 CPU 처리도 고속화되고, 32bit 프로그램도 돌릴 수 있다. 반대로 32bit에서는 64bit 프로그램을 돌릴 수가 없다.
메모리 한칸은 1byte의 크기를 가지고 있고 주소는 따로있다. 8bit == 1byte 이므로 32bit 운영체제에서는 4바이트 길이의 주소를 갖게된다. 예를들면 집 평수는 1byte 이고 이 집의 주소는 32자리로 표현된다는 뜻이다.
32bit 운영체제는 232까지의 경우의 수가 있으니, 4,294,967,296 개의 주소를 가리킬 수 있다는 의미이고, 이는 1바이트 크기의 메모리가 4,294,967,296 개 까지 인식이 가능하다는 것, 즉 메모리의 최대 크기는 4,294,967,296 byte = 4GB다. 옛날 32bit 운영체제가 대다수인 시절 메모리를 4GB까지밖에 설치 할 수 없는 이유가 이거라고 한다.
64bit 는 8byte이므로 하나의 주소가 8byte 길이의 주소를 갖는다. 그리고 마찬가지로 264개. 즉, 18,446,744,073,709,551,616 개의 주소를 가리킬 수 있다는 의미이고 이는 18,446,744,073,709,551,616 byte = 16EB(엑사바이트) = 16384TB(테라바이트) 이다. 이렇게되면 이론적으로 램을 16EB까지 설치 할 수 있다.
메모리에는 이렇게 할당되는 주소가 있다.
+ JAVA 기초타입 관련
만약 JAVA main 함수에 기초타입 int를 하나 선언했다면, 지역변수로서 Stack 영역에 메모리를 할당될 것이다. int의 크기는 32bit 즉 4byte 이므로 4칸을 차지할 것이다.
댓글