메모리 구조
- CODE(TEXT) SEGMENT
- HEAP SEGMENT ( L -> H )
- FREE SEGMENT
- STACK SEGMENT (H->L) 후입선출
- DATA SEGMENT ( L -> H )
- Initialized Data Segment
- BSS(Block Started by Symbol)
(전역(extern), 정적변수 0으로 자동 초기화)
위와 같은 변수들은 초기화를 안할 경우에 문제가 생길 수 있기 때문에 존재한다.
High Address
Low Address
코드(텍스트) 영역 ( Code(Text) Segment )
- 코드 자체를 구성하는 메모리 영역
- Hex 파일이나 Bin 파일 메모리
- 프로그램 명령이 위치하는 곳으로 기계어로 제어되는 메모리 영역
- " 문자열 상수를 제외한 지역변수에 할당 "되는 리터럴 상수가 기계어로 저장
- 알고가자!!!
문자열 상수( "홍길동" ) => Data Seg\Rom 영역
선언된 지역에 따라 메모리 영역이 다르다.
데이터 영역 ( Data Segment )
- 전역변수와 정적(static) 변수 중 초기화가 할당된 변수가 저장되는 영역
- 변수는 RAM에 저장( Read & Write )
- 변수에 대입하는 초기값은 ROM에 저장
- ROM에 저장된 변수 생성시 복사하여 변수에 할당
- 할당하는 초기값 중 문자열 상수를 제외한 리터럴 상수는 컴파일러에 따라 코드영역에서 복사는 경우도 있다.
- 데이터 영역 - BSS< Block Started by Symbol >
전역변수 또는 정적 변수 중 초기값이 할당되지 않은 변수가 저장되는 영역
- 메모리를 생성하지 않고 상징적인 변수의 이미지(상징)만 존재
- 프로그램 시작 시 BSS에 저장된 변수들은 0으로 초기 값을 대입
- Data영역으로 이동 / 메모리는 RAM에 할당. 즉, 상징적으로만 존재하는 영역
힙 영역 ( Heap Segment )
- 런타임에 할당하는 동적 메모리가 위치하는 영역
- 크기는 정형화 되어 있지 않고 유동적이고 Free 영역에 가변적으로 크기를 확장
- 동적 할당한 메모리는 식별자(명칭)가 존재하지 않으므로 포인터 변수를 사용해서 접근가능
- 메모리는 낮은 주소에 높은 주소로 할당
- 메모리가 부족할 경우 할당이 실패하여 NULL을 반환
- 런타임에 BSS와 HEAP 사이를 기준 으로 HEAP은 아래로 순차적으로 메모리를 사용한다
- 포인터 변수는 각 지역의 특성에 영향을 받아 생성하고 참조하는 메모리가 HEAP에 존재
자유 영역 ( Free Segment )
- 힙영역과 스택영역의 완충지 역할
- 두 영역이 유동적 일 수 있는 것은 자유영역에 해당 영역의 크기 확장할 수 있다.
- 스택 영역이 Free 영역을 침범해서 Heap 영역을 침범할 경우 StackOverFlow
- 반대의 경우에 Heap 은 NULL 을 리턴
스택 영역 ( Stack Segment )
- 프로그램이 실행 시 자동으로 사용하는 임시 메모리 영역
- 크기는 정형화 되어 있지 않고 유동적이며 Free 영역에서 가변적으로 크기 확장이 가능
- 기본적으로 약 1MB의 크기로 할당
- 지역 변수, 매개 변수, 리턴 값 등 잠시 사용 후 사라지는 유형의 데이터가 저장 되는 영역
- 메모리는 높은 주소에서 낮은 주소로 할당 되며 메모리 부족 시 StackOverFlow 발생
메모리 구조는 6가지로 구분된다.
CODE, DATA, BSS, HEAP, FREE, STACK
출처 :
'프로그래밍 > 프로그래밍 기초' 카테고리의 다른 글
바인딩과 바인딩 타임 그리고 할당 (0) | 2016.04.21 |
---|---|
메모리 관리기법 (0) | 2016.03.21 |