2011. 2. 28. 13:33

점심시간 거의 다 쓰고 농땡이좀 치려고 오랜만에 블로그에 글 하나 올리려한다.
뭐 대단한건 아니고 인터넷에 아주 많이 떠돌고 있는 메모리 구조와 그 영역에 대한 설명인데..
일단 그림먼저 한번 훓어보자.




프로그램을 배운 사람이면 한번씩은 보게 되는 그림인데.. 이렇게 하나의 프로세스는 한 덩어리의 메모리를 갖게 된다. 그 메모리는 위 그림 처럼 TEXT, DATA, STACK, HEAP 영역으로 나뉘는데 각 영역 별로 어떠한 역할을 하는지 자세하게 정리하겠다.

1. Text(텍스트 영역)

일반적으로 프로그램의 실행 코드가 존재하는 영역. 작성한 코드들이 여기에 적재 된다. 특수한 경우에 데이터 영역에 코드를 포함하여 컴파일 할수도 있지만 그런일은 거의 없다. 보통 보안 관련 프로그래밍들은 데이터영역에 코드를 적재하는 경우가 잦다.

2. Data(데이터 영역)

데이터 영역은 전역변수, 정적(static)으로 사용되는 심벌(symbol)을 가진 영역이다. 이를 다시 사용되는 쓰임새에 따라 나눈다면 3가지로 나뉜다.

2 - 1. 읽기 전용으로 초기화되는 영역
2 - 2. 읽기/쓰기가 가능한 영역으로 초기화 되는 영역
2 - 3. 초기화되지 않은 영역

읽기 전용으로 초기화된 영역은 일반적으로 .rodata 영역이다. 이 부분은 상수키워드(const)로 선언 되는 영역이다. 그 외에 시스템에서 사용된 각종 문자열 등이 이 위치에 적재 된다. 예를 들어 printf()문의 format string이나 상수 문자열등이 해당 된다.
두번째로 .data 영역이다. 전역변수 중 초기값을 갖는 경우이다.
마지막으로 초기화 되지 않은 영역으로 BBS(Block Started by Symbol)영역이라고 불리는 곳인데 앞서 말했듯 전역변수로 초기화 되지 않거나 static으로 선언된 심볼(symbol)을 의미한다. 일반적으로 BBS 영역은 C의 startup 함수가 main()을 실행하기 전 NULL(0)로 초기화를 하게 되어있다.

3. Stack(스택 영역)

스택 영역은 로컬 자동변수, 즉 임의로 메모리를 잡지 않아도 함수의 시작에서 자동으로 생성되고 파괴되는 변수를 의미한다. 일반적으로 함수 내에서 사용되는 auto로 선언하는 변수이다. 그러나 c에서는 auto는 묵시적으로 생략하므로 그냥 int i; 처럼 선언되는 모든 변수들이다. 이 변수는 해당 로컬(스코프)을 벗어나면 스택의 프레임 릴레이에서 제거되므로 자연스럽게 파괴된다. 따라서 로컬(스코프) 안에 존재하는 포인터 변수 자체도 auto 변수이다. 단지 그 안에 담긴 주소값의 영역이 다를 뿐이다.

4. Heap(힙 영역)

프로그래머가 가장 중요하게 생각해야 하고 가장 많이 활용하는 영역이다. 이 영역은 일반적으로 malloc()이나 new 연산자를 통해 메모리를 할당하여 사용하는 영역으로서 자동으로 파괴되지 않는다. 또한 힙은 극히 큰 공간이고, 가상 메모리 전체라고 해도 과언이 아닐 정도이다. 이 영역은 프로그래머가 자유자재로 사용할 수 있으나 그 사용에 대한 책임도 져야 하는 공간이다. 즉, 할당과, 해제를 스스로 해결해야 하며 객체지향언어(C++/Java 등)에는 Garbage Collection이 메모리를 관리해주지만 이 경우도 완벽하게 믿을 수 없기 때문에 할당과 해제는 꼭 프로그래머 본인 스스로 해결해야 한다.

그럼 이렇게 쉽게 정리 했는데 한번씩 예시를 들어 보면서 마무리 지어본다.







참~~~ 쉽죠잉??
Posted by 뿌직