메모리가 많을수록 좋다. 코드를 짜니 스택오버플로우가 떴다. 등등 메모리 관련해서 이야기는 많이 합니다. 그러면 메모리와 힙, 스택은 정확히 무엇을 의미하는지 알아보겠습니다.
메모리의 용도
프로그램이 실행되기 위해서 우선 프로그램이 메모리에 로드가 되어야 합니다.
이 뿐만이 아니라 프로그램이 실행이 되면서 동적으로 추가되야할 부분이 있으면 메모리가 더 할당됩니다.
메모리 구조(공간)
프로그램에 할당된 메모리 구조는 아래와 같습니다.
1. 코드 영역
2. 데이터 영역
3. 스택 영역
4. 힙 영역
이러한 구조를 도식화 하면 아래와 같습니다.
그럼 이제 공간 하나하나씩 설명해보겠습니다.
코드(Code) 영역
실행할 프로그램의 코드가 저장되는 영역입니다.
CPU가 프로그램을 실행할때 코드 영역에서 코드를 하나씩 가져가서 처리합니다.
데이터(Data) 영역
전역 변수, 정적 변수, 배열, 구조체 등이 저장되는 영역입니다.
프로그램이 실행될때 생성이 되고 프로그램이 종료되면 시스템(OS)에 반환합니다.
힙(Heap) 영역
필요에 의해 사용자가 동적으로 메모리를 할당하려 할때 사용되는 영역입니다.
C언어 같은 경우 malloc, Java나 C++ 같은 경우 new() 등으로 사용되는 영역입니다.
Stack 대비 장점으로
변수를 전역적으로 사용할 수 있다.
메모리 크기에 제한이 없다.
반대로 단점으로
상대적으로 느린 속도. (할당, 해제가 느립니다.)
메모리 관리 필요성. (할당 후 다 사용한 메모리는 해제를 통해 반환 해야합니다.)
스택(Stack) 영역
지역 변수, 매개 변수가 저장되는 영역입니다.
스택 영역은 함수 호출과 함께 할당되며, 함수가 종료되면 시스템에 반환됩니다.
처음 프로그램에 메모리가 할당될때 크기가 고정적으로 할당되며, 중간에 변경이 불가능합니다.
할당, 해제를 스택방식으로 한다고 해서 스택영역입니다.
Heap 대비 장점으로
상대적으로 매우 빠른 속도.(할당 해제가 빠릅니다.)
메모리 관리 필요성. (변수를 명시적으로 할당, 해제 할 필요가 없습니다. → ex : 함수 종료시 자동 해제)
반대로 단점으로
메모리 크기가 프로그램 처음 로딩 시 고정이 되어 제한적입니다.
지역 변수만 사용이 가능합니다.
'개발잡담 > 공부' 카테고리의 다른 글
멀티쓰레드는 쓰레드랑 어떤게 다를까 (0) | 2023.09.13 |
---|---|
쓰레드(Thread)는 무엇일까? (feat. JAVA) (0) | 2023.09.08 |
Buffer란 무엇일까? (0) | 2023.09.06 |
DB에서 transaction이란 뭘까 (0) | 2023.08.10 |