메모리의 구조
프로그램이 실행되기 위해서는 먼저 프로그램이 메모리에 로드(load)되어야 합니다.
또한, 프로그램에서 사용되는 변수들을 저장할 메모리도 필요합니다.
따라서 컴퓨터의 운영체제는 프로그램의 실행을 위해 다양한 메모리 공간을 제공하고 있습니다.
프로그램이 운영체제로부터 할당받는 대표적인 메모리 공간은 다음과 같습니다.
1. 코드 영역(text 영역)
우리가 작성한 소스코드가 기계어로 번역되어(컴파일) 저장되는 영역.
즉, 실행할 프로그램의 코드가 저장되는 영역으로 텍스트(code)영역이라고도 부른다.
프로그램이 시작하고 끝날 때까지 메모리에 계속 남아있는다.
2. 데이터 영역
메모리의 데이터(data) 영역은 프로그램의 전역 변수와 정적(static) 변수가 저장되는 영역입니다.
데이터 영역은 프로그램의 시작과 함께 할당되며, 프로그램이 종료되면 소멸합니다.
데이터 영역은 BSS 영역, Data 영역으로 나뉜다.
- BSS(Block Stated Symbol) 영역
- Data 영역
- 초기화가 이루어진 변수들이 저장된다.
- 프로그램 실행 중 자유롭게 접근해서 수정, 변경이 가능하다.
- BSS와 Data 영역을 나누는 이유는?
- 정적 변수와 전역변수는 선언만 해도 쓰레기 값이 들어가지 않고 자동으로 0으로 초기화 되어 BSS영역에 저장된다.
- 따로 초기화된 데이터는 ROM의 data 영역에 저장된다. 하지만 아직 초기화되지 않은 데이터들까지 ROM에 저장되면 큰 사이즈의 ROM이 필요하기 때문에 이 영역을 나눈다. -> 초기화 되지 않은 데이터들까지 ROM에 저장하면 크 사이즈의 ROM이 필요하기 때문
3. 힙 영역
- 프로그램이 실행되는 동안 동적으로 사용할 데이터가 저장된다.
- 사용자가 직접 관리하는 영역이다. 즉, 사용자에 의해 메모리가 동적으로 할당, 해제된다. ex) malloc()로 동적할당, free()로 할당 해제
- 런타임 시에 크기가 결정된다.
- 메모리의 낮은 주소 → 높은 주소로 할당된다.
4. 스택 영역
- 함수 호출 시 생성되는 지역 변수와 매개 변수가 저장된다.
- 함수 호출 시 생성되는 지역 변수와 매개변수가 저장되는 영역이고
- 메모리의 높은 주소 -> 낮은 주소로 할당된다.
- 윈도우는 약 1mb , 리눅스는 약 8mb를 가지고 있으며 이를 초과해 저장할 수 없음!!
- 할당과 해제를 반복하기 때문에 데이터의 용량이 불확실하다.
- 함수 호출이 사라지면 사라진다.
Stack 영역 vs Heap 영역
-
스택 영역과 힙 영역은 사실상 같은 공간을 사용한다. 그래서 스택 영역이 클 수록 힙 영역이 작아지고, 힙 영역이 클 수록 스택 영역이 작아진다.
-
스택 영역이 높은 주소 → 낮은 주소로 할당되고, 힙 영역이 낮은 주소 → 높은 주소로 할당되기 때문에 자신의 영역이 상대의 영역을 침범하는 사태가 발생할 수 있다. 이를 각각 스택 오버플로우, 힙 오버플로우 라고 한다.'
참조
velog.io/@goserimgoserimgo/%EB%A9%94%EB%AA%A8%EB%A6%AC-%EA%B5%AC%EC%A1%B0
https://kant0116.tistory.com/17
https://velog.io/@hidaehyunlee/메모리-구조를-알아보자
https://ieroa.tistory.com/entry/C언어-메모리-구조
'42seoul' 카테고리의 다른 글
c언어 컴파일과정[링킹,컴파일,라이브러리,오브젝트] (0) | 2020.10.18 |
---|