메모리의 구조 (코드, 데이터, 힙, 스택)

 

메모리의 구조 (코드, 데이터, 힙, 스택)

 

 

 

 

이번에는 개발자라면 알아야할 메모리의 구조에 대해서 알아보자 먼저 프로그램을 실행할때 메모리에 로드되어 실행할 준비를 한다 이때 실행에 필요한 다양한 자원을 저장할 공간이 필요한데

 

프로그램의 코드가 저장되는 코드공간, 전역변수와 정적변수(static)가 저장되는 데이터공간 그리고 지역변수와 매개변수가 저장되는 스택, 또한 사용자가 직접 컨트롤할수있는 공간에 대해서 알아보도록 하자

 

 

 

 

코드(Code)


프로그램의 저장된 명령어를 처리하는 코드공간은 텍스트 공간이라고도 불리우며, 우리가 짠 코드들을 하나씩 가져가서 명령어를 처리한다

 

우리가 만든 소스코드를 컴파일러는 여러과정을 거쳐서 컴퓨터가 이해할수있는 기계어로 변환하게되는데 이때 컴퓨터는 하나씩 명령어를 CPU로 가져가서 처리한다

CPU는 들어온 명령어를 인출(Instruction Fetch)을 하고 그 나온 명령어를 해독(Instruction Decode)를 하게된다

 

해독하는 과정에서 레지스터들이 회로를 따라서 해당명령어를 수행하는데 사실 이런 자세한 부분까지 설명하면 아마 머리가 아플거같다(학부생때 이과목떄문에 고생좀했다..) 해독이후에 연산을 하고 실행하게 되는데 명령어처리의 효율성을위해 파이프라인 구조로 되어있다

 

아무튼 코드를 정리하자면 우리가 쓴 소스코드를 컴퓨터가 이해할수있는 기계어로 변환한뒤 CPU에서 이것들을 하나씩 가져가서 명령어를 해독하는 과정을 거치게된다 코드는 위와같은 수행을 위해서 코드들을 저장해두는 공간이라고 볼수있다

 

 

 

 

 

 

 

데이터(Data)


 

데이터는 작성된 전역변수와 정적변수(Static)이 저장되는 공간으로써 여기서 중요한점이있다

static이 붙은 변수는 프로그램 실행시에 데이터공간에 할당되며 프로그램 종료시에 소멸한다는 특징이있다

 

우리가 Class 안에 지역변수를 선언할때 static이 붙지않으면 객체가 생성될때 변수가 생성된다는 특징이 있는데 정적변수는 항상 프로그램 실행시에 올라가기에 지역변수와 같이 쓸수없으며, 프로그램 생성시 바로 생성되기때문에 별도의 객체생성없이 바로 사용이 가능하다

 

 

 

 

 

스택(Stack)


우리가 Stack, Heap은 자주들어봤을 만한데 스택은 지역변수와 매개변수가 할당되는 공간으로써 기본적으로 LIFO(Last In First Out)형식의 구조를 띈다 마지막에 들어온게 가장 먼저 나가는 구조이며, 호출이 되야 생성이된다

 

 

 

 

위와같이 프링글스통(?) 같은 구조로써 먼저 들어온게 가장 아래에 쌓이고 위로 차근차근 덮힌다 뺄때는 위에서부터 빠져나가는것을 볼수있다 우리가 JAVA에서 메서드호출시에 이러한 호출스택의 형태로 메서드가 실행되는데 가장먼저 main()메서드가 실행되고 main()메서드안에 다른메서드가 있다면 main()메서드가 그 메서드를 호출한다 그리고 호출된 메서드가 다른메서드를 호출해서 계속해서 위로 쌓이다가 하나씩 종료되면 위에서부터 소멸한다

 

그렇게 main()메서드 까지 호출이 종료되면 프로그램이 종료되는것이다 이것이 호출스택이라고 한다

스택영역은 Push를 통해서 집어넣고 Pop을 통해서 꺼낸다

 

스택을 정리하자면 나중에 들어온게 가장먼저 나가는 LIFO이다 그리고 지역변수와 매개변수가 할당되는 공간이다

 

 

 

 

 

 

 

힙(Heap)


힙은 사용자가 직접 관리하고 사용할수있는 동적영역이다 이게 무슨말이냐면 위에 데이터와 스택은 컴파일러시에 크기가 결정되고 할당되는데 힙영역은 프로그램이 실행중인 상태에서 직접 할당하고 사용하는 동적영역이다

 

런타임중에 메모리를 할당받는것을 동적할당 이라고 부르며 C언어에서 Malloc(), Calloc() 등으로 제어할수있다

 

스택과 차이점을 보자면 스택은 할당과 해제가 빨라 액세스속도가 좋다 또한 메서드가 끝나면 자동으로 소멸하기때문에 따로 해제할 필요가 없다 하지만 고정된 메모리크기를 가지면서 지역변수만 저장할수있다는 단점을 가지고있다

 

그에반해 힙은 메모리크기의 제한이없고 변수를 전역으로 할당하고 해제할수있다 지역변수만 다루는 스택과 가장 큰 차이점이라고 볼수있다

 

하지만 느린액세스속도와 더불어 사용자가 할당하고 해제하기때문에 난이도가 쫌있는편이다 만약 할당만하고 해제를 안하면 점점 쌓여 과부하가 일어날수있다(설계 난이도 증가)

 

 

 

 

정리


자 한번 정리해보자 메모리의 구조는 자원의 종료에따라 코드, 데이터, 스택, 힙영역에 저장된다

 

코드 : 명령어가 저장되는 공간

데이터 : 정적변수(Static)와 전역변수가 저장되는 공간

스택 : 지역변수와 매개변수가 저장되며 LIFO구조를 가지고있다 또한 액세스속도가 빠르다 하지만 고정된 메모리 크기를 가지고있다는 단점이있다

힙 : 사용자가 직접 할당하고 해제할수있는 공간이며 액세스속도가 느리지만 메모리의 크기가없다

또한 변수를 전역으로 할당하고 해제할수있다

 

 

 

 

 

'컴퓨터 > 컴퓨터공학' 카테고리의 다른 글

프로세스와 스레드 한번에 이해하기  (0) 2023.01.19