인프런 커뮤니티 질문&답변

이지훈님의 프로필 이미지
이지훈

작성한 질문수

운영체제 공룡책 강의

03. 프로세스의 이해: Chapter 3. Processes (Part 1)

스택 영역의 크기는 정적인가요? 동적인가요?

작성

·

1K

0

  1. 스택의 크기는 컴파일 타임에 결정되므로 정적 할당 영역 이다.

  2. 스택의 크기는 런타임에 크기가 변할 수 있는 동적 항당 영역이다.

  3. 스택의 크기는 컴파일 타임에 결정되므로(예로 100) 정적할당이면서, 런타임에 스택에 데이터가 저장됨에 따라 스택의 크기는 10, 20, 30, 20, 15 이런식으로 변할 수 있으니까, 동적 할당 영역이기도 하다.

 

특정 책에서는 스택을 동적 할당 영역이라고 설명하고, 특정 대학 강의에서는 스택은 컴파일 타임에 크기가 결정된다고 설명합니다. 해당 강의에서는 이에 대한 내용이 없는 것 같은데, 어떤 설명이 맞는건지 궁금합니다.

답변 1

0

스택은 정적 할당된 영역이라고 볼 수 있습니다. 우리가 작성한 함수가 실행되면 가장 먼저 해당 함수에서 사용되는 지역 변수들의 크기에 맞춰 스택 메모리가 할당됩니다. 이때 할당은 새로운 메모리 영역을 할당받는 것이 아니라 현재 SP 레지스터가 가리키고 있는 위치를 이동시켜 사용함을 의미합니다. 따라서 해당 함수는 매 호출마다 SP를 스택 크기만큼 이동하여 동작한 후 return을 만나게 되면, 함수가 호출되기 전 SP 레지스터 위치로 복구하여 이전 함수에서의 context를 유지하게 됩니다.

이지훈님의 프로필 이미지
이지훈
질문자

답변 감사합니다.

그런데 "혼자 공부하는 컴퓨터구조 운영체제"라는 책에서
"힙 영역과 스택 영역은 프로세스 실행 과정에서 그 크기 가 변할 수 있는 영역입니다. 그래서 이 두 영역을 동적 할당 영역이라고도 부르지요." 라고 설명하는데, 어떻게 해석해야할지 어렵네요 ㅎㅎ;

  1. 우선 스택은 정적 할당 영역, 힙은 동적 할당 영역입니다. 블록 내에 int a 으로 선언되어있다면 integer 자료형 크기만큼 메모리에 할당을 하겠죠. 이것은 컴파일 타임에 결정되고, 런타임에 a 변수에 할당된 메모리 크기는 변하지 않으니 스택 영역은 정적으로 할당되는 메모리라는 것입니다.

 

  1. 하지만 프로세스는 코드를 순차적으로 수행하기 때문에 프로세스의 실행 과정에 따라 블록에 들어갔다 나왔다 할 것이고, 이에 따라 스택에는 메모리가 할당되었다가 해제되었다가 할 것입니다. 즉, 가변적으로 그 크기가 변하게 되는 것이죠.

 

예를 들어 main 함수 실행 중에 func() 라는 함수가 호출이 되면, 그 순간 SP가 이동하며 스택 프레임과 함께 그 함수 내의 지역 변수가 스택 영역에 할당이 될 것입니다. 그럼 자연스럽게 func() 호출 전의 스택보다는 스택 프레임 크기 + 지역 변수 메모리 크기만큼 func() 호출 후의 스택의 크기가 커지겠죠?

 

이런 관점에서는 런타임에 크기가 변할 수 있는 영역입니다. 알고 계신 바와 같이, 사실 이건 스택 뿐만 아니라 크게 보면 모든 메모리가 그러합니다. OS의 관리 아래 끊임없이 프로세스나 스레드를 실행하고 종료하니까요. 이건 너무 당연한 일이기 때문에 그냥 스택은 정적 할당 영역이라고 생각하시는게 편할 것 같습니다.

 

오래된 질문이지만 지나가다가 답변달아봅니다.

이지훈님의 프로필 이미지
이지훈

작성한 질문수

질문하기