본문 바로가기
dev, tech

변수(전역,지역,매개,static) 저장 위치

by 구띵 2007. 1. 15.

크게 보면 프로그램은 프로그램의 code와 그 프로그램에서 사용하는 data로 구성됩니다. 이것을 좀더 세분화시키면 크게 4개(code(text), data, heap, stack)의 범위로 나눌수 있으며, 각각을 segment라고 합니다. 워낙 추상적인 개념이라 그림으로 설명 드리는게 빠르므로 대략 그려보자면 이렇습니다. 위쪽으로 갈수록 낮은 주소번지가 됩니다.

 

+---------------+
|      code(text)     |
+---------------+
|         data          |
+---------------+
|         heap         |
+---------------+
|        stack          |
+---------------+


code(text)영역은 프로그램의 code 자체를 구성하는 명령이나, 기계어 명령이 존재하고, 이 부분은 read only입니다. 그러므로 이곳이 데이터를 쓰려면 access violation을 발생시킵니다. CPU가 읽어들여 수행한다고 해서 text라고 부르며, code 영역이라고도 합니다.

data영역은 전역(global)변수,  정적(static)변수, 초기화된 배열과 그 구조들이 저장되는 영역이고, 이 영역은 프로그램이 실행될때 생성되고 프로그램이 종료될때 시스템에 반환됩니다.


heap영역은 프로그래머가 필요에 의해서 동적으로 할당되는 메모리가 위치하는 영역입니다. 즉, C++에서 new나 C에서 malloc으로 할당하는 것 등은 heap영역에 생성됩니다. 물론 프로그래머에 의해서 할당 및 메모리 해제가 되지요.

 

끝으로 stack 영역엔 지역(local)변수 및 매개변수(parameter), 복귀 번지(return address) 등등이 저장되어 있는 곳입니다. 함수 호출시에 역시 stack 영역에 생성되고 사용된후 시스템에 반환됩니다. 또한 함수로 인수(argument)를 보낼 때는 인수(argument)를 역순으로 보낸 뒤 복귀 번지(return address)를 저장합니다. 따라서 선입후출(First In Last Out)의 형태가 됩니다.

 

code(text), data, heap영역(이 중 data, heap영역은 compile-time 때에 결정되어지고, heap영역은 run-time시 요구할때마다 사용되어집니다.)은 하위 메모리로부터 할당되며, stack영역은 상위 메모리로부터 할당되어 집니다.

 

따라서 우리가 프로그램을 실행하면 OS kernel에서  제어에 적합한 자료구조로 만들어 메모리로 읽어내어 code(text)영역에 먼저 데이터가 채워지며, 그 후에 데이터 영역 부분에 들어가는 전역(global)변수,  정적(static)변수가 메모리 공간에 들어가게 됩니다. 그 후에 stack영역을 사용하게 되고, 프로그램이 요구할때마다 heap영역을 사용하게 됩니다.

 

뭐, 이정도까지 읽으셨다면 이미 눈치채셨겠지만 우리가 프로그램을 짤때 프로그래머가 동적으로 할당가능한 heap영역을 제외하고는 나머지 영역은 컴파일러에 의해서 결정됩니다.

 

따라서 code(text), data, stack 영역은 최소한 프로그램 실행 이전에 모든 정보를 운영체제에게 알려줘야합니다. 그래서 compile-time에 data 영역 및 stack 영역의 크기를 계산해서 필요한 메모리 공간의 정보를 파일에 함께 갖게 됩니다. (그래서 C언어에서 배열을 선언할때 incomplete type으로 사용하면 컴파일 할때 에러가 발생되는겁니다. 물론 배열형 매개변수는 사이즈를 정해주지 않고 사용해도 포인터로 변환이 되므로 사용가능합니다. 이 경우엔 에러나 경고가 뜨는 컴파일러도 있습니다만 ISO/IEC에서 명백하게 규정된 것은 아니므로 잘못된 문법이라고는 할수 없습니다.)

 

끝으로 운영체제는 각각의 프로세스 간에 메모리 영역을 침범하지 못하도록 합니다. 즉, 같은 메모리를 필요에 의해서 구분해놓은것이라 할지라도 각 영역들 사이는 서로 오갈수 없습니다. 윈도우에서 '잘못된 연산을 수행해 프로그램을 종료합니다'란  에러 메세지는 대부분 이런 이유에서 발생합니다.

'dev, tech' 카테고리의 다른 글

WINCE 포팅 관련 요구 사항 정리  (0) 2007.04.05
[C언어의 진화] ① 최신 C 표준「C99」  (0) 2007.03.28
********시그널 종류*********  (1) 2006.12.28
SIGACTION  (0) 2006.12.27
[펌] sigaction  (0) 2006.12.27

댓글