프로세스 메모리

KwonKusang·2021년 7월 22일
0

1. 프로세스의 메모리 구조

프로세스는 일반적으로 CPU에 의해 처리되는 사용자 프로그램, 시스템 프로그램 즉 실행중인 프로그램을 의미하며, 작업(Job) 태스크(Task)라고도 합니다.

위와 같은 메모리 구조를 프로세스 하나당 하나씩 존재한다.

  • stack 영역
    프로그램이 자동으로 사용하는 메모리 영역으로 함수 호출과 관계되는 지역변수와 매개변수가 저장된다. 함수 호출 시 생성되며, 함수가 끝나면 반환된다. stack 사이즈는 각 프로세스마다 할당되지만 프로세스가 메모리에 로드될 때 stack 사이즈가 고정되어 있어 런타임 시 stack 사이즈를 바꿀 수 없다. 명령 실행 시 자동으로 증가 또는 감소하기 때문에 보통 메모리의 마지막 번지를 지정한다.

  • heap 영역
    필요에 의해 메모리를 동적으로 할당할 때 사용하는 메모리 영역으로 동적 메모리 영역이라고 부른다. C 에서 malloc() calloc() 등의 함수를 사용하여 메모리 크기를 할당할 수 있으며, 메모리 주소 값에 의해서만 참조되고 사용되는 영역이다.

stack overflowheap overflow

stack영역과 heap영역은 같은 공간을 공유한다. heap이 메모리의 낮은 주소부터 할당되면 stack은 높은 주소부터 할당되는 식이다. 그래서 각 영역이 상대 공간을 침범하는 일이 발생할 수 있는데 이를 각각 stack overflow, heap overflow 라고 한다.

Node.Js V8 엔진의 메모리 구조

힙 영역

힙 영역은 참조형 데이터의 실체(배열, 객체)와 동적 데이터(배열, 객체에 사용된 리터럴 데이터)가 저장되는 장소이다. 전체 메모리 영역에서 대다수를 차지하고, 더 작은 세그먼트들이 모여서 만들어진 집합이다. 이 중에서 New 영역Old 영역이 가비지컬렉션(GC)의 대상이 된다.

  1. New 영역 (Young Gen.)
    최근에 만들어진 데이터가 저장되는 장소이며 Minor GC(=Scanvenger)의 대상이다. Old 영역에 비해 매우 작으므로 가비지컬렉션이 매우 빈번하게 발생된다.

  2. Old 영역 (Old Gen.)
    Minor GC에서 살아남은 객체들은 Old 영역으로 이동되며, 이후에는 Major GC에 의해 관리된다. 이 영역은 다시 세부적으로 Old 포인터 영역,Old 데이터 영역로 나눠진다.

  3. 라지 오브젝트 영역
    다른 영역으로는 감당하지 못하는 매우 큰 객체들이 존재한다. 해당 영역의 객체들은 가비지 컬렉터로 이동되지 않는다.

가비지 컬렉션(GC)의 동작 방식

Young 영역과 Old 영역은 서로 다른 메모리 구조로 되어 있기 때문에, 세부적인 동작 방식은 다르다. 하지만 GC가 실행됨에 있어 공통된 두 가지의 단계가 있다.

  1. Stop The World

    Stop The World는 가비지 컬렉션을 실행하기 위해 애플리케이션의 실행을 멈추는 작업이다. GC가 실행될 때는 GC를 실행하는 쓰레드를 제외한 모든 쓰레드들의 작업이 중단되고, GC가 완료되면 작업이 재개된다. 당연히 모든 쓰레드들의 작업이 중단되면 애플리케이션이 멈추기 때문에, GC의 성능 개선을 위해 튜닝을 한다고 하면 보통 stop-the-world의 시간을 줄이는 작업을 하는 것이다.

    V8의 가비지 컬렉팅은 프로그램 실행 스레드와 다른 스레드에서 이뤄지기 때문에, 프로그램 실행에 영향을 미치지 않는다.

  2. Mark and Sweep
    Mark - 사용되는 메모리와 사용되지 않는 메모리를 식별하는 작업
    Sweep - Mark 단계에서 사용되지 않음으로 식별된 메모리를 해제하는 작업

    Stop The World를 통해 모든 작업을 중단시키면, GC는 스택의 모든 변수 또는 Reachable 객체를 스캔하면서 각각이 어떤 객체를 참고하고 있는지를 탐색하게 된다. 그리고 사용되고 있는 메모리를 식별하는데, 이러한 과정을 Mark라고 한다. 이후에 Mark가 되지 않은 객체들을 메모리에서 제거하는데, 이러한 과정을 Sweep라고 한다.

GC 수행 방식

참조가 있는 객체와 참조가 없는 객체가 존재한다. 가비지 컬렉션은 루트에서 시작하여 참조된 객체들을 Mark한다. 참고가 없는 객체들은 GC의 대상이 되어 Sweep 된다. 추가적으로 스위핑이 일어난 다음, Compact(압축)하여 새 객체들에 대한 할당 성능을 증가시킨다.

가상 메모리

가상 메모리는 메모리를 관리하는 방법의 하나로, 각 프로그램에 실제 메모리 주소가 아닌 가상의 메모리 주소를 주는 방식을 말한다.

가상 메모리를 사용하는 이유

  1. 논리적으로 메모리를 확장하여 사용 할 수 있다.
    프로그램이 실행되면 프로그램이 메모리에 올라간다. 여러 프로그램을 한번에 실행시키기도 하고 메모리의 용량보다 큰 프로그램도 존재한다. 이때, 가상 메모리를 사용하여 부족한 물리메모리를 가상 메모리가 충족시켜준다. 가상 메모리의 실제 공간은 하드디스크와 RAM이다.

  2. 프로세스들에게 동일한 메모리 공간을 제공해 줄 수 있다.
    모든 프로세스에 동일한 메모리 공간을 제공하고 나머지는 OS가 관리하도록 하는것이 효율적이다.

  3. 메모리 관리에 효율적이다.
    가상메모리를 이용하면 연속적이지 않은 메모리를 논리적으로 연속적인 메모리 형태로 사용가능하다.

페이징 시스템(Paging System)

하나의 프로세스에서 특정 시간 동안 쓰는 메모리 영역은 아주 일부분이다. 일부분만 실제 물리 메모리에 올려놓고 쓰자는 것이 가상 메모리의 컨셉이다.

가상 메모리의 페이징 시스템

출처

profile
안녕하세요! 백엔드 개발자 권구상입니다.

0개의 댓글