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