정리/CS

메모리 관리

kimddakki 2022. 5. 24. 16:20
메모리 관리

 - 메모리 관리란 소프트웨어 응용 프로그램이 컴퓨터 메모리에 액세스 하는 방식을 제어하고 조정하는 프로세스이다. 

 - 소프트웨어가 컴퓨터의 대상 운영체제에서 실행될 때 다음을 위해 컴퓨터 RAM ( Random-access Memory )에

   액세스 해야 한다.

 

실횅해야 하는 자체 바이트 코드를 로드한다.
실행되는 프로그램에서 사용하는 데이터 값과 데이터 구조를 저장한다.
프로그램을 실행하는 데 필요한 모든 런타임 시스템을 로드한다.

 - 소프트웨어 프로그램이 메모리를 사용할 때 바이트로드를 로드하는 데 사용되는 공간 외에 스택 및 힙 메모리라는 두

   가지 메모리 영역을 사용한다.

 

스택 ( Stack : 지붕 위에 삐죽이 나와 있는 굴뚝 부분. )

 - 스택은 정적 메모리 할당에 사용 되며 이름에서 알 수 있듯이 후입선출 ( LIFO ) 방식을 사용한다.

 

후입선출의 특성으로 인해 조회가 필요하지 않으므로 스택에서 데이터를 저장하고 검색하는 프로세스가 
매우 빠르며 맨 위에 있는 블록에서 데이터를 저장하고 검색하기만 하면 된다.

그러나 이 말은 스택에 저장된 모든 데이터가 유한하고 정적이어야 함을 의미한다. (데이터의 크기는 컴파일 타임에 알려짐)

함수의 실행 데이터가 스택 프레임으로 저장되는 곳이다. ( 이 곳이 실제 실행 스택이다. ) 
각각의 프레임은 해당 기능에 필요한 데이터가 저장되는 공간 블록이다.
예를 들어, 함수가 새 변수를 선언할 때마다 스택의 최상위 블록으로 "푸시" 된다. 
그 다음 함수가 종료될 때마다 최상위 블록이 지워지므로 해당 함수에 의해 스택에 푸수된 모든 변수가 지워진다.
여기서 저장된 데이터의 정적 특성으로 인해 컴파일 시간에 결정할 수 있습니다.

다중 스레드 응용 프로그램은 스레드 당 스택을 가질 수 있다.

스택 메모리 관리는 간단하고 뚜렷하며 OS에서 수행합니다.

스택에 저장되는 일반적은 데이터는 지역 변수 ( 값 유형 또는 기본, 기본 상수 ), 포인터 및 함수 프레임 입니다.

스택의 크기가 힘에 비해 제한되어 있기 때문에 스택 오버 플로우 오류가 발생한다

대부분의 언어에서 스택에 저장할 수 있는 값의 크기에는 제한이 있다.

 

 

Heap

 - 힙은 동적 메모리 할당에 사용되며 스택과 달리 포인터를 사용하여 힙에서 데이터를 조회해야 한다.

힙은 동적 메모리 할당에 사용 되며 스택과 달리 프로그램은 포인터를 사용하여 힙의 데이터를 조회해야한다.

이 특성은 동적 크기의 데이터를 여기서 저장 할 수 있음을 의미하낟.

힙은 어플의 스레드 간에 공유 된다.

동적 특성으로 힙은 관리하기가 더 까다롭고 대부분의 메모리 관리 문제가 여기에서 발생하며 언어의
자동 메모리 관리 솔루션이 시작 된다.

힙에 저장되는 일반적은 데이터는 전역 변수 또는 객체, 문자열, 맵 및 기타 복잡한 데이터 구조와 같은 참조 유형이다.

어플이 할당된 힙보다 더 많은 메모리를 사용하려고 하면 메모리 부족 오류가 발생하는 곳이다.

일반적으로 힙에 저장할 수 있는 값의 크기에는 제한이 있다.
물론 어블 마다 할당되는 메모리의 상한선은 존재 한다@!!

왜 메모리 관리가 중요한가.

 - 하드 디스크 드라이브와 달리 RAM은 무한하지 않다. 프로그램이 메모리를 해제하지 않고 계속해서 메모리를

   소모하게 된다면 메모리가 부족하여 자체적으로 충돌이 나거나 더 심하게는 운영 체제가 충돌하게 된다. 

   따라서 소프트웨어 프로그램은 다른 프로그램과 프로세스의 메모리 부족을 유발하게 되므로 원하는 대로 RAM을

   사용 할 수 없게 됩니다. 따라서 대부분의 프로그래밍 언어는 소프트웨어 개발자가 이를 알아내도록 하는 대신

   자동 메모리 관리를 수행하는 방법을 제공한다.

 => 우리가 메모리 관리에 대해 이야기 할 때 우리는 주로 힙 메모리 관리에 대해 이야기 한다.

Manual memory management // 수동 메모리 관리

 - 언어는 기본적으로 메모리 관리를 하지 않으며 생성한 개체에 메모리를 할당하고 해제하는 것은 개발자 몫

 - Ex) C 및 Cpp은 malloc, realloc, calloc등 메모리 관리를 위한 메서드를 제공하고 free하며 프로그램에서

        힙 메모리를 할당 및 헤제할 수 있다.

 

Garbage collection(GC) // 가비지 컬렉터

 - 사용하지 않는 메모리 할당을 해제하여 힙 메모리를 자동으로 관리한다.

 - GC는 현대 프로그래밍 언어에서 가장 일반적으로 사용되는 메모리 관리 방법 중 하나이다.

Mark & Sweep GC 
Tracing GC라고도 하며 일반적으로 '활성'으로 참조되는 개체를 먼저 표시하고 
다음 단계엣허 활성이 아닌 개체의 메모리를 해제하는 2단계 알고리즘이다.
JVM에는 선택할 수 있는 다양한 GC 알고리즘이 있지만 
V8과 같은 JavaScript 엔진은 이를 보완하기 위해 참조 카운팅 GC와 함께 Mark & ​​Sweep GC를 사용합니다

Reference counting GC
이 접근 방식은 모든 객체는 참조 횟수가 변경 됨에 따라 증가하거나 감소하는 참조 횟수를 가져오고
참조 카운트가 0이 되면 가비지 수집의 대상이 되어 사라진다.

 

 

🚀 Demystifying memory management in modern programming languages

Let us take a look at how modern programming languages manage memory.

dev.to