[CS] GC, 메모리구조, OS

devAnderson·2022년 5월 19일
0

CS

목록 보기
1/5

🚍 0. 정리의 이유

최근 기술 면접들을 보는 중, 한 기업에서 자료구조와 알고리즘과 같은 기초 CS 지식을 물어보는 경우가 있었다. 슬프게도, 거진 대부분의 내용에 대해서 답변을 제대로 하지 못했다고 스스로 판단하고 있다. 차라리 아예 몰랐다면 모를까, 전에 한번 공부했다고 생각했는데 전부 다 까먹어서 대답하지 못한 건 큰 실책이다. 지식적 부끄러움의 경험을 다신 잊지 말자는 절치부심의 마음으로 항상 이 첫번째 헤더는 유지하면서 매일 CS 공부를 조금씩 정리하도록 한다.

🚍 1. GC

GC의 기본설명

개발을 하다 보면 메모리 공간을 확보한 후 데이터가 저장되는 일이 빈번해진다. 그런데 이때, 더이상 아용되지 않는 데이터에 대해서는 메모리를 해제해야 한다. C언어는 free() 라는 함수를 호출해 직접 메모리를 해제할 수 있지만 자바스크립트에서는 개발자가 직접 해체하지 않고 가비지 컬렉터가 불필요한 메모리를 알아서 정리하여 메모리 누수를 방지한다.

보통 객체 데이터가 저장되는 heap 영역은 크게 2가지의 형태로 분리되어 가비지 컬렉터에 의해 관리된다.

  1. Young 영역

새롭게 생성된 객체가 할당되는 영역이다. 단기적으로 사용되고 사라지는 목적으로 저장되는 객체 데이터로, Minor GC에 의해 관리된다. 단기적으로 사라지는 변동성있는 데이터가 저장되는 공간이기 때문에 상대적으로 크기가 작다.

Young 영역은 크게 1개의 Eden 영역과, 2개의 Survivor 영역으로 나누어진다. Eden 영역은 새로 생성된 객체가 할당되는 영역이고, Survivor 영역은 최소 1번 이상 수거되지 않고 남아있었던 데이터가 존재하는 영역이다.

  1. Old 영역

장기적으로 유지되는 객체 데이터 공간으로 오랜시간동안 도달가능성을 유지하기 때문에 가비지가 적게 발생하는 영역이다. Major GC에 의해 관리된다. 상대적으로 Young 영역에 비해 공간이 크다.

특이한 점은, Old 영역에서 필요에 따라 Young 영역에 저장된 데이터가 필요할 때가 있을 것이다. 이 때, 만약 Minor GC에 입장에서 본다면 Young 영역의 가비지를 판단할 때 Old 영역이 참조하고 있어서 사용할 수 없는지 아닌지를 확인하기 위해 모든 Young 영역을 탐색하는 것은 비효율적이기 때문에 어떤 영역이 참조되는지를 확인하기 위한 512 byte의 참조 카드테이블이 존재한다.

스크린샷 2022-05-19 오전 10 35 41

GC의 동작방식

Minor GC와 Major GC의 행동방식은 서로 차이가 있지만 공통적인 2가지의 단계가 존재한다.

  1. Stop The World

    가비지 컬렉터가 실행되기 위해 애플리케이션 실행을 일시적으로 멈추는 단계를 뜻한다. 이 때 GC가 실행되는 쓰레드를 제외한 모든 쓰레드들의 작업은 중단된다.

  2. Mark and Sweep

    Mark란 변수들의 도달 가능성을 객체의 루트부터 시작하여 차례대로 스캔해보는 작업을 뜻한다. 이후, 힙의 메모리 공간을 확인해서 마킹되지 않은 메모리 공간 영역이 있다면 이것을 메모리로부터 해제하는데 이 과정을 Sweep이라고 한다.

위에서 언급했듯, Minor 영역은 eden 영역과 survivor 영역으로 나뉘게 되는데, eden 영역에 일차적으로 데이터가 저장되다가 이 공간이 가득 차게 되면 Minor GC가 작동하여 더이상 reachable하지 않은 데이터들을 제거하고, 살아남은 대상들은 survivor 영역으로 옮기게 된다.

이후, survivor 영역도 가득 차게 된다면 Old 영역으로 이동하게 된다. (promotion)

