메모리 구조 기초 – 주소 공간과 메모리 모델

메모리 사진


처음 C언어로 포인터를 학습할 때, 변수의 주소를 출력해보며 “메모리 주소”라는 개념에 혼란을 느꼈던 기억이 있습니다. 메모리는 눈에 보이지 않기 때문에, 그 구조와 작동 방식을 직관적으로 이해하는 것이 쉽지 않았습니다. 하지만 운영체제에서 메모리 모델과 주소 공간을 배우고 나니, 코드가 실제 메모리 상에서 어떻게 실행되는지를 더 명확히 이해할 수 있게 되었습니다.

주소 공간이란 – 프로그램이 인식하는 메모리

주소 공간(Address Space)은 프로세스가 자신만의 관점에서 바라보는 메모리의 연속된 공간입니다. 실제 컴퓨터의 물리적 메모리는 하나지만, 각 프로세스는 자신만의 독립된 주소 공간을 가지고 있는 것처럼 보이며, 이를 통해 메모리 보호와 안정성이 확보됩니다. 이러한 구조를 가능하게 하는 기술이 바로 가상 메모리(Virtual Memory)입니다.

가상 메모리는 각 프로세스에게 0번 주소부터 시작하는 독립적인 주소 공간을 제공합니다. 실제 물리 메모리와는 다르게, 이 주소는 프로세스가 사용하는 논리적인 주소이며, 이를 실제 메모리 주소로 변환하는 역할은 운영체제와 하드웨어(MMU: Memory Management Unit)가 담당합니다. 이러한 구조는 서로 다른 프로세스 간의 메모리 침범을 방지하고, 시스템 전체의 안정성과 보안을 강화하는 데 기여합니다.

또한 주소 공간은 사용자 영역(User Space)과 커널 영역(Kernel Space)으로 나뉘어 관리됩니다. 사용자 프로그램은 커널 영역에 직접 접근할 수 없으며, 시스템 호출(System Call)을 통해서만 간접적으로 접근이 가능합니다. 이를 통해 커널은 시스템 자원을 보호하고, 임의의 메모리 접근으로 인한 시스템 오류를 예방합니다.

메모리 모델 – 코드, 데이터, 힙, 스택

프로그램이 실행되면 운영체제는 해당 프로세스를 위한 메모리 공간을 할당하며, 이 공간은 일반적으로 코드(Code), 데이터(Data), 힙(Heap), 스택(Stack) 네 가지 주요 영역으로 구성됩니다. 각각의 역할과 특징을 이해하면 메모리 관리가 훨씬 명확해집니다.

1. 코드 영역: 실행될 프로그램의 명령어들이 저장된 영역입니다. 일반적으로 읽기 전용으로 설정되어 있어 무결성을 유지합니다. 공격자가 이 영역을 조작하면 시스템 전체가 위험해질 수 있으므로, 보호가 철저히 이루어집니다.

2. 데이터 영역: 초기화된 전역 변수와 정적 변수(static)가 저장되는 영역입니다. 프로그램이 종료될 때까지 존재하며, 전역적으로 접근할 수 있습니다. 초기값이 없는 전역 변수는 BSS(Block Started by Symbol) 영역에 저장됩니다.

3. 힙 영역: 동적으로 할당되는 메모리 영역입니다. 사용자가 직접 malloc(), new 등으로 요청하여 메모리를 할당하고, 사용 후에는 free(), delete 등으로 반환해야 합니다. 잘못된 할당이나 해제는 메모리 누수(Memory Leak)나 충돌을 일으킬 수 있습니다.

4. 스택 영역: 함수 호출 시 생성되는 지역 변수, 매개변수, 리턴 주소 등이 저장되는 영역입니다. 함수 호출과 함께 스택 프레임이 생성되며, 함수가 종료되면 자동으로 반환됩니다. 메모리 관리가 자동으로 이루어지는 반면, 너무 많은 함수 호출이나 큰 변수 선언으로 스택이 넘치면 Stack Overflow가 발생할 수 있습니다.

이러한 영역들은 메모리 주소 상에서 고정된 순서로 배치되며, 각 영역 간의 충돌이 없도록 운영체제가 철저하게 관리합니다. 특히 힙과 스택은 서로 방향이 반대인 구조로 확장되며, 경계를 넘어서지 않도록 하는 것이 중요합니다.

32비트와 64비트 시스템의 메모리 차이

주소 공간의 크기는 시스템의 아키텍처에 따라 달라집니다. 32비트 시스템에서는 이론적으로 최대 4GB(232)까지 주소 공간을 사용할 수 있지만, 운영체제가 커널 영역을 위한 공간을 예약하기 때문에 사용자 프로그램은 보통 2~3GB 정도만 사용할 수 있습니다.

반면, 64비트 시스템에서는 주소 표현이 264까지 가능하므로 이론적으로 16엑사바이트(EB)라는 엄청난 주소 공간을 사용할 수 있습니다. 물론 실제 사용 가능한 공간은 하드웨어와 운영체제에 따라 제한되지만, 훨씬 큰 메모리 공간을 활용할 수 있다는 점에서 대용량 데이터 처리나 고성능 서버 운영에 유리합니다.

이로 인해 64비트 시스템에서는 더 많은 프로세스를 동시에 실행하거나, 하나의 프로그램이 더 많은 데이터를 메모리에 올려놓고 작업하는 것이 가능해졌습니다. 현대의 대부분의 운영체제와 응용 프로그램은 이러한 메모리 확장을 적극 활용하고 있습니다.

메모리 구조를 이해하는 것은 단순히 변수의 저장 위치를 아는 것을 넘어, 프로그램이 어떻게 동작하고, 어디서 문제가 발생할 수 있는지를 파악하는 데 중요한 단서를 제공합니다. 운영체제, 시스템 프로그래밍, 보안 등 여러 분야에서 메모리 모델은 핵심적인 개념이며, 개발자로서 반드시 정확히 이해하고 넘어가야 할 영역입니다.

댓글

이 블로그의 인기 게시물

지도학습 vs 비지도학습 – 머신러닝의 대표 학습 방식 비교

모델 평가 지표 정리 – 정확도, 정밀도, F1 Score까지

선형회귀와 로지스틱 회귀 – 가장 기초적인 예측 모델들