[CS(OS)] Heap과 Stack메모리에 대하여
Stack과 Heap은 컴퓨터 프로그램이 실행될 때 메모리를 관리하는 두 가지 주요 메모리 영역입니다.
Stack 메모리
Stack은 함수 호출, 지역 변수, 매개변수, 그리고 함수의 반환 주소 등을 저장하는 데 사용되는 메모리 영역입니다.
이 영역은 고정된 크기로 할당되며, 함수 호출이 일어날 때마다 새로운 메모리 블록(스택 프레임)이 생성됩니다.
스택의 작동원리와 특징
LIFO(Last In, First Out)
Stack은 후입선출 방식으로 동작합니다. 마지막에 들어간 데이터가 가장 먼저 나옵니다.
함수가 호출되면 해당 함수의 매개변수, 지역 변수, 반환 주소 등이 스택에 푸시(push)되고, 함수가 종료되면 이 정보들이 팝(pop)되며 스택에서 제거됩니다.
스택 프레임
각 함수 호출은 스택에 스택 프레임을 생성합니다. 이 프레임에는 함수의 매개변수, 지역 변수, 함수 실행 후 돌아갈 주소 등이 포함됩니다.
함수가 종료되면 이 스택 프레임이 제거됩니다.
자동 메모리 관리
Stack 메모리는 자동으로 할당되고 해제됩니다. 프로그래머가 직접 메모리 관리를 신경 쓸 필요가 없습니다. 함수 호출 시 필요한 메모리가 자동으로 할당되고, 함수가 종료되면 자동으로 해제됩니다.
Stack 장점
속도 : Stack메모리는 매우 빠릅니다. 메모리 할당과 해제가 단순하고 순차적으로 이루어지기 때문에 효율적입니다.
단순성 : 프로그래머가 메모리 할당과 해제를 명시적으로 처리할 필요가 없기 때문에 코드 작성이 간편합니다.
Stack 단점
제한된 크기 : Stack은 고정된 크기로, 운영체제에 따라 크기가 제한되어 있습니다. 큰 데이터를 저장하거나 싶은 재귀 호출을 사용하는 경우 스택 오버플로(Stack Overflow)가 발생할 수 있습니다.
동적 메모리 할당의 제한 : Stack은 주로 작은 크기의 데이터나 지역 변수에 적합하며, 동적으로 크기가 결정되는 복잡한 데이터 구조를 처리하기 어렵습니다.
Heap 메모리
Heap은 프로그램 실행 중에 동적으로 메모리를 할당할 수 있는 메모리 영역입니다.
이 영역은 Stack보다 크며, 주로 동적 데이터 구조(ex. 트리, 링크드 리스트, 동적 배열 등)나 크기가 런타임에 결정되는 데이터를 저장하는 데 사용됩니다.
힙의 작동 원리와 특징
동적 메모리 할당
Heap 메모리는 런타임에 필요에 따라 동적으로 할당됩니다. 프로그래머는 malloc(C), new(C++) 등의 함수를 사용해 메모리를 할당하고,
free(C), delete(C++) 등을 사용해 메모리를 해제합니다.
비순차적 메모리 할당
Heap에서는 메모리가 비순차적으로 할당될 수 있습니다. 즉, 할당된 메모리 블록이 메모리 공간 내에 연속적으로 위치하지 않을 수 있습니다.
수동 메모리 관리
Heap 메모리에서 할당된 메모리는 프로그래머가 직접 해제해야 합니다. 메모리를 적절히 해제하지 않으면 메모리 누수(memory leak)가 발생하여 시스템 리소스가 낭비될 수 있습니다.
Heap 장점
유연성 : Heap은 Stack보다 크고, 프로그램이 실행되는 동안 필요에 따라 메모리를 동적으로 할당할 수 있어 유연하게 사용할 수 있습니다. 크기가 큰 데이터 구조나 동적으로 크기가 변하는 데이터를 처리할 때 유용합니다.
큰 메모리 블록 사용 가능 : Heap은 Stack보다 큰 메모리 블록을 할당할 수 있어 대규모 데이터 구조를 저장하는 데 적합합니다.
Heap 단점
속도 저하 : Heap 메모리의 할당과 해제는 Stack보다 느립니다. 이는 Heap이 더 복잡한 관리 구조를 가지고 있고, 메모리 조각화(fragmentation)로 인해 성능 저하가 발생할 수 있기 때문입니다.
메모리 관리의 복잡성 : Heap 메모리를 관리하는 것은 더 복잡하며, 메모리를 적절히 해제하지 않으면 메모리 누수가 발생할 수 있습니다.
반대로, 해제된 메모리를 다시 사용하려 하면 프로그램이 충돌할 수 있습니다.
스택과 힙의 차이점
매개변수 | 스택(Stack) | 힙(Heap) |
데이터 구조 유형 | 스택은 선형 데이터 구조로, 후입선출(LIFO) 방식으로 작동합니다. | 힙은 계층적 데이터 구조로, 일반적으로 트리 구조를 사용합니다. |
액세스 속도 | 스택 메모리는 매우 빠르게 접근할 수 있습니다. | 힙 메모리는 스택에 비해 느리게 접근됩니다. |
공간 관리 | 스택은 운영체제가 공간을 효율적으로 관리하며, 메모리가 조각화되지 않습니다. | 힙 공간은 효율적으로 사용되지 않을 수 있으며, 메모리 블록이 할당 및 해제되면서 메모리 조각화가 발생할 수 있습니다. |
접근성 | 스택은 지역 변수에만 접근할 수 있습니다. | 힙은 전역적으로 접근 가능한 변수를 저장할 수 있습니다. |
공간 크기의 한계 | 스택의 크기는 OS에 의해 제한됩니다. | 힙은 시스템의 가용 메모리에 따라 크기 제한이 적습니다. |
크기 조정 | 스택에 할당된 변수는 크기 조정이 불가능합니다. | 힙에서 할당된 변수는 크기 조정이 가능합니다. |
메모리 할당 | 스택에서는 메모리가 연속된 블록으로 할당됩니다. | 힙에서는 메모리가 임의의 순서로 할당됩니다. |
할당 및 해제 | 스택에서 메모리 할당 및 해제는 컴파일러에 의해 자동으로 처리됩니다. | 힙에서 메모리 할당 및 해제는 프로그래머가 수동으로 처리해야 합니다. |
할당 해제 | 스택에서는 변수를 명시적으로 할당 해제할 필요가 없습니다. | 힙에서는 메모리를 명시적으로 할당 해제해야 합니다. |
비용 | 스택은 메모리 관리에 저비용입니다. | 힙은 상대적으로 비용이 더 많이 들 수 있습니다. |
구현 | 스택은 단순 배열 기반, 동적 메모리 사용, 연결 리스트 기반의 여러 방식으로 구현될 수 있습니다. | 힙은 배열과 트리를 사용하여 구현될 수 있습니다. |
주요 문제 | 스택은 메모리 부족(Stack Overflow)이 주요 문제입니다. | 힙은 메모리 조각화(Memory Fragmentation)가 주요 문제입니다. |
참조 지역성 | 스택은 자동으로 컴파일 시간에 관리됩니다. | 힙은 적절한 메모리 관리가 필요합니다. |
유연성 | 스택은 고정된 크기를 가집니다. | 힙은 크기 조정이 가능합니다. |
액세스 시간 | 스택은 빠르게 접근할 수 있습니다. | 힙은 상대적으로 느리게 접근됩니다. |
스택 힙의 예시 코드
public class StackHeapExample {
// 스택에 저장되는 메서드 내의 지역 변수
public static int add(int a, int b) {
int sum = a + b; // sum은 스택에 저장됨
return sum;
}
public static void main(String[] args) {
// 스택에 저장되는 지역 변수
int x = 5;
int y = 10;
// 스택에서 add 메서드 호출, 반환값도 스택에 저장
int result = add(x, y);
// 힙에 저장되는 객체
MyClass obj1 = new MyClass(20); // obj1은 스택에 있지만, new로 생성된 객체는 힙에 저장됨
MyClass obj2 = new MyClass(30); // obj2도 스택에 있지만, 객체 자체는 힙에 있음
// 결과 출력
System.out.println("Result: " + result);
System.out.println("Obj1 Value: " + obj1.value);
System.out.println("Obj2 Value: " + obj2.value);
}
}
class MyClass {
int value;
// 생성자를 통해 힙에 객체가 생성되고, 필드 value가 할당됨
MyClass(int value) {
this.value = value; // this.value는 힙에 저장됨
}
}
출처
https://www.guru99.com/ko/stack-vs-heap.html
https://velog.io/@tjddus0302/%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0-%EB%B0%B0%EC%97%B4
https://f-lab.kr/insight/understanding-stack-and-heap
https://velog.io/@tonic523/%ED%9E%99-%EC%98%81%EC%97%AD-vs-%EC%8A%A4%ED%83%9D-%EC%98%81%EC%97%AD