프로세스 메모리 구조 에서의 스택(Stack) 이란?
resilient
·2021. 12. 5. 01:20
2021.12.04 - [자료구조 & 알고리즘/자료구조] - 자료구조에서의 스택(Stack) 이란?
위의 이전 게시물에 이어 이번 시간에는 프로세스 메모리에서의 스택에 대해서 정리해보려고 합니다.
그러기 위해서는 프로세스 메모리 구조에 대해서 먼저 알아야겠죠?
먼저, 프로세스 메모리 구조는 Text(code), Data, Bss, Heap, Stack 영역으로 나눠져 있습니다.
Code 영역
실행할 프로그램의 코드가 저장됩니다. CPU는 Code 영역에서 명령어를 하나씩 가져와서 처리를 하게 되죠.
읽기만 가능한 메모리 영역이기 때문에 데이터를 저장하려고 하면, 충돌을 일으켜서 프로세스가 중지됩니다.
Data 영역
전역 변수와 정적 변수, 배열, 구조체 등이 저장됩니다. 읽고 쓰기가 가능한 메모리 영역이고, 이 변수들은 프로그램이 시작될 때 할당되고 프로그램이 종료하면 소멸됩니다. Data 영역이 런타임 이전에 초기화하는 것이라면, Bss는 런타임 이후 초기화하는 것이라고 할 수 있습니다.
Bss영역
Data 영역에서 더 깊게 들어온 영역입니다.
Bss 영역에는 초기화되지 않은 전역 변수가 저장됩니다. 이미 초기화된 전역 변수는 Data 영역에 저장되어 비휘발성 메모리인 ROM에 저장되는데, 비용이 많이 들기 때문에 RAM과 ROM에 저장될 것들을 구분해 주기 위해서 영역을 구분해서 사용하게 됩니다.
Stack 영역
Stack 영역을 간단하게 말하면 호출된 함수의 수행을 마치고 복귀할 주소 및 데이터(지역변수, 매개변수, 리턴 값 등)를 임시로 저장하는 공간입니다. Stack 영역에서는 함수 인자 값, 함수 내의 지역변수, 매개변수, 리턴 값 등 잠깐 사용했다가 사라지는 데이터들을 저장합니다.
위에서 설명한 모든 Stack영역 동작의 매커니즘은 자료구조에서의 스택 (LIFO) 방식을 사용하기 때문에 메모리의 높은 주소에서 낮은 주소의 방향으로 데이터가 할당됩니다.
Stack은 컴파일 타임에 크기가 결정되기 때문에 무한대로 할당 할 수는 없습니다.
재귀 함수가 깊이가 너무 깊어지거나 함수가 지역변수를 너무 많이 가지고 있어서 Stack 영역을 초과하게 되면 우리가 흔히 알고 있는 stack overflow 에러가 발생하게 됩니다.
Heap 영역
Heap 영역은 Code, Data, Stack 영역과는 다르게 런타임(프로그램 동작) 시 크기가 결정됩니다.
예를 들어, malloc등으로 Heap영역의 메모리를 사용하거나, pointer 변수를 할당하면 pointer가 가리키는 Heap 영역의 임의의 공간부터 원하는 크기만큼 할당해서 사용하게 되죠.
단, 사용하고 난 뒤에는 반드시 할당된 메모리를 해제해줘야 합니다. 해제해주지 않으면 memory leak이 생기게 됩니다. ( memory leak을 방지하기 위해 많은 언어들이 가비지 컬렉터 기능을 지원해주는데, 가비지 컬렉터에 대해서는 다음시간에 알아보겠습니다.)
Heap 영역 동작의 메커니즘은 자료구조에서의 Heap (LILO) 방식을 사용하기 때문에 메모리의 낮은 주소에서 높은 주소의 방향으로 할당됩니다.
스택 메모리보다 할당할 수 있는 메모리 공간이 많지만, 포인터로 메모리 영역을 접근해야 하기 때문에 속도가 느립니다.
정리해보면, Heap 영역은 필요에 의해서 메모리를 할당하고자 할 때, 메모리 주소 값에 의해서만 참조되고 사용되는 동적인 영역이라고 할 수 있습니다.
정리
정리를 해보니, 면접에서 질문을 받았더라면 아찔했을 정도로 프로세스 메모리에 대해 잘 모르고 있었던 것 같습니다.
특히 스택의 크기 개념에 대해서 이번 정리를 통해 잘 짚고 넘어갔다는 생각이 듭니다.
다음 시간에는 위에서 언급했던 가비지 컬렉터, 그중에서도 제가 많이 사용하는 자바스크립트에서 가비지 컬렉터가 어떻게 작업을 수행하는지에 대해서 정리해보겠습니다!
감사합니다.
'CS & Network > 운영체제(OS) & 컴퓨터구조' 카테고리의 다른 글
[운영체제(OS)] 쓰레드(Thread)와 멀티 쓰레드 프로그래밍(Multi Thread Programming) 이란? (1) | 2021.12.22 |
---|---|
[운영체제(OS)] 프로세스와 컨텍스트 스위칭(Context Switching)이란? (0) | 2021.12.15 |
[컴퓨터구조] 메모리2 (0) | 2021.05.06 |
[컴퓨터구조] 메모리 (0) | 2021.05.05 |
[컴퓨터구조] 기억장치 (0) | 2021.05.03 |