프로그램이 실행되기 위해서는 운영체제(OS)가 프로그램의 정보를 메모리에 로드해야 합니다.
프로그램이 실행되는 동안 CPU가 코드를 처리하기 위해서는 메모리가 명령어와 데이터들을 저장해야 합니다.
메모리 공간
프로그램이 운영체제(OS)로부터 할당받는 대표적인 메모리 공간은 코드(code) 영역, 데이터(data) 영역, 힙(heap) 영역, 스택(stack) 영역으로 구성되어 있습니다.
코드(code) 영역
코드 영역은 실행할 프로그램의 코드가 저장되는 영역입니다.
텍스트 영역이라고 부르기도 합니다.
CPU는 코드 영역에 저장된 명령을 하나씩 가져가서 처리하게 됩니다.
프로그램이 시작하고 종료될 때까지 메모리에 계속 남아 있습니다.
데이터(data) 영역
데이터 영역은 프로그램의 전역 변수와 정적(static) 변수가 저장되는 영역입니다.
프로그램의 시작과 함께 할당되며 프로그램이 종료되면 소멸합니다.
힙(heap) 영역
힙 영역은 프로그래머가 직접 공간을 할당, 해제하는 메모리 공간(혹은 Garbage Collector가 대신 처리해준다)입니다.
힙 영역에서 malloc() 또는 new 연산자를 통해 메모리를 할당하고, free() 또는 delete 연산자를 통해 메모리를 해제합니다.
힙 영역은 선입선출(FIFO, First-In First-Out)의 방식으로, 가장 먼저 들어온 데이터가 가장 먼저 인출됩니다.
이는 힙 영역이 메모리의 낮은 주소에서 높은 주소의 방향으로 할당되기 때문입니다.
스택(stack) 영역
스택 영역은 프로그램이 자동으로 사용하는 임시 메모리 영역입니다.
함수 호출 시 생성되는 지역 변수와 매개 변수가 저장되는 영역이고, 함수 호출이 완료되면 사라집니다.
이때 스택 영역에 저장되는 함수의 호출 정보를 스택 프레임(stack frame)이라고 합니다.
스택 영역에서 푸시(push)로 데이터를 저장하고, 팝(pop)으로 데이터를 인출합니다.
스택 영역은 후입선출(LIFO, Last-In First-Out)의 방식으로, 가장 나중에 들어온 데이터가 가장 먼저 인출됩니다.
이는 스택 영역이 메모리의 높은 주소에서 낮은 주소의 방향으로 할당되기 때문입니다.
오버 플로우
오버 플로우란 영어로 넘쳐흐른다는 뜻입니다.
말 그대로, 한정된 메모리 공간이 부족하여 메모리 안에 있는 데이터가 넘쳐 흐르는 현상입니다.
오버 플로우의 종류 중에 힙 오버 플로우와 스택 오버 플로우가 있습니다.
힙은 메모리 위쪽 주소부터 할당되고, 스택은 메모리 아래쪽 주소부터 할당되기 때문에 각 영역이 상대 공간을 침범하는 일이 발생할 수 있습니다.
이때 힙이 스택을 침범하는 경우를 힙 오버 플로우라 하고, 스택이 힙을 침범하는 경우를 스택 오버 플로우라고 합니다.
프로세스와 메모리
프로세스의 개념
프로세스는 실행 중인 프로그램의 인스턴스를 의미합니다.
운영체제는 프로그램이 실행되면 프로세스를 생성하여 메모리와 CPU 자원을 할당합니다.
각 프로세스는 독립된 메모리 공간을 가지며, 다른 프로세스와 메모리 공간을 공유하지 않습니다.
프로세스 메모리 구조
프로세스의 메모리 공간은 위에서 설명한 코드, 데이터, 힙, 스택 영역으로 구성됩니다.
프로세스가 실행되면 운영체제는 다음과 같은 방식으로 메모리 공간을 할당합니다.
코드 영역: 프로세스가 실행할 명령어들이 저장됩니다.
데이터 영역: 전역 변수와 정적 변수가 저장됩니다.
힙 영역: 프로세스가 동적으로 할당한 메모리 공간입니다.
스택 영역: 함수 호출 시 생성되는 지역 변수와 매개 변수가 저장됩니다.
멀티쓰레딩과 메모리
멀티쓰레딩은 하나의 프로세스 내에서 여러 개의 쓰레드가 동시에 실행되는 것을 의미합니다.
각 쓰레드는 독립적인 스택 영역을 가지며, 이를 통해 함수 호출과 지역 변수 관리를 수행합니다.
하지만 힙 영역과 데이터 영역은 공유하므로, 동기화와 같은 메커니즘을 사용하여 쓰레드 간의 데이터 접근을 조율해야 합니다.