[번역] 메모리 관리

sooki_m·2024년 6월 17일

https://hacks.mozilla.org/2017/06/a-crash-course-in-memory-management/

  • 메모리 관리에 대한 단기 집중 코스
  • ArrayBuffers 와 ShareArraryBuffers 에 대한 인트로 카툰
  • Atomics를 사용하여 SharedArrayBuffers에서 경쟁 조건 방지

이러한 박스의 각각은 같은 사이즈이고, 정보의 특정한 양을 저자할 수 있다. 박스의 사이즈는 기계에 의해 결정된다. 이 사이즈를 “word size”라고 부른다. 이것은 주로 32bits 또는 64bits이다. 그러나 더 보기 쉽게 하자. 난 8bits 짜리 word size를 사용할 것이다.

만약 우리가 2라는 숫자를 이 박스 중 하나에 넣는다면, 우리는 쉽게 할 수 있다. 숫자는 바이너리로 표현하기 쉽기 때문이다.

만약 우리가 숫자가 아니라 H와 같은 문자를 넣으려면 어떻게 해야 할까?

우리는 그것을 숫자로 표현할 수 있는 방법이 필요하다. 그렇게 하기 위해서 우리는 “encoding”이 필요하다. UTF-8과 같은. 그리고 우리는 그것을 숫자로 바꿔줄 … 인코더 링과 같은 무언가가 필요하다. 그리고 우리는 그것을 저장할 수 있다.

만약 우리가 다시 그것을 박스에서 꺼내고 싶다면 우리는 그것을 “decoder”에 넣어 다시 H로 번역하면 된다.

자동 메모리 관리

만약 네가 자바스크립트 위에서 일한다면 너는 딱히 이런 메모리에 대해서는 생각하지 않아도 된다. 그것은 너에게 있어서 추상화된 개념이다. 이 말인 즉슨, 너는 메모리를 직접 건들이지 않아도 된다는 것이다.

대신, JS 엔진이 중간 역할자로 그것을 해준다. 그게 널 위해서 메모리 관리를 (대신) 해준다.

자 이제 리액트와 같은 JS 코드로 변수를 한 번 만들어보자.

JS 엔진이 해주는 일은 값의 바이너리 표현식을 얻을 수 있는 인코더를 운영하는 것이다.

그리고 그것은(JS 엔진은) 그 바이너리 표현식을 넣을 수 있는 메모리 공간을 찾을 것이다. 이 프로세스를 메모리 할당(allocating memory)이라고 부른다.

그런다음 엔진은 그 변수가 프로그램 어디에서든지 계속해서 여전히 접근 가능한지 아닌지 추적할 것이다. 그리고 그 변수에 더 이상 접근할 수 없으면 (사용되지 않는다면) JS 엔진이 새로운 값을 거기에 넣을 수 있도록 그 메모리는 회수될 것이다.

변수를 관찰하는 과정 - 문자열, 객체, 그리고 메모리에 들어갈 수 있는 다른 종류의 값들 - 과 더 이상 그 값이 참조되지 않을 때 그것을 지우는 것을 “garbage collection” (가비지 콜렉션) 이라고 부른다.

이 자동적인 메모리 운영은 개발자들이 하는 것을 더 쉽게 만든다.

그러나 또한 이것은 약간의 오버헤드를 추가한다. 그리고 그 오버헤드는 가끔씩 성능을 예측 불허하게 만든다.

수동 메모리 관리

메모리를 수동으로 관리하는 언어들은 어렵다. 예를 들어 C언어로 작성된 리액트가 메모리에서 어떻게 동작하는 살펴보자. (이것은 이제 웹 어셈블리와 함께라면 실제로 가능하다!)

C는 자바스크립트가 메모리에서 동작하는 것과 같은 추상화 레이어가 없다. 대신, 너는 그것을 메모리에서 직접 운영해야 한다. 너는 메모리에서 값들을 내려받을 수 있고 (직접) 메모리에 값들을 적재할 수 있다.

C나 다른 언어를 WebAssembly로 컴파일할 때 네가 사용할 수 있는 툴은 너의 웹 어셈블리에 몇 몇의 helper 코드를 추가할 것이다. 예를 들어 이것은 인코딩과 디코딩을 할 수 있는 코드를 추가할 수 있다. 이 코드를 “runtime environment”(실행 환경) 이라고 부른다. 이 실행 환경은 JS엔진이 JS를 위해서 하는 몇 몇의 일을 처리하는 데 도움을 줄 수 있다.

그러나 수동으로 언어를 운영하기 위해서, 런타임은 가비지 콜렉션을 포함하지 않을 것이다. 이것은 완전히 너에게 달렸다는 것을 의미하지 않는다. 수동으로 메모리를 관리하는 언어라고 할지라도, 너는 주로 언어 시행으로부터 몇 몇의 도움을 얻을 수 있다.

예를 들어, C에서 런타임은 “free list”라고 불리는 것에서 어떤 메모리 주소가 열려 있는지 계속해서 추적할 수 있다.

너는 런타임에게 너의 데이터에 맞출 수 있는 몇 메모리 주소를 찾아달라고 런타임에 요청할 수 있는 malloc (메모리 할당의 축약어) 함수를 사용할 수 있다. 이것은 “free list”로부터 이 주소를 받을 수 있을 것이다. 네가 데이터를 다 썼을 때, 너는 메모리 할당을 해제하기 위해 free 를 호출해야 한다. 이 주소는 free list에 다시 추가될 것이다.

너는 이 함수들을 불러야할 때를 알아야한다. 왜냐면 이걸 수동 메모리 관리라고 부르기 때문이다. - 네가 메모리를 스스로 운영하는 것이다.

이게 바로 모던 언어들이 자동 메모리 관리를 이용하는 이유다. - 휴먼 에러를 피하기 위해서. 그러나 이것은 퍼포먼스 비용이 따라온다. 다음 아티클에서 더 자세하게 설명하겠다.

profile
개발 up and down

0개의 댓글