메모리 구조

박성호·2024년 3월 12일

오늘은 어제 말한 new연산자를 설명하는 과정에서 Heap이라는 용어가 나왔는데 이 부분에 관련한걸 알아보겠습니다.
뭐하나 파면 계속 뭐가 끝없이 나오네요.
Heap은 메모리 구조에 한 영역으로 이를 알려면 메모리의 구조에 대해 알아야 합니다.

코드(code) 영역

간단히 말하면 저희가 쓰는 코드에 변수를 제외한 부분이 들어가는 부분이고 text 영역이라고도 하는데
프로그램을 실행시키기 위해 구성되는 것들이 저장되는 영역이고
명령문들이 저장되는 것인데, 명령문들, 제어문, 함수 정의, 상수 등 이 영역에 저장됩니다.
그럼 CPU는 영역에 있는 명령어를 하나씩 처리합니다.

데이터(data) 영역

데이터 영역은 작성한 코드에 전역변수, 정적변수등이 저장되어있는 영역입니다.
이들의 특징은 보통 메인(main)힘수 전(프로그램 실행전)에
선언되어 프로그램의 런타임(runtime) 중에 메모리에 유지되는 변수라는 특징이 있습니다.
구체적으로 데이터 영역도 크게 두가지로 나뉘는데
초기화 된 변수 영역(initialized data segment)과 초기화되지 않은 변수 영역(uninitialized data segment)으로 나뉘죠. 그리고 그 중 초기화되지 않은 변수 영역은 BSS(Block Started by Symbol) 이라고도 합니다.

힙(heap) 영역

메모리의 힙(heap) 영역은 사용자가 직접 관리할 수 있는 '사용자가 동적으로 메모리를 할당하고 해제할 수 있는 영역' 메모리 영역입니다.
흔히 동적으로 할당 할 변수들이 여기에 저장된다고 보시면 됩니다.
또한 Java나 C++에서 new 연산자로 생성되는 객체들 또는 사용자가 생성한 객체들도 Heap영역에 차지하게 됩니다. 다만, 이는 언어마다 조금씩 상이하니 일단은 '동적 할당 영역'이라고 알아두시면 될 것 같습니다.

그리고 Heap 영역은 대개 '낮은 주소에서 높은 주소로 할당(적재)됩니다'

스택(stack) 영역

스택 영역은 함수를 호출 할 때 지역변수, 매개변수들이 저장되는 영역입니다. 메인(main) 함수안에서의 변수들도 당연 이에 포함되죠. 그리고 스택 영역은 함수의 호출과 함께 할당되며, 함수의 호출이 완료되면 소멸합니다.
함수의 호출에 필요한 정보들을 포함하는 스택의 각각의 블록을 스택 프레임(stack frame)이라고 합니다

Stack자료구조의 pop와 같은 기능을 합니다.
스택 영역은 푸시(push) 동작으로 데이터를 저장하고, 팝(pop) 동작으로 데이터를 인출합니다.
이러한 스택은 후입선출(LIFO, Last-In First-Out) 방식에 따라 동작하므로, 가장 늦게 저장된 데이터가 가장 먼저 인출됩니다.

스택 영역은 메모리의 높은 주소에서 낮은 주소의 방향으로 할당됩니다.

느낀점
메모리에 영역에대해 자세히 알아봤는데 재밌는점은 또 스택이라는 단어가 눈에 보이는데 이게 호기심을 자극하고 다음에 쓸 주제가 정해진듯 하네요.

참조한글
https://st-lab.tistory.com/198
https://tcpschool.com/c/c_memory_structure

profile
꾸준히 성장하는 개발자

0개의 댓글