[OS] 프로세스 주소공간 / Stack에 높은 주소부터 할당하는 이유

Manx·2023년 2월 13일
0

운영체제

목록 보기
11/12

OS 심화 스터디를 하며 기본적인 점들과, 궁금했던 점들에 대한 해답을 정리하는 시간을 가져보도록 하겠다!

프로세스 주소 공간이란 무엇일까?

  • 프로세스가 메모리를 할당 받으면, 메모리를 관리하기 위해 이 공간들을 어떤 구조로 관리한다. 이를 프로세스 주소 공간이라고 함.

Stack

  • 함수의 호출과 관계되는 지역 변수매개변수가 저장되는 영역이다.
  • 함수의 호출과 함께 할당되며, 함수의 호출이 완료되면 소멸한다.
  • 재귀 함수가 너무 깊게 호출되거나, 지역변수를 너무 많이 가지고 있어 Stack 영역을 초과하면 Stack Overflow가 발생한다.
  • 일반적으로 높은 주소에서 낮은 주소로 할당된다. (💡궁금)

Heap

  • 런타임에 크기가 결정되는 영역
  • 사용자에 의해 공간이 동적으로 할당 및 해제 ( C를 예로 들면 malloc, calloc이 있다.)
  • 주로 참조형 데이터 (ex. 클래스) 등의 데이터가 할당된다.

Data

  • 전역 변수Static 변수 등 프로그램이 사용할 수 있는 데이터를 저장하는 영역
  • 프로그램의 시작과 함께 할당되며 프로그램이 종료되면 소멸한다.
  • 초기화 되지 않은 변수가 있다면 BBS영역에 저장된다.
    - rodata : 읽기 전용으로 초기화 되는 영역 (상수==CONST로 선언되는 영역이다.)
    - data : 전역변수 중 초기값을 갖는 경우
    - BBS(Block Started by Symbol) : 전역변수로 초기화되지 않거나 Static으로 선언된 심볼을 의미한다.

Text(Code)

  • 프로그램이 실행될 수 있도록 CPU가 해석 가능한 기계어 코드가 저장되어 있는 공간
  • 프로그램이 수정되면 안되므로 ReadOnly 상태로 저장되어 있다.

Stack / Heap 속도 차이

Stack이 Heap보다 훨씬 속도가 빠르다.

Stack은 이미 크기가 정해진 메모리이다.
따라서 메모리 할당이 따로 필요없으며, 사용한 메모리를 굳이 반납하지 않고 Stack Pointer를 이동시키며 데이터를 저장한다.
Stack Pointer를 감소시키며 남아있던 데이터는 스택 포인터가 증가할때 사용했던 공간을 단순히 덮어 쓰는 식으로 사용된다.

반면 Heap은 런타임에 동적으로 할당되기 때문에 메모리 할당 & 해제 관리에 자원이 소모된다.
또한, Thread Safe하지 않아 동기화 작업을 거쳐야 한다.
메모리 공간이 정적이지 않고, 크기가 변할 수 있어 스택보다 더 느리다.

Stack과 Heap의 크기 차이

Stack은 Heap에 저장되어 있는 값의 주소값을 참조하거나, 지역변수들이 저장되므로 Stack의 크기는 Heap의 크기보다 매우 작아도 괜찮다.

Thread의 주소공간

Thread는 각 각의 Stack공간을 보유하고 있으며, 나머지 영역은 모두 공유한다.

이 개념이 매우 중요한데, 앞으로 포스팅할 운영체제에서 거의 모두 Thread에 대한 내용을 다루기 때문이다.
ContextSwitching에 대한 Cost도 차이가 난다 정도만 알고 가자.


궁금증 해결

Stack은 왜 높은 주소부터 할당되는가?

결론부터 말하자면, 꼭 높은 주소부터 할당해야 하는 것은 아니다.
다른 아키텍처에서는 스택의 값을 낮은 주소부터 할당하는 경우도 있다고 한다.
중요한 것은 Stack과 Heap을 교차시켜 사용한다는 점이다.
그 이유는, 중복을 방치하고 충분한 주소 공간을 확장할 수 있게 하기 위함이다.

커널 영역을 침범하지 않기 위해 등 다양한 이유들이라고 설명하는 글들을 보았지만, 이 이유가 가장 타당해 보인다.

https://stackoverflow.com/questions/4560720/why-does-the-stack-address-grow-towards-decreasing-memory-addresses

profile
백엔드 개발자

0개의 댓글