참고로, Young 힙 영역에 저장되는 데이터들은 자신이 얼마만큼 살아남았는지에 대한 데이터 정보를 객체 헤더 부분에 카운팅하는데 이것을 age라고 부르며, Minor GC는 이 age를 보고 promotion의 여부를 결정하게 된다.

또한, Eden 영역은 빠르게 데이터가 들어갔다가 사라지는 영역이닌 만큼, 현재 저장가능한 공간이 어디인지를 확인할 수 있어야 한다. 이것을 bump the pointer 라고 하며, Eden 영역의 가장 마지막으로 할당된 객체 메모리 주소를 캐싱하고 있다. 이를 통해 불필요하게 eden 영역을 전체 확인할 필요 없이 인덱싱처럼 캐싱된 메모리 주소를 찾아가 그 다음으로 저장할 수 있게 하여 빠른 메모리 할당을 가능하게 한다.

🚍 2. 메모리의 구조

스크린샷 2022-05-19 오전 11 02 39

메모리란 사람의 두뇌처럼 컴퓨터가 데이터를 저장할 수 있는 공간을 뜻한다. 공간의 차지하는 형태는 위의 이미지와 같다.

참고로, 공부를 하면서 항상 햇갈릴 수 있는 용어가 바로 저 "stack" 인데,
물어볼 때에 stack이 메모리에서 말하는 stack인지 자바스크립트의 실행단위인 stack frame인지, 자료구조에서의 stack인지 잘 구분하고 말해야 한다.

  1. OS karnel space : 운영체제 시스템이 저장되는 공간을 뜻한다.

  2. stack : 지역변수와 매개변수와 같은 환경 레코드의 데이터가 들어가는 공간이다. 함수가 평가되는 컴파일 시점에 크기가 결정된다. 만약 재귀함수가 종료시점이 없이 계속 이어지게 된다면 지속적인 함수의 지역변수와 매개변수를 저장하기 위한 스텍 영역이 늘어나게 되므로 stack overflow가 쉽게 발생한다. 형태는 콜스텍에서 공부했던 것처럼 LIFO 형태의 자료구조로 되어있는 영역이다.

  3. heap : 프로그래머가 필요할 때 사용하는 가변영역으로, 런타임때 크기가 결정된다. 즉, 사용자에 의해 메모리 공간이 동적으로 할당되고 해제된다.

  4. BSS : 아직 초기화되지 않은 변수를 저장하기 위한 공간이다

  5. Data : 전역적인 변수로 모든 영역에서 접근 가능한 메모리 공간이다. 프로그램이 시작되는 순간 할당되며 프로그램이 종료되면 소멸한다.

  6. Text : 프로그램 명렁 코드 자체를 저장하는 영역으로, 16진수나 2진수로 되어있다. CPU의 코드영역에 저장된 명령어를 가져다가 하나씩 처리한다.

여기서 이미지적으로 보면 스택영역 ( 매개변수와 지역변수가 저장되는 공간 ) 과 힙영역 ( 변동되는 객체 바인딩 데이터가 저장되는 공간 ) 은 서로 방향성이 마주하면서 저장되고 있다. 만약, 두 영역이 계속 넘처 흘러서 더이상 저장할 공간이 사라지게 된다면 Stack Overflow가 발생하게 된다.

🚍 3. OS란

OS란 컴퓨터의 하드웨어적 자원과 소프트웨어적 자원을 효율적으로 운영 관리하여 시스템이 원활하게 돌아갈 수 있도록 관리해주는 기능을 담당한다.

예를 들어, 크롬 브라우저라는 프로그램을 실행한다고 가정했을 때, 사실 이 프로그램은 수많은 CLI 명령어로 이루어진 논리 체계이다. OS는 이 명령어를 보고 변환, 해석한 뒤 컴퓨터 내에 존재하는 하드웨어적인 자원과 소프트웨워적인 자원들을 참조하여 해당 프로그램이 실행될 수 있도록 도와주는 역할을 한다.

즉, OS의 목적은 컴퓨터의 리소스를 할당하고 체크하는 실행 관리자 역할을 한다.

대표적으로 아래와 같은 역할이 존재한다

  • 프로세스 관리
  • 입출력장치에 관한 자원 관리
  • 자원의 스케쥴링
  • 시스템 오류 검사와 복구
profile
자라나라 프론트엔드 개발새싹!

0개의 댓글