스택 프레임(stack frame)에 대해 알아보자
스택 프레임(stack frame)이란?
스택 프레임(Stack Frame)이란 함수가 호출될 때, 그 함수만의 스택 영역을 구분하기 위하여 생성되는 공간이다.
메모리의 스택(stack) 영역은 함수의 호출과 관계되는 지역 변수와 매개변수가 저장되는 영역을 말하며,
스택 영역은 함수의 호출과 함께 할당되며, 함수의 호출이 완료되면 소멸한다.
함수가 호출되면 스택에는 함수의 매개변수, 호출이 끝난 뒤 돌아갈 반환 주소값, 함수에서 선언된 지역 변수 등이 저장되며, 이렇게 스택 영역에 차례대로 저장되는 함수의 호출 정보를 스택 프레임(stack frame)이라고 한다.
이러한 스택 프레임 덕분에 함수의 호출이 모두 끝난 뒤에, 해당 함수가 호출되기 이전 상태로 되돌아갈 수 있는 장점이 있다.
후입선출(LIFO, Last-In First-Out) 방식으로 동작한다.
스택은 푸시(push) 동작으로 데이터를 저장하고, 팝(pop) 동작으로 데이터를 인출한다.
스택 오버플로우(stack overflow)
스택 영역에는 정해진 크기가 있는데, 그 이상 함수의 호출이 쌓이는 상황을 말한다.
주로, 재귀함수 호출이 무한히 반복되는 경우 발생하는 오류이며 해당 오류가 발생한다면 프로그램은 스택 오버플로우에 의해 강제 종료된다.
메모리 누수에 대해 알아보자
메모리 누수(memory leak)란?
컴퓨터 프로그램이 필요하지 않은 메모리를 계속 점유하고 있는 현상이다.
해당 현상이 발생하는 원인은 메모리를 할당한 뒤 반환하지 않는 것이 누적되고
더 이상 불필요한 메모리가 해제되지 않으면서 메모리 할당을 잘못 관리할 때 발생한다.
메모리 누수 현상이 발생되면 시간이 지남에 따라 남은 메모리 자원이 고갈되어 느려지거나, 렉걸림 현상이 발생하며
메모리가 완전히 고갈된다면 오류가 발생할 수 있다.
따라서, 메모리 누수는 심각한 오류를 불러일으킬 수 있으므로 동적할당 시 주의하여 관리해야하며이에 따른 디버깅 방법을 이용하여 잘 관리할 수 있도록 하자.
아래는 관련 내용 정리해둔 사이트 주소를 작성해두었다.
[디버깅] 메모리 누수와 점검하는 방법 소개
소개 Unmanaged Code인 C++은 메모리 할당과 해제를 개발자가 직접 해주어야 합니다. 메모리를 할당하고 해제를 하지 않으면, 그대로 메모리가 점유되기 때문입니다. 그런데 메모리 누수는 어떻게 점
luckygg.tistory.com
[프로그래머가 디버깅할 때 참고하면 좋은 내용]
Windows 10 메모리 누수를 해결 하는 방법 | Dell 대한민국
증상 메모리 누수란 애플리케이션으로 인해 발생하는 Windows 메모리 손실을 의미합니다. 이 문제는 애플리케이션이 보통 사용하는 수준 이상의 RAM을 사용하여 시스템이 기본 작업을 수행함에 있
www.dell.com
[유저가 메모리 누수 프로그램을 정리할 때 참고하면 좋은 내용]
쓰레기 수집에 대해 알아보자
쓰레기 수집(garbage collection 가비지 컬렉션, GC)
위와 같은 메모리 누수 현상이 발생되는 것을 방지하고자, 쓰레기 수집(garbage collection 가비지 컬렉션, GC) 기능을 제공한다.
이는 메모리 관리 기법 중의 하나로, 프로그램이 동적으로 할당했던 메모리 영역 중 필요없게 된 영역을 해제해주는 기능을 한다.
쓰레기 수집은 동적 할당된 메모리 영역 가운데 더 이상 사용할 수 없게 된 영역을 탐지하여 자동으로 해제하는 기법이다. 더 이상 사용할 수 없게 된 영역이란, 어떤 변수도 가리키지 않게 된 영역을 의미한다.
이는 작동 방식에 따라 분류되며, 자세한 내용은 나무위키를 참조하면 된다.
https://namu.wiki/w/%EC%93%B0%EB%A0%88%EA%B8%B0%20%EC%88%98%EC%A7%91
추적 기반 쓰레기 수집(Tracing Garbage Collection)
프로그램을 실행하다가 특정한 타이밍에 현재 할당된 모든 메모리를 조사하여 그것이 현재 접근 가능한지 불가능한지 분류한 뒤, 접근이 불가능한 메모리를 쓰레기라고 간주하여 해제시키는 방식이다.
보통 항상 접근 가능한 메모리를 root라고 하는데, 여기서부터 검사를 시작하여 메모리가 참조하는 메모리를 확인하는 것을 반복하여 접근 가능/불가능을 나누게 된다.
mark-and-sweep 방식이 앞서 설명한 내용과 같은 방법으로 작업을 수행하는데,
이 방법은 프로그램 실행 중 적당한 타이밍에 GC를 실행시켜 접근 가능한 메모리에 마킹(mark)을 한 후 마킹이 안 된 메모리는 전부 할당 해제(sweep)하는 방식이다.
이 방식대로면 부가적인 작업 없이도 접근 가능/불가능을 완벽하게 분류해서 해제하는 것이 가능하지만, 중간에 메모리가 변경되면 마킹을 다시 해야하기 때문에 프로그램을 통째로 정지(stop-the-world)시켜야 한다. 이 때문에 이 방식을 채택하면 프로그램이 실행되는 도중에 잠깐 멈추는 시간이 생긴다.
따라서, 실시간으로 빠르게 동작해야 하는 프로그램에서 뚝뚝 끊기는 큰 단점이 있다.
이 단점을 해결하기 위해서 조금씩 조금씩 수집을 하거나(점진적), 객체의 사용 시간을 계산해 다른 영역으로 나누어 수집하는 방식(세대별)을 사용하게 된다.
가장 많이 사용되는 쓰레기 수집 기법이다. (대부분 경우에 다른 수식어 없이 쓰레기 수집이라고 언급되면 이 방식을 말하는 것으로 봐도 무방하다고한다)
점진적 쓰레기 수집(Incremental Garbage Collection)
마킹과 해제를 한번에 하지 않고 여러 번에 걸쳐서 수행하는 방식을 말한다.
해당 방식을 이용하면 시간은 더 오래 걸릴 수 있지만, 한번 GC를 수행할 때 프로그램이 정지하는 시간은 줄일 수 있다.
메모리 단편화에 대해 알아보자
메모리 단편화란?
RAM에서 메모리의 남은 공간이 충분히 존재하나, 작은 조각으로 나뉘어져 사용이 불가능한 상태를 말한다.
메모리 단편화에는 내부 단편화와 외부 단편화로 나뉜다.
내부 단편화(Internal Fragmentation)
메모리를 할당할 때 프로세스가 필요한 양보다 더 큰 메모리가 할당되어서 프로세스에서 사용하는 메모리 공간이 낭비 되는 상황
외부 단편화(External Fragmentation)
메모리가 할당되고 해제되는 작업이 반복될 때 작은 메모리가 중간중간 존재하게 된다. 이 때 중간중간에 생긴 사용하지 않는 메모리가 많이 존재해서 총 메모리 공간은 충분하지만 실제로 할당할 수 없는 상황
위 문제를 해결하는 방법에는 여러 기법이 있다.
페이징(Paging)기법 / 가상메모리사용, 외부 단편화 해결, 내부 단편화 존재
페이징 기법을 사용하면 연속적이지 않은 공간도 활용할 수 있기 때문에 외부 단편화 문제를 해결할 수 있다.
대신 페이지 단위에 알맞게 꽉채워 쓰는게 아니므로 내부 단편화 문제는 여전히 있다.
세그멘테이션(Segmentation)기법 / 가상메모리사용, 내부 단편화 해결, 외부 단편화 존재
프로세스가 필요한 메모리 만큼 할당해주기 때문에 내부단편화는 일어나지 않으나 여전히 중간에 프로세스가 메모리를 해제하면 생기는 구멍, 즉 외부 단편화 문제는 여전히 존재한다.
메모리 풀(Memory Pool)
메모리의 할당, 해제가 잦은 경우에 메모리 풀을 쓰면 효과적이다.
미리 할당해놓고 사용하지 않는 순간에도 계속 할당해놓으므로 메모리 누수가 있는 방식이다
'프로그래밍' 카테고리의 다른 글
컴파일 과정에 대한 설명 (0) | 2022.06.28 |
---|
댓글