ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 스택 프레임 & 재귀함수
    C언어 2020. 3. 13. 06:00

    OS는 하드웨어 자원 중 하나인 메모리를 하나의 논리적 메모리로 관리한다. 이렇게 관리하는 것이 가상메모리 시스템이다. 이런 가상메모리는 내부적으로 커널영역과, 유저영역이 나뉘어 지며 사용자에게 허용되는 영역은 유저영역이다. 유저영역은 내부적으로 여러 공간으로 나뉘어서  관리되고 있다. 이번 포스트에서는 그중 스택영역에 대해서 설명 할 것이다.

     

    스택 프레임

    함수내부의 즉 스코프 안의 영역에서 선언 되는 변수, 매개변수는 자동변수이며 변수의 메모리할당, 반환의 과정을 OS가 자동으로 관리해 준다고 하였다. 또한 이러한 자동 변수를 관리하는 메모리가  바로 Stack 영역의 메모리인 것이다. 따라서 프로그래머라면 Stack 메모리가 어떻게 관리되는지 정확이 이해할 수 있어야 한다. 이러한 관리 형식을 스텍 프레임 이라고 칭한다.

    위의 자료를 보면 스택 자료 구조가 어떠한 구조로 관리되는지 쉽게 알 수 있다. 

    1. 스택 영역의 메모리는 김치 냉장고와 같다. 즉 가장 먼저 넣은 요소를 가장 나중에 뺄 수 있다. 반대로 최근에 넣은 자료는 바로 뺄 수 있다.

    2. 함수가 시작되면 한정된 스텍 메모리의 사용이 가능 하다. 따라서 주소는 한정 된 주소로 부터 시작되기 때문에 사용가능한 최대 주소부터 주소가 감소하는 형태로 자료를 Push 한다. 반대로 자료를 Pop 할 때는 사용 가능한 주소가 늘어남에 따라 주소가 증가한다.

    3. 스텍 메모리에 자료가 Push 되는 순서는 절차상의 흐름에 따라 Push 되며 만약 함수 호출이 일어날 경우 새로운 함수의 영역이 기존 스텍 메모리 안에 열리며 새로 열린 함수 매개변수가 가장 먼저 Push 된다. 이때 매개변수의 오른쪽 요소부터 Push 된다. 함수가 종료 될 때 즉 스코프가 닫힐 때는 종료되는 함수 영역의 스텍 메모리 값이 Pop 된다. ( 사라진다라고 보면 됨 )

    4. 포인터, 정적변수, 전역변수의 경우 스택 메모리와 다르게 관리하며, 추가적으로 포인터 변수가 가리키는 주소와 연관 시켜 생각한다. 이때 동적할당 받은 주소를 포인터 변수에 넣을 때 동적할당 받은 메모리의 주소를 따로 생각해야 하며 포인터 변수와 동적할당 받은 메모리의 주소는 매핑시켜 스텍 메모리를 생각 해야한다. 

    5. 배열의경우 스택이 올라갈 수록 메모리 주소가 감소하는 구조를 가지기 때문에 배열의 첫번 째 요소 [0] 는 해당 스택으로 Push 될때 가장 위에 올라간다.

     

    스택 메모리는 위와 같은 특성을 가진다. 프로그램을 작성 할 때 에는 스텍 메모리를 직접 그림으로 그리면서 프로그램이 가지는 흐름을 따라가면 프로그래밍 실력 향상에 도움이 된다. 따라서 프로그램에서 메모리가 어떻게 관리 되는지 꼭 체크하며 작성 한다.

     

    + 내용 추가

    해당 스텍 프레임 구조에서 함수가 함수를 Call 할 경우 Stack 메모리에 쌓일 때 호출 하는 함수가 넘겨준 매개변수가 쌓이는 건 알것이다. 여기서 추가적으로 호출자 함수의 주소가 같이 Stack 에 쌓이는 걸 기억하자 만약 피 호출자 함수가 본인의 기능이 끝나고 반환 될 때 다시 호출자 함수의 위치로 돌아가야 하는데 이때 필요한 게 호출자 함수의 주소이다. 따라서 호출자 함수의 주소가 같이 스텍 메모리에 쌓이게 된다.

     

     

    'C언어' 카테고리의 다른 글

    메모리 구조  (0) 2020.03.16
    C 프로그램의 동작 과정  (0) 2020.03.16
    포인터의 이해  (0) 2020.03.07
    배열의 이해  (0) 2020.03.05
    메모리 복사  (0) 2020.03.05

    댓글

Designed by Tistory.