프로그램이 실행되기 위해서는 운영체제(os)가 프로그램의 정보를 메모리에 로드(load)해야 하고, 프로그램이 실행되는 동안 CPU가 코드를 처리하기 위해서는, 메모리가 명령어와 데이터들을 저장해야 한다.
코드(code) 영역
데이터(data) 영역
스택(stack) 영역
힙(heap) 영역
실행할 프로그램의 코드가 저장되는 영역으로, text영역이라고도 함.
프로그램이 시작하고 끝날 때까지 메모리에 계속 남아있다.
컴파일된 기계어가 들어간다.
CPU는 코드 영역에 저장된 명령어를 하나씩 가져가서 처리한다.
프로그램의 전역(global) 변수와 정적(static)변수, 문자열 상수가 저장되는 영역.
데이터 영역은 프로그램의 시작과 함께 할당되며, 프로그램이 종료되면 소멸함.
BSS와 GVAR 영역을 통츨어 data 영역이라고 함.
BSS : 초기화가 되지 않은 데이터를 저장하기 위한 영역 (RAM에 저장)
GVAR : 초기화가 된 데이터를 저장하기 위한 영역 (ROM에 저장)
(초기화된 데이터는 값을 저장해야하기 때문에 비휘발성 메모리인 ROM에 저장)
프로그램이 자동으로 사용하는 임시 메모리 영역.
함수의 호출과 관계되는 지역 변수와 매개변수가 저장되는 영역.
스택 영역의 크기는 컴파일 시에 결정됨.
스택 영역은 함수의 호출과 함께 할당되며, 함수의 호출이 완료되면 소멸함.
이렇게 스택 영역에 저장되는 함수의 호출 정보를 스택 프레임(stack frame)이라고 함.
스택 영역은 후입 선출(LIFO, Last-In First-Out) 의 방식으로, 가장 나중에 들어온 데이터가 가장 먼저 인출됨. -> 스택 영역이 메모리의 높은 주소에서 낮은 주소의 방향으로 할당 되기 때문
스택 영역에서 푸시(push) 로 데이터를 저장하고, 팝(pop) 으로 데이터를 인출
데이터 액세스가 빠른 편이며, 변수를 명시적으로 할당 또는 해제할 필요가 없음.
하나의 명령으로 메모리 조작과 어드레스 조작이 가능.
스택의 크기 제한이 있어(os마다 다름) 한계를 초과하도록 삽입할 수 없음.
변수의 크기를 조정할 수 없음.
사용자가 직접 관리할 수 있고, 관리해야만 하는 영역.
힙 영역은 사용자에 의해 메모리 공간이 동적으로 할당되고 해제됨.
힙 영역은 선입선출(FIFO, First-In First-Out)의 방식으로, 가장 먼저 들어온 데이터가 가장 먼저 인출. -> 힙 영역이 메모리의 낮은 주소에서 높은 주소의 방향으로 할당되기 떄문
런타임 시에 크기가 결정됨.
메모리 크기에 제한이 없음.
프로그램에 필요한 개체의 개수나 크기를 미리 알 수 없는 경우에 사용 가능.
데이터 액세스가 상대적으로 느린 편이며, 메모리를 관리해야 함.
할당, 해제 작업으로 인한 속도 저하 발생.
힙 손상으로 인한 속도 저하 발생.
(이중 해제, 해제 후 블록 사용, 블록 경계를 벗어나 덮어쓰기 등)
힙 경합으로 인한 속도 저하 발생
(두 개 이상의 쓰레드에서 동시에 데이터에 액세스 하려고 하면 경합이 발생하여 한쪽 쓰레드의 작업이 완료되어야 다른 쪽 쓰레드의 작업이 진행될 수 있음. 이 문제는 현재 다중 프로세서 시스템에서 발생하는 문제 중 가장 큰 문제)
stack의 지역변수는 사용되고 소멸하기 때문에 데이터 용량의 불확실성을 가진다. 따라서 stack 영역에서의 주소값은 밑에서부터 채워지며, 주소는 선언된 순서대로 정해진다.
반면 힙 영역에서의 주소값은 위에서부터 채워 내려가기 때문에, 두 메모리 영역의 주소가 겹치게 되는 오버플로우가 발생할 수 있다.
이때 힙이 스택을 침범하는 경우를 힙 오버 플로우라 하고, 스택이 힙을 침범하는 경우를 스택 오버 플로우라고 한다.
https://pro-jy.tistory.com/37?category=979455
https://www.byfuls.com/programming/read?id=61
https://all-young.tistory.com/17