메모리는 어떻게 생겼을까??
누구나 컴퓨터에 관심이 있다면 한번쯤은 들어 봤을법한 메모리 "내 컴퓨터는 메모리가 8기가야, 나는 듀얼채널로 구성했어!" 그런데 메모리가 어떻게 생겼는지 알고 계시나요? 메모리는 생각보다 조~끔 복잡하게 생겼답니다.
텍스트 세그먼트
데이터 세그먼트
스텍


각 부분별로의 역할을 알아 보도록 하지요.
텍스트 세그먼트 - 코드상수를 저장하는 곳입니다.
데이터 세그먼트 - 전역변수(global), 정적변수(static)를 저장하는 곳입니다.
스택 - 함수가 사용하는 메모리 영역입니다.(지역 변수(local))
힙 - 포인터로만 접근하는 메모리 입니다. 동적인 메모리를 사용할때 필요한 부분입니다.

후... 무슨말인지 하나도 모르겠다. 그죠? ㅎㅎ 하나 하나 알아 봅시다. 일단 함수가 먼지 알고 넘어 갑시다. 여러분 1+4는 얼마죠? 2 곱하기 8은요? 제가 왜 갑자기 이런걸 물어 볼까요? 여러분 머리속에는 1+4 2곱8 하면 어떤 연산을 해야할지 미리 정해져 있지요? 이런것을 프로그램에서는 함수라고 합니다. 1+4라고 프로그래밍 언어에 적으면 1과 4는 함수의 인자라고 하고 +는 항수의 기능이 되겠지요. 프로그밍적 문법은 나중에 알아도 됩니다. 개념을 먼저 아는게 좋으니깐요. ㅎㅎ

함수란 뭐다? 기능을 미리 정의해놓은것!(어떤 인자를 받아서 어떻게 계산하겠다!)

그리고 함수중에서는 모든 프로그램에 등장하는 녀석이 있습니다. 그건 바로 main! main 함수는 프로그램의 주인공입니다. 당신이 어떻 프로그램을 실행 시켰다. 그건 그 프로그램의 main 함수를 작동시켰다. 와 거의 98%쯤? 일치하는 말입니다. 그어떤 함수를 짜고 다른 코드를 짜더라도 이것들을 최종적으로 거둬 주는 녀석은 main 입니다. 마치 사람으로 치면 의식 같은 녀석이라고 할 수있죠. 심장이 뛰고 숨을 쉰다고 사람이 살아있는건 아니니 말입니다.

자, 그럼 전역 변수와 지역 변수의 뜻을 알아 봅시다. 전역 변수는 제가 global이라고 뒤에 괄호를 쳐서 넣어 놨습니다. 이 말은 말그대로 입니다. 언제 어디서 쓰더라도 유효한 변수라는 겁니다. main함수에서 쓰던 여러분 함수에서 쓰던 모두 가능한 변수입니다. 반면에 지역 변수는 local이라는 뜻에 걸맞게 어느 부분에서만 유효한것입니다. main이던 여러분이 만든 함수건 함수안에서 선언된 변수는 전부 함수내에서만 유효합니다. 자, 그럼 둘의 가장 큰 차이는 무엇일까요??

정답은 바로 초기화여부 입니다! 지역변수(스택에 살고 있습니다!)는 따로 초기화(0을 대입하는 과정이라고 생각하세요)를 하지 않으면 쓰레기 값이 잡혀있는 상태입니다. 하지만 전역변수(데이터 세그먼트)는 처음부터 초기화가 되어있는 상태입니다. 이 차이가 나중에가면 굉장히 크다는 것을 알게 될겁니다.

텍스트 세그먼트, 데이터 세그먼트는 Rom에 해당하는 메모리이고 데이터 세그먼트부터 힙까지는 Ram에 해당하는 부분입니다.(Rom 과 Ram 을 잘 모르시는 분은 Rom은 고쳐쓰기가 힘들고 ,Ram은 고쳐쓰기가 쉽다고 생각하세요!) 어? 번개쥐님 데이터 세그먼트가 왜 둘다 있지요? 라고 물으시는 분들이 있으실 겁니다. 데이터 세그먼트는 자신의 복사본을 램에다가 저장해둡니다. 일종의 미러링이라고 할까요? rom은 접근 속도가 느리기때문에 세그먼트는 rom 나머지 ram이렇게 해버리면 너무 전체적인 성능이 떨어지기 때문에 그렇습니다.

이제부터 프로그램을 할 환경인 아두이노 같은 임베디드 시스템에서는 메모리가 한정적입니다.(왜냐구요? 단가가 싸니깐요!) 그래서 어떤 메모리를 어떻게 이용할지가 중요합니다. 그래서 이러한 지식을 익히는 거죠.(사실 일반적인 pc환경에서는 이런거 따위 생각안해도 될만큼 큰 메모리가 들어 있죠.) 또한, 이제 여러분이 프로그래밍을 하다보면 잠깐 쓰고 버릴 데이터가 필요할때도 있습니다. 예를 들면 지금 온도의 변화율에 따라 반응하는 기계를 만든다고 생각해 봅시다.

27도씨 27.5도씨 27.8도씨 29.6도씨 ......

이렇게 계속 데이터가 들어온다고 생각해봅시다. 변화율에 따라서 반응 하는것이므로 최신 자료외에는 필요가 없지요? 그러니깐 나머지 자료를은 시간이 지나면 가치가 없는것입니다. 즉, 버려야 하지요.(그대로 안고 가면 메모리를 낭비하는 것이니깐요.) 이러한 메모리 방식을 동적 메모리라고 합니다. 필요할땐 할당 받고 필요 없으면 버리고 그리고 이를 담당해주는 부분이 힙 영역 이지요!

텍스트 세그먼트는 문자열과 상수를 저장하는 곳인데 이건 좀 설명이 길어 질거라... 나중에 따로 다루도록 하겠습니다.

어떻습니까? 메모리의 구조에 대해서 제대로 알수 있겠습니까? 다음편에서는 bss세그먼트와 텍스트 세그먼트에 대해서 더 알아 보도록 하지요 ㅎㅎ