본문 바로가기
책벌레와 벌레 그 사이 어딘가/개념쌓기

[개념쌓기] 메모리? 스택,힙?

by veganwithbacon 2023. 1. 6.
반응형

메모리가 무엇을 하는지 알아보고 JAVA 내에서의 메소드 영역의 역할 및 가비지컬렉터의 기능까지 같이 공부할 계획이다.

우선 메모리가 어떻게 이뤄져있는지를 알아보자.

 

🔔성격 급한 꼬레아노들을 위해

✔스택(Stack) 

-액세스가 매우 빠르다

-변수를 명시적으로 할당/해제할 필요가 없다

-공간은 CPU에 의해 효율적으로 관리되고 메모리는 단편화되지 않는다

-지역 변수와 매개변수

-스택 크기 제한(OS에 따라 다름)

-변수의 크기 조정이 불가능

 

✔힙(Heap)

-변수는 전역적으로 액세스 할 수 있다

-메모리 크기 제한이 없다

-(상대적으로) 느린 액세스

-효율적인 공간 사용을 보장하지 못하면 메모리 블록이 할당된 후 시간이 지나 메모리가 조각화되어 해제될 수 있다

-메모리를 관리해야한다

-변수 C언어 realloc() or 자바는 new연산자

 

그럼 malloc 함수는 뭐냐고? 니가 알ㅇ

realloc이 malloc이나 calloc을 통해 할당된 메모리의 공간을 더 늘리거나 줄이기 위해 사용된다.

더 궁금하면 공부하자? 네! 공부하겠습니다

 

위는 요약본이고 좀더 궁금하다면 아래 내용을 참고하자!

 


  메모리 구조

메모리 구조

위의 이미지처럼 메모리 구조는 Code/Data/Heap/Stack 영역으로 이뤄져있다.

 

  Code영역

Code 영역은 우리가 작성한 소스코드가 들어가는 부분으로, 실행할 프로그램의 코드가 저장되는 텍스트 영역이라고도 부른다. 실행 파일을 구성하는 명령문들이 저장되는 메모리 영역으로 함수, 제어문, 상수 등이 지정된다

CPU는 이곳에서 저장된 명령어를 하나씩 가져가서 처리한다.

 

  Data영역

메모리의 Data영역은 프로그램의 전역 변수와 정적(Static) 변수가 저장되는 영역이다.

프로그램의 시작과 함께 할당되고, 프로그램이 종료되면 소멸한다.

Data의 영역도 크게 두 가지로 나눌 수 있다.

초기화 된 변수 영역(initialized data segment)과 초기화되지 않은 변수 영역(uninitialized data segment)으로 나뉘죠. 그리고 그 중 초기화되지 않은 변수 영역은 BSS(Block Started by Symbol) 이라고도 합니다. 

 

  Heap 영역

힙 영역을 한 줄로 말하면, '사용자에 의해 관리되는 영역'이라고 할 수 있다.

보통 동적으로 할당할 변수들을 이곳에서 저장한다고 생각하면 된다.

Java나 C++에서 new 연산자로 생성할 경우 또는 class, 참조 변수들도 Heap영역에 저장하게 된다.

그러나 이는 언어마다 다르기에 Heap 영역이라고 하면 '동적 할당 영역' 이라고만 알아두자.

또 하나의 중요한 특징은 ' 낮은 주소에서 높은 주소로 할당(적재)된다는 것'이다

 

  Stack 영역

메모리의 Stack 영역은 함수의 호출과 연관있는 지역 변수와 매개변수가 저장되는 영역이다.

함수의 호출과 함께 할당되고, 함수의 호출이 완료되면 소멸한다.

 

스택 영역에서 저장되는 함수의 호출 정보를 스택 프레임(Stack Frame)라고 한다고 함. 

(있다는 것만 알고 있자)

 

Stack에서는 Push 동작을 통해 저장하며 Pop 동작을 통해 데이터를 인출한다.

위의 설명에서 알 수 있듯이 Stack 영역은 후입선출(LIFO, Last- In First-Out) 방식에 따라 동작하기에,

마지막 저장된 데이터가 제일 먼저 나오게 된다.

Stack 영역은 Heap 영역과는 반대로 메모리의 높은 주소에서 낮은 주소의 방향으로 할당된다.


HEAP과 STACK영역은 사실 같은 공간을 공유하는데, HEAP이 메모리 위쪽 주소부터 할당되면 STACK은 아래쪽부터 할당되는 식이다. 그래서 각 영역이 상대 공간을 침범하는 일이 발생할 수 있는데 이를 각각 HEAP OVERFLOW, 

STACK OVERFLOW라고 칭한다.

Stack 영역이 크면 클 수록 Heap 영역이 작아지고, Heap 영역이 크면 클수록 Stack 영역이 작아진다.


 

 

 

 

참고 자료 : 

https://jinshine.github.io/2018/05/17/%EC%BB%B4%ED%93%A8%ED%84%B0%20%EA%B8%B0%EC%B4%88/%EB%A9%94%EB%AA%A8%EB%A6%AC%EA%B5%AC%EC%A1%B0/ .

http://www.tcpschool.com/c/c_memory_structure .

https://junghyun100.github.io/%ED%9E%99-%EC%8A%A4%ED%83%9D%EC%B0%A8%EC%9D%B4%EC%A0%90/ .

 

반응형

댓글