방학 불태우기 4

김민석·2021년 7월 22일
0

방학

목록 보기
4/16

프로세스 메모리 구조


일반적인 프로세스의 메모리 구조는 위 그림과 같다.

영역별로 하는 역할은 다음과 같다.

stack 영역


함수의 매개변수, 함수에서 사용하는 지역변수, 리턴할 곳의 주소값을 포함한다.
함수 호출 시 생성되며, 함수가 끝나면 반환된다.

heap 영역

동적으로 메모리를 할당할 때 사용되는 영역이다.
대부분 메모리 주소값에 의해 참조되고 사용된다.
그림과 같이 힙과 스택은 같은 영역을 공유하는데, 힙은 아래에서 위로 스택은 위에서 아래로 쌓이게 된다.
쌓이다가 서로의 영역을 침범하게 되면 overflow 가 발생하는 것이다.

data 영역(BSS, GVAR)

전역변수, 정적변수, 배열, 구조체 등이 저장되는 영역이다.
BSS와 GVAR 영역은 초기값을 설정 하느냐 마느냐에 따라 달라진다.

text 영역

프로그램을 작성하는데 사용된 코드들을 포함한다.
일반적으로 한번 로딩하면 바뀌지 않는다.

Node.js의 프로세스 메모리

자바스크립트는 인터프리터 언어로 코드를 해석하고 실행하는 엔진이 필요하다.

V8 엔진을 통해 자바스크립트를 해석하고, 컴파일한다.

V8 엔진의 메모리 구조는 위 그림과 같다.

힙 메모리

V8 엔진은 힙 메모리에 객체와 동적 데이터를 저장며, 가비지 컬렉션을 발생시킨다.
세부적으로 살펴보면 new 영역은 새로 만들어진 객체를 저장하며 이 객체들은 짧은 생명주기를 가진다.
old 영역은 가비지 컬렉션이 두번 발생할 동안 new 영역에서 살아남은 객체들이 이동하는 영역이다.
large object 영역은 다른 영역의 제한된 크기보다 큰 객체들이 살고있는 영역으로 large object들은 가비지 컬렉터로 이동하지 않는다.
code영역은 실시간 컴파일러가 컴파일 된 코드들을 저장하는 곳으로 유일하게 실행 가능한 메모리가 있는 영역이다.

스택

프로세스마다 하나의 스택을 가진다.
스택은 메서드, 함수 프레임, 원시값, 객체 포인터 등의 정적 데이터가 저장된다.

가비지 컬렉션

프로그램이 사용 가능한 것 보다 더 많은 메모리를 힙에 할당하려고 한다면 메모리 부족 오류가 발생한다.
힙이 잘못 관리되면 메모리 누수가 발생할 수 있다.
따라서 V8엔진은 가비지 컬렉션을 이용해 힙 메모리를 관리한다.

가비지 컬렉션 기준

자바스크립트는 도달가능성 이라는 개념을 이용해 메모리를 관리한다.
도달 가능한 값들은 현재 함수의 지역변수와 매개변수, 전역변수 등이 있다. 이런 값들을 루트라고 부른다.
또한 루트가 참조하는 값이나 체이닝을 통해 루트에서 참조할 수 있는 값 역시 도달 가능한 값이 된다.
자바스크립트 엔진 내에서는 가비지 컬렉션이 끊임없이 동작하는데, 이 과정에서 모든 객체를 모니터링 하고 도달할 수 없는 객체는 삭제한다.

가비지 컬렉션에 사용되는 알고리즘은 참고 링크에서 자세히 설명하고 있다.

참고 : https://ui.toast.com/weekly-pick/ko_20200228
https://velog.io/@code-bebop/JS-%EB%A9%94%EB%AA%A8%EB%A6%AC-%EA%B5%AC%EC%A1%B0
https://ko.javascript.info/garbage-collection

리눅스 가상 메모리 관리 방식

가상메모리는 메모리를 관리하는 방법으로 프로그램을 실제 메모리에 올리는 것이 아닌 가상 메모리에 올리는 방식을 말한다.

실제 크기가 제한되어 있는 물리 메모리가 아닌 가상 메모리를 사용함으로써 훨씬 넓게 확장하여 사용할 수 있다.

가상메모리 장점

  • 논리적인 메모리 확장
    실제 물리 메모리 공간을 넓히는 것이 아닌 ram이나 디스크, 레지스터 등의 공간을 연속적으로 가상공간에 매핑하여 사용할 수 있다.
  • 프로세스 간 동일한 메모리 공간 제공
    사용자는 os가 제공해 주는 가상 메모리 공간만 신경쓰면 된다.
    즉, 다른 사용자 혹은 프로세스의 영역에 침범하지 않기 위해 실시간으로 파악할 필요가 없어서 더 효율적이다.
  • 메모리 관리의 효율성
    데이터 생성, 삭제, 수정 등의 동작이 자주 일어나게 되면 데이터들이 연속적으로 메모리에 저장되어 있기 보다는 다 분산되어 저장될 것이다.
    이런 상황에서 가상메모리를 사용하면 실제로 연속적이지 않은 데이터들을 논리적으로 연속적인 메모리 형태로 사용이 가능하다.

동작 과정

가상메모리는 페이지, 물리메모리는 프레임 이라는 단위로 관리된다. 프레임과 페이지는 동일한 사이즈를 가진다.
메모리를 효율적으로 사용하기 위해 페이징 기법을 사용하여 메모리를 관리한다.

실제 데이터들은 가상메모리에 존재하는 것이 아닌 물리메모리(보통 RAM 이나 디스크)에 존재한다.
가상 메모리를 통해 실제 데이터를 처리하기 위해서는 가상 주소를 물리 주소로 변환하는 과정이 필요하다. 이 과정을 위해 페이지 테이블이 존재한다.
물리적으로 떨어져 있는 메모리를 연속적으로 이용할 수 있는 것이 페이지 테이블을 통해 가능한 것이다.
더 자세한 동작 과정은 아래 링크를 참고한다.

참고 : https://wogh8732.tistory.com/395

process 객체

process 모듈은 require()를 사용하지 않고 Node.js 어플리케이션에 접근할 수 있는 전역객체이다.

프로그램과 관련된 정보를 나타내는 객체로 많은 속성과 메소드들이 시스템이나 운영체제와 밀접한 관련이 있다.

자바스크립트에는 존재하지 않으며 Node.js에만 존재하는 객체이다.

이 부분은 좀 더 알아봐야 겠다.

참고 : https://acstory.tistory.com/65
https://opentutorials.org/module/938/7189
https://runebook.dev/ko/docs/node/process

더 알아볼 것들

  • 자바스크립트 테스트 프레임워크
    jest
profile
김민석의 학습 정리 블로그

0개의 댓글