c 언어와 관련된 메모리 이야기 (스택)

c 언어와 관련된 메모리 이야기 (스택)

오늘은 메모리 이야기를 조금 해보려고 한다.

거창하진 않다. 애초에 아는 게 쥐똥만큼이니까.

그냥 스택영역 영역에 대해서 이야기해 볼 거다.

자바를 주로 사용하면서도 c를 배운 내용은

이런 메모리에 대한 이해와, 메모리를 가지고

프로그래밍을 보는 관점을 위한 것이었으니까.

자바에서도 당연히 스택 영역 있고,

c에서도 크게 다르지 않다는 것을 느꼈다.

어찌 보면 당연한 말일 수 있다. 자바 자체가

c를 기반으로 한 c 계열의 언어니까.

스택 영역

스택 영역은 프로그램이 실행되면서 현재 실행

되고 있는 함수가 자신의 영역을 가지고 차곡차곡

쌓이는 메모리 영역이다.

즉 현재 실행 중인 함수들이 쌓이는 곳이라고 보면 된다.

스택이라는 자료구조 자체가 밑이 막혀 있고, 위에서만

데이터를 넣고, 뺄 수 있는 구조로 되어 있다.

그렇기 때문에 가장 늦게 들어온 데이터가

가장 빨리 나갈 수 있는 구조이기도 하다.

상자에 책을 넣는다고 생각해보면 된다.

위에서 하나하나 넣고, 빼려고 한다면

다시 마지막에 넣은 거부터 빼내야

맨 밑에, 처음에 넣은 책을 뺄 수 있다.

여기서 상자는 메모리 스택 영역, 책을 현재 실행 중인

함수라고 생각하면 편하다. 함수의 실행은 실제 함수

코드가 저장되어 있는 메모리 주소를 통해 그곳으로

점프해서 실행 되게 된다.

이때 실행된 함수는 고유의 영역을 가지고 스택에

쌓이게 된다. 그리고 실행이 종료되면 해당 함수를

호출한 쪽으로 스레드는 다시 돌아가게 되고

스택에서 삭제되게 된다.

이렇게 구현한 이유는 어찌 보면 당연할 수 있다.

어쨌든 c 프로그램은 메인 함수를 통해 실행해야 한다.

즉, 프로그램의 시작과 끝이 메인 함수여야 한다.

이는 다른 함수가 실행되고 있을 땐 메인 함수가

종료되면 안 되는 것을 의미한다.

그렇기 때문에 가장 먼저 실행된 메인 함수가

가장 늦게 종료되어야 하기에 스택 구조가

딱 맞다고 볼 수 있다.

그리고 스레드가 하나인 상태에서 프로그램을 실행할

때 역시 스택 영역의 구조대로 실행되어야 하는 것이

맞다.

현재 실행되고 있는 함수가 종료돼야 다시 다른

함수를 실행하는 것이 가능하니까, 현재 실행되고

있는 함수가 가장 위에 올라와야 한다.

그래야 종료 됐을 때 더 이상 저장할 필요가 없는

함수의 프레임을 삭제할 수 있기 때문이다.

그리고 이런 스택 영역에는 현재 실행 중인 함수가 쌓이지만

그 안에 들여다보면 지역변수, 반복, 조건문 등의 명령문들

역시 자리하고 있다.

지역변수 역시 스택 영역을 사용한다고 볼 수 있다. 각 자료형 마다

필요한 메모리 용량이 있기 때문에 스택 영역을 사용해 데이터를

저장한다고 볼 수 있다.

이렇듯 스택 영역은 사용할 메모리 용량이 컴파일 시 어느 정도

계산 가능한 요소들이 자리하게 된다. 지역 변수도 이미 선언

되어 있어 메모리 용량을 얼마나 사용할지 알고 있다.

그리고 스택 영역에 올라오는 데이터들의 특징은 자주

오르락, 내리락한다는 것이다.

반복문을 돌면서 천 번 호출되는 함수가 있다고 가정해보자.

그러면 이 함수는 스택 영역에 천 번 저장 됐다, 삭제 됬다

하게 되는 것이다.

그렇기 때문에 함수 안에 지역 변수들은 컴파일러가

초기화를 해주지 않는다. 그 이유는 너무 빈번하게

그 작업을 해야 하는 상황이 있으면 비효율 적이기 때문이다.

또, 스택 영역에 쌓이는 함수들은 고유의 영역을 가지고 있다.

해서 같은 이름의 변수를 선언 해 사용하는 것이 문제 되지

않으며, 주소를 넘기는 것이 아닌 값을 넘기게 되면

call by value 가 일어나 값을 복사해 넘기게 된다.

물론 & 연산자를 통해 주소를 넘길 수도 있다.

이 경우 해당 변수의 포인터를 넘기게 되는 것이고,

이를 받는 쪽에서는 *를 붙여 받게 된다.

어쨌든 함수는 하나의 고유한 영역이며, 실행될 때마다

스택 영역에 쌓인다는 것을 잊지 말자.

그리고 스택 영역은 컴파일 시 얼마나 사용할지 어느 정도

알기 때문에 크기가 늘어나도 힙 영역만큼 유동적이지는 않다.

사이즈 역시 힙 영역에 비해 상대적으로 작다.

그럼 정말 불친절한 나만 읽으려고 하는 정리는

이 정도로 마치면 될 듯하다.

from http://win-fly.tistory.com/13 by ccl(A) rewrite - 2021-09-21 21:27:14