프로그래밍/참고

메모리 영역

피씨컴 2013. 1. 31. 19:30

 

 

 

 

 

 

 

 

 

 

→ 함수안에 쓰는 변수(지역변수)로 stack영역에 들어간다.
    함수가 여러번 실행되면 HEAP, STACK가 늘어날 수 있다.
    만약 프로그램이 늘어나면 용량이 커지므로 코드영역이 늘어난다.
    변수선언시 stack이 끝번지 주소를 나타내는 것은 아니지만 마지막 영역에 해당한다.
    컴파일하면 code는 더이상 늘어나지 않는다.

→stack의 지역변수는 사용하고 소멸하므로 데이터 용량의 불확실성을 가지므로 밑에서부터 채워 올리고 heap은 위에서 부터 채워 내려진다. 용량의 불확실성은 컴파일러가 알아서 메모리영역을 선택(랜덤적)

-stack영역에서의 주소값은 시작주소는 밑에서부터(먼저선언된 순서) 그다음 주소는 순서대로 정해진다.

HEAP overflow-heap이 위에서부터 주소값을 채워져 내려오다가 stack영역을 침범하는 경우.
STACK overflow-stack영역이 heap을 침범.


-stack은 4kb를 기본으로 하는 경우가 많고 지역변수를 많이 쓰면 stack용량이 커지므로 적당히 쓰는것이 좋다. stack, heap는 기준이 없으므로 프로그램을 실행시켜봐야 알수 있다.

 

 

 

 

 

 

 

 

  • stack - 지역 변수 블록내에서 할당된 변수가 들어감, 자바의 경우 객체 참조는 여기에 하지만 객체 스스로의 데이터는 스택에 두지 않는다. 
  • heap - 동적으로 할당된 변수가 들어감, RAM 메모리 여역에 있으며 객체가 실질적으로 위치하는 곳, 유연성이 좋지만 stack에 비래 메모리 할당과 해지시간이 오래걸림 (메모리를 stack은 위에서부터, heap은 아래서 부터 순차적으로 이용함)
  • BSS - 전역변수 (초기값이 없는 전역변수, 배열, static으로 선언된 변수가 들어감)
  • Data - 전역변수 (초기값이 있는 전역변수, 배열, static으로 선언된 변수가 들어감)
  • Code - 함수 제어문, 상수, 등등 기계어 코드가 들어감

BSS,Data,Code 등은 read only임 write시에 에러발생


 

 

 

 

 


- stack의 지역변수는 사용하고 소멸하므로 데이터 용량의 불확실성을 가지므로 밑에서부터 채워 올리고 heap은 위에서 부터 채워 내려진다. 용량의 불확실성은 컴파일러가 알아서 메모리영역을 선택
- stack영역에서의 주소값은 시작주소는 밑에서부터(먼저선언된 순서) 그다음 주소는 순서대로 정해진다.
- HEAP overflow-heap이 위에서부터 주소값을 채워져 내려오다가 stack영역을 침범하는 경우.
- STACK overflow-stack영역이 heap을 침범.

 

 

 

 

 

 

 

 

 

 

----------------------------------------------------------------------------------------------------------------

 

 

 

 

프로그램은 크게  instruction(명령) data로 구분되며, 일반적으로 4가지, 좀더 세분화 하면 5가지 정도 구분 할 수 있다.

--> 아래 그림 참조.

 

1) code 영역

- 코드 자체를 구성하는 메모리 영역으로 Hex파일이나 BIN파일 메모리다.

- 프로그램 명령이 위치하는 곳으로 기계어로 제어되는 메모리 영역이다.

 

2) data 영역

- 전역변수(global), 정적변수(static), 배열(array), 구조체(structure) 등이 저장된다.

     ) 초기화 된 데이터는 data 영역에 저장되고,

        ) 초기화 되지 않은 데이터는 BSS (Block Stated Symbol) 영역에 저장된다.

- 프로그램이 실행 될 때 생성되고 프로그램이 종료 되면 시스템에 반환 된다.

- 함수 내부에 선언된 Static 변수는 프로그램이 실행 될 때 공간만 할당되고그 함수가 실행 될 때 초기화 된다.

 

Q) data영역과 bss 영역을 구분 하는 이유?

   컴파일 해서 이미지를 올릴 때 초기화 되지 않은 데이터까지 올리게 되면 ROM 사이즈가 커지기 때문에 구분하지 않았을까? -> 혹시 정확히 아시는 분은 답변 부탁 드립니다. 

 

3) heap 영역

- 필요에 의해 동적으로 메모리를 할당 하고자 할 때 위치하는 메모리 영역으로 동적 데이터 영역이라고 부르며, 메모리 주소 값에 의해서만 참조되고 사용되는 영역이다.

- 이 영역에 데이터를 저장 하기 위해서 Cmalloc(), C++new() 함수를 사용한다.

 

 4) stack 영역

프로그램이 자동으로 사용하는 임시 메모리 영역이다.

- 지역(local) 변수, 매개변수(parameter), 리턴 값 등 잠시 사용되었다가 사라지는 데이터를 저장하는 영역이다.

- 함수 호출 시 생성되고, 함수가 끝나면 시스템에 반환 된다.

- 스택 사이즈는 각 프로세스마다 할당 되지만 프로세스가 메모리에 로드 될 때 스택 사이즈가 고정되어 있어, 런타임 시에 스택 사이즈를 바꿀 수는 없다.

- 명령 실행시 자동 증가/감소 하기 때문에 보통 메모리의 마지막 번지를 지정 한다.

 

 

 

 

요약)

1) code(text), data, stack 영역은 컴파일러가 알아서 메모리영역을 결정한다. 즉 컴파일 할 때 data영역과 stack영역의 크기를 계산해서 필요한 메모리 공간을 가지고 된다 heap 영역은 개발자에 의해 프로그램 동작시 결정된다.

ex) C언어에서 배열 선언시 incomplete type으로 사용하면 컴파일 할 때 에러가 발생하게 된다.

 

2) code, data, heap 영역은 하위 메모리부터 할당되고, stack 영역은 상위 메모리부터 할당 된다.

 

3) SMA (Static Memory Allocation) : 정적 메모리, 메모리의 data 영역, stack 영역을 사용한다.

     - Data 영역 : 프로그램 시작과 동시에 할당된 영역이 잡히고 끝나면 OS 에 반환한다.

     - Stack 영역 : 함수 시작과 동시에 할당된 영역이 잡히고 끝나면 OS에 반환한다.

 

4) DMA (Dynamic Memory Allocation) : 동적 메모리, 메모리의 heap 영역을 사용한다.

     - Heap 영역 : stack에서 pointer 변수를 할당하고,pointer가 가리키는 heap 영역의 임의의 공간부터 원하는

                         크기 만큼 할당해 사용한다.

 

written by 브랜든 (v 1.1)