메모리 관리 이해하기

김지수·2023년 6월 19일
0

Computer Science

목록 보기
3/4

컴퓨터에서 메모리가 어떻게 관리되는지 이해하고, 다음장에서 자바스크립트 V8엔진의 메모리 구조와 어떻게 동작하는지 알아보려고 한다.

메모리 관리가 어떻게 동작하는지 알게되면 우리가 코드를 짤 때 어떻게 하면 성능을 높일 수 있는지에 대해서도 생각해볼 수 있을 것 같다.

메모리 관리(memory management)

우선 메모리라는 개념을 알고 있을 필요가 있다. 메모리란 무엇인가?
메모리는 컴퓨터에 어떤 연산을 수행할 때 사용되는 데이터, 주소, 결과 값 등을 잠시 기억하기 위해 사용하는 일종의 기억장치이다. 가장 좁은 의미로 "메인메모리"를 가리키며 전기적인 신호로 저장되기 때문에 속도가 매우 빨라 컴퓨터의 주기억장치(RAM)로 이용된다. 이 메모리는 각 프로세스마다 독립된 공간을 가지며 운영체제 또는 다른 프로세스 메모리 공간에 접근할 수 없다.

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

메모리 관리는 컴퓨터 메모리에 적용된 리소스 관리의 일종이다.
가장 단순한 형태로는 프로그램 요청이 있을 때, 메모리 일부를 해당 프로그램에 할당하고, 더 이상 필요하지 않을 때 나중에 다시 사용할 수 있도록 할당을 해제하는 것이다. 이는 하나 이상의 프로세스가 언제든 실행되는 고급 컴퓨터 시스템에 필수적이다.
https://ko.wikipedia.org/wiki/%EB%A9%94%EB%AA%A8%EB%A6%AC_%EA%B4%80%EB%A6%AC

스택(Stack)

스택은 정적 메모리 할당에 사용되며 후입선출(LIFO) 스택이다.

후입 선출이란?

출/입구가 하나 밖에 없어 가장 먼저 들어온 작업이 가장 나중에 실행되는 방식이다.

이러한 특성으로 스택에 데이터를 저장하고, 검색하는 프로세스가 매우 빠르다. (맨 위 블록에서 데이터를 저장하고 검색하기만 하면 됨)
그러나 스택에 저장되는 데이터는 유한하고 적적이어야 한다. 즉 함수의 실제 실행 데이터는 스택 프레임(stack-frame)에 저장된다. 각 프레임은 해당 함수가 실행되는데 필요한 데이터가 저장되는 블록이다.

ex)
어떤 함수가 실행될 때 넘겨진 인자, 함수에 선언된 변수 등이 스택의 맨 위 블록으로 푸시된다. 그리고 함수가 종료되면 스택에 푸시된 모든 변수가 지워진다.

다중 스레드인 애플리케이션인 경우 하나의 스레드당 하나의 스택을 가질 수 있다.
스택의 메모리 관리는 간단하며 운영체제(OS)에서 수행하며 스택에는 지역변수, 포인터, 함수 프레임을 저장한다.
스택 크기가 힙에 비해 제한되어있기 때문에 스택 오버플로우 오류가 발생할 수 있고, 대부분의 언어에서 스택에 저장할 수 있는 데이터 크기에는 제한이 있다.

힙(Heap)

힙은 동적 메모리 할당에 사용되며 스택과 달리 포인터(pointer)를 사용하여 힙에서 데이터를 조회해야 한다.
데이터를 조회하는 과정이 스택보다 복잡하여 느리지만 더 많은 데이터와 동적 크기의 데이터를 저장할 수 있다. (스택이 힙의 주소지를 가리키고, 그 주소지를 통해 실제 데이터에 접근하기 때문에 동적데이터를 저장할 수 있음)
힙에는 전역벽수, 객체와 같은 참조 타입, 문자열, 맵 그 외에 복잡한 데이터 구조를 저장한다.
응용 프로그램이 할당된 힙보다 더 많은 메모리를 사용하려고 시도하면 메모리 부족 오류가 발생할 수 있다.
일반적으로 힙에 저장 가능한 값의 크기에는 제한이 없다.

메모리 관리가 필요한 이유

하드 디스크와 달리 RAM은 무한하지 않다. 프로그램이 메모리를 해제하지 않고, 계속해서 사용한다면 메모리가 부족하여 오류가 발생하게 될 것이다. 대부분의 프로그래밍 언어는 자동 메모리 관리를 수행할 수 있도록 되어 있다.

가비지 컬렉션(Garbage Collection)

가비지 컬렉션은 사용하지 않는 메모리 할당을 해제하여 힙 메모리를 자동으로 관리한다. GC는 현대 언에서 가장 일반적으로 사용되는 메모리 관리 중 하나이며 프로세스는 종종 특정 간격으로 실행되어 일시 중지 시간이라는 약간의 오버헤드가 발생할 수 있다.
가비지 컬렉션을 사용하는 언어에는 JVM, JavaScript, C#, Golang, OCaml, Ruby 등이 있다.

  • Mark & Sweep GC: 추적 GC라고도 한다. "Active"상태인 개체를 면저 표시하고 다음 단계에서 살아 있지 않은 개체의 메모리를 해제하는 2단계 알고리즘이다. V8과 같은 JavaScript 엔진은 참조 카운팅(Reference counting) GC와 함께 사용한다.
  • Reference counting GC: 개체의 참조가 변경될 때마다 참조 카운트를 증감 시키고, 카운트가 0이되면 가비지 컬렉션이 수행된다.

참고

profile
백엔드 노드 개발자

0개의 댓글