메모리 구조 (Code, Data, Stack, Heap)

Harry Ho·2023년 11월 30일

Computer Architecture

목록 보기
1/1
post-thumbnail

메모리 구조

1. 코드 영역

작성한 소스 코드가 기계어 형태로 저장된다.
컴파일 타임에 결정되고, 중간에 코드가 변경되지 않도록 Read-Only 형태로 저장된다.

2. 데이터 영역

전역변수, static 변수가 저장된다.
프로그램 시작과 동시에 할당되고, 프로그램이 종료 되어야 메모리가 해제된다.
실행 도중 변수 값이 변경될 수 있으니 Read-Write로 지정된다.

[추가 확인 필요] Swift에서는 static의 기본 동작이 lazy로 값을 처음 접근할 때 할당되므로, 바로 메모리에 올라가진 않을 수 있다.

3. 힙 영역

프로그래머가 할당/해제하는 메모리 영역
프로그래머는 malloc, calloc으로 힙에 메모리를 할당할 수 있으며, 이를 '동적 할당'이라고 한다.
메모리를 사용한 이후에는 반드시 메모리 해제를 해줘야 한다.
그렇지 않으면 memory leak이 발생한다.
Code, Data, Stack 외 유일하게 런타임 시에 결정되기 때문에 데이터의 크기가 확실하지 않을 때 사용한다.

Swift에서는 클래스 인스턴스와 클로저 같은 참조 타입의 값을 통해 힙 영역에 자동 할당된다. 메모리 해제는 ARC를 통해 힙에 할당된 메모리가 사용되지 않으면(참조되지 않으면) 자동으로 해제된다.

장점

  • 메모리 크기에 대한 제한이 없다
  • 본질적인 범위가 전역이기 때문에, 프로그램의 모든 함수에서 액세스 할 수 있다.

단점

  • 할당 작업, 해제 작업으로 인한 속도 저하
  • 힙 손상(이중 해제, 해제 후 사용 등) 작업으로 인한 속도 저하
  • 힙 경합(두 개 이상 쓰레드가 동시에 접근하려 할 때 Lock이 걸림)으로 인한 속도 저하
  • 메모리를 직접 관리해야 함(해제해주지 않을 시 메모리 누수 발생)
  • 위와 같은 과정으로 스택대비 속도가 느리다. 스택 대비 느리다는 말은 엄청 느리다는 것이 아니다.

4. 스택 영역

함수 호출 시 함수의 지역변수, 매개변수, 리턴 값 등등이 저장되고, 함수가 종료되면 저장된 메모리도 해제된다.
컴파일 타임에 결정되기 때문에 무한히 할당할 수 없다.

강점

  • CPU가 스택 메모리를 효율적으로 구성하기에 속도가 매우 빠르다
  • 메모리를 직접 해제해주지 않아도 된다.

단점

  • 메모리 크기에 대한 제한이 있다
  • 지역 변수만 접근이 가능하다, 즉 메모리를 무한히 할당할 수 없다.

5. 힙 vs 스택

힙을 사용하는 경우는 데이터의 크기를 모르거나, 스택에 저장하기엔 큰 데이터의 경우에 사용한다. 그 외에는 스택에 할당하면 된다.

만약에 스택에 너무 많은 메모리를 할당하게 되면 스택 오버 플로우가 발생한다.

6. 힙과 스택의 메모리 관계

기본적으로 힙과 스택은 같은 메모리 영역을 공유한다.
힙은 낮은 메모리 주소로부터 할당받고,
스택은 높은 메모리 주소로부터 할당 받는다.
힙도 자신의 영역외로 확장하면 힙 오버 플로우가 발생한다.

출처: 개발자 소들이님의 블로그
https://babbab2.tistory.com/25

profile
개발이라 축구를 잘 못합니다.

0개의 댓글