Post

스택 영역


컴퓨터 구조

컴퓨터 구조를 공부하면서 알게된 내용을 요약해서 작성해보자.

함수 호출 스택

  • 게임 퀘스트로 비유할 수 있다.
  • 메인 퀘스트 A 진행 -> 서브 퀘스트 B 진행 -> 서브 퀘스트 C 진행 -> 서브 퀘스트 D 진행 -> D 종료 -> C 종료 -> B 종료 -> A 종료
  • 위 구조는 후입 선출 순서로 본질적으로 스택과 같은 데이터 구조로 처리하기 적합하다.
  • 위 구조는 함수 호출과 원리가 동일하다.
  • 모든 함수는 실행 시에 자신만의 작은 상자가 필요하다. 이 상자 안에 함수가 실행될 때 사용되는 여러 가지 정보가 저장되어 있고, 이 상자들은 스택 구조를 통해 구성된다.
  • 각각의 작은 상자를 스택 프레임 또는 호출 스택이라고 한다. 이 구조는 일반적으로 말하는 프로세스의 스택 영역에 생성된다.
  • 프로세스 스택 영역의 높은 주소가 맨 위에 있고 스택 영역은 낮은 주소 방향으로 쌓인다.
  • 스택 영역이 차지하는 메모리는 함수 호출 깊이에 따라 증가하고 호출이 완료될수록 감소한다.

함수 점프와 반환

  • 함수 A가 B를 호출하면 제어권이 A에서 B로 옮겨진다.
  • 제어권은 실제로 CPU가 어떤 함수에 속하는 기계 명령어를 실행하는지 의미한다.
  • CPU가 함수 A의 명령어를 실행하다가 함수 B의 명령어로 점프하는 것을 제어권이 함수 A에서 B로 이전되었다고 얘기한다.
  • 제어권이 이전될 때 필요한 정보
    • 반환 : 어디에서 왔는지에 대한 정보
    • 점프 : 어디로 가는지에 대한 정보

매개변수 전달과 반환값

  • CPU는 기계 명령어를 실행할 때 점프와 반환이 가능하기 때문에 함수를 호출할 수 있었다.
  • 매개변수의 전달과 반환값을 가져오는 작업을 레지스터로 한다.
  • 함수 A가 B를 호출하면 A는 매개변수를 상응하는 레지스터에 저장하며, B를 실행할 때 이 레지스터에서 매개변수 정보를 얻는다.
  • 함수 B도 반환값을 레지스터에 저장하고, B의 실행이 완료되면 이 레지스터에서 반환값을 가져온다.
  • CPU 내부의 레지스터 수는 제한되어 있다. 매개변수 수가 사용 가능한 레지스터 수보다 많으면 스택 프레임에 넣을 수 있다.

지역 변수

  • 함수 외부에 정의된 변수를 전역 변수라 한다. 이 변수들은 실행 파일의 데이터 영역에 저장되어 있다 프로그램이 실행되면 프로세스 주소 공간의 데이터 영역에 적재된다.
  • 함수 내부에서 정의된 변수를 지역 변수라고 한다. 이 변수들은 해당 함수에서만 사용 가능하고 외부에서는 접근이 불가능하다.
  • 매개변수와 마찬가지로 레지스터에 저장할 수 있지만, 로컬 변수 수가 레지스터 수보다 많으면 스택 프레임에 저장 되어야 한다.
  • 레지스터는 CPU 내부 리소스이므로 A를 실행할 때 레지스터를 사용하고 B를 실행할 때도 레지스터를 사용한다면 함수 A가 B를 호출할 때 A가 레지스터에 기록한 지역 변수 정보를 B가 덮어씌어 문제가 될 수 있다.

레지스터의 저장과 복원

  • 레지스터에 지역 변수를 저장하기 전에 반드시 먼저 레지스터에 원래 저장되었던 초깃값을 꺼냈다 레지스터를 사용하고 다시 그 초깃값을 저장해야 한다.
  • 레지스터 초깃값은 함수의 스택 프레임에 저장된다.

프로그래머가 주의해야 할 점

  • 너무 큰 지역 변수를 만들면 안된다.
  • 함수 호출 단계가 너무 많으면 안된다.
  • 호출 과정이 완료되면 스택 프레임에 저장되어 있던 내용은 더 이상 사용되지 않고 무효화 된다. 프로그래머는 이미 사용이 끝난 스택 프레임 정보를 사용해서는 안된다.