Haru's 개발 블로그

[운영체제] 메모리 구조(Code,Data,Stack,Heap)은 무엇일까? 본문

CS/운영체제

[운영체제] 메모리 구조(Code,Data,Stack,Heap)은 무엇일까?

Haru_29 2022. 5. 5. 01:36

운영체제는 메모리에 이 프로그램을 위한 공간을 할당 해 준다.

그때 공간을 4가지(Code, Data, Heap, Stack)으로 나뉘어져있다.

먼저 코드 영역에 대해 알아 보도록 하자

- 우리가 작성한 소스 코드가 기계어 형태오 저장이 된다.

- 컴파일 타임에 결정되고, 중간에 코드가 변경되지 않도록 Read-Only 형태로 저당된다.

 

그다음은 데이터 영역~

- 전역변수, static 변수로 저장

- 프로그램 시작과 동시에 할당되고, 프로그램이 종료 되어야 메모리가 해제가 된다.

- 실행 도중 변수 값이 변경될 수 있으니 Read-Write로 지정된다.

 

이번은 힙 영역을 알아보도록 하자. 이 부분은 ARC와 연관이 있는데 ARC는 다음 포스팅으로 알아보도록 합시다.

- 프로그래머가 할당/해제 하는 메모리 영역

- 프로그래머는 malloc,calloc으로 힙에 메모리를 할당할 수 있으며, 이를 '동적 할당'이라고 한다.

- 사용한 후에는 메모리 해제를 해줘야 한다. -> 그렇지 않으면 memory leak가 발생한다.

- Code, Data, Stack 중 유일하게 런타임 시에 결정되기 때문에 데이터의 크기가 확실하지 않을 때 사용하도록 한다.

- 스위프트 측면으로 보면 클래스 인스턴스, 클로저와 같은 참조 타입의 값은 힙에 자동할당 된다.

- 근데 힙은 메모리 해제를 해야하지만 Swift에서는 ARC를 통해 힙에 할당된 메모리가 더 이상 쓸모가 없어지면 자동으로 해제를 해준다.

장점
- 메모리 크기에 제한 없음 -> 단, 완전히 제한이 없는 건 아니고 오버되면 힙오버플로우가 걸릴수 있다.
- 본질적인 범위가 전역이기 때문에, 프로그램의 모든 함수에서 액세스 할 수 있음

단점
- 할당작업, 해제 작업으로 인한 속도 저하
- 힙 손상(이중 해제, 해제 후 사용 등) 작업으로 인한 속도 저하
- 힙 경합(두 개 이상 쓰레드가 동시에 접근할 때 Lock이 걸림)으로 인한 속도 저하
- 메모리를 직접 관리해야 함(해제해주지 않을 시 메모리 누수 발생)

 

마지막으로 스택 영역에 대해 알아 보도록 하자.

- 함수 호출 시 함수의 지역변수, 매개변수, 리턴 값 등등이 저장되고, 함수가 종료되면 저장된 메모리도 해제된다.

- 컴파일 타임에 결정되기 때문에 무한히 할당할 수 없다.

OS는 내부적으로 함수 안에 선언된 파라미터, 지역변수 등을 스택에 할당한다.

그리고 위 add 함수가 종료되는 시점에 스택에 저장된 메모리는 모두 알아서 반환된다.

우리가 아는바로는 Stack은 LIFO(last in, first out)인 데이터 구조라서 CPU에 의해 관리되고 최적화 돼서 속도가 매우 빠르다.

장점 - CPU가 스택 메모리를 효율적으로 구성하기 떄문에 속도가 매우 빠르다.
- 메모리를 직접 해제를 해주지 않아도 됨
단점 - 메모리 크기에 대란 제한 있음
- 지역 변수만 액세스 가능

결론적으로는 스택은 메모리 크기가 제한이 있기 때문에 무한히 할당할 수는 없다.

 

그러면 언제 힙을 쓰고 스택을 사용할까?

결론적으로 데이터의 크기를 모르거나, 스택에 저장하기엔 큰 데이터의 경우엔 힙에 할당 하고 그 외에는 스택에 할당 된다.

그래서 스택에 너무 많은 메모리를 할당하게 되어 자신의 스택 영역을 초과 -> 스택오버플로우 발생 -> 내 앱은 깰꼬닥.....

그리고 실은 힙과 스택은 메모리 영역을 공유한다.

요런 느낌으로 힙 영역은 낮은 메모리 주소로부터 할당 받게 된고 스택 영역은 높은 메모리 구조로부터 할당 받게된다.

'CS > 운영체제' 카테고리의 다른 글

[운영체제] 3. Process - 1  (0) 2022.05.29
[운영체제] 1. 운영체제란?  (0) 2022.05.29
[운영체제] System Call  (0) 2022.05.24
[운영체제] 인터럽트(Interrupt)  (0) 2022.05.24
[운영체제] 프로세스의 주소 공간  (0) 2022.05.24
Comments