Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Chapter3.5-3.9] 스터디 때 이야기 나왔던 주제와 자료들 #12

Open
ella-yschoi opened this issue Jul 15, 2024 · 0 comments
Assignees

Comments

@ella-yschoi
Copy link
Member

Chapter3.5: 메모리를 할당할 때 저수준 계층에서 일어나는 일

1. 링 버퍼(Ring Buffer)

  • p.248의 그림 3-57을 볼 때 주현 님이 링 버퍼 이야기를 하셨는데, 처음 들어보는 단어였다.
  • 찾아보니, 선입선출(FIFO) 방식으로 데이터를 저장하는 고정 크기의 원형 데이터 구조다.
  • 빠른 I/O 작업이 가능해 메모리를 효율적으로 사용할 수 있고, 연속적인 데이터 흐름 관리에 적합하다고 한다.

2. BIOS

  • 어쩌다 윈도우 BIOS에 대해 이야기가 나왔는지 모르겠지만..
  • 알고보니 Basic Input/Output System의 줄임말이었다!
  • 참고로 BIOS는 윈도우 기반 컴퓨터의 하드웨어 설정을 관리하는 인터페이스다.
  • 마우스는 사용 불가하고, 키보드로만 사용 가능한 텍스트 기반 단순한 UI다.

3. 시스템 호출의 종류: brk와 sbrk

  • 책에 나온 brk는 힙 영역을 늘리는 시스템 요청이다. 그리고 break의 약자로서 대부분 [브레이크] 라고 읽는다.
  • 복습 차 한번 더 언급하자면, 힙 영역을 확장하거나 축소하는 데 사용되고 동적 메모리 할당의 기반이 된다.
  • 이 외에도 sbrk(세그먼트 브레이크) 호출 또한 brk와 비슷한 역할을 하나, 증분 값으로 동작한다.
  • 조금 더 쉽게 표현하자면, brk는 프로그램의 데이터 세그먼트의 끝을 직접 지정한다.
  • 이와 다르게 sbrk는 현재 데이터 세그먼트 끝에서 얼마나 더 늘릴지(또는 줄일지)를 지정한다.

Chapter3.6: 고성능 서버의 메모리 풀은 어떻게 구현될까?

1. 메모리 반환 vs. 메모리 해제

  • 스터디 시간에 메모리 반환과 해제는 다른 말이라는 결론으로 났는데, 정확히 어떻게 다른지 알아보았다.

(1) 메모리 반환 (Return)

  • 시스템에 메모리를 돌려주는 것을 의미하지만, 반드시 완전한 해제를 의미하지는 않는다.
  • 운영체제 수준에서 사용되는 용어로, 프로세스가 사용하던 메모리 페이지를 운영체제에 반환하는 것을 말한다.
  • e.g. 프로세스가 종료될 때 사용하던 모든 메모리를 시스템에 반환하는 경우

(2) 메모리 해제 (Free)

  • 할당된 메모리를 완전히 풀어주고, 다시 사용 가능한 상태로 만드는 것을 의미한다.
  • 프로그래밍 언어 수준에서 사용되는 용어로, 동적으로 할당받은 메모리를 사용하지 않을 때 명시적 해제하는 것을 말한다.
  • e.g. C언어에서 malloc()으로 할당받은 메모리를 free()로 해제하는 경우

2. 메모리 풀과 AWS S3 싱글톤 패턴의 관계

  • 지수 님이 메모리 풀 구현과 AWS S3 객체 생성 시 싱글톤 패턴 사용이 유사한 것 같다는 이야기를 하셨다.
  • 즉, 간단한 메모리 풀을 구현할 때, 예를 들어 객체를 사용할 때마다 하나씩 꺼내어 사용하고, 사용이 끝나면 반환한다.
  • 이것을 AWS S3 객체 생성 시 싱글톤 패턴을 사용하는 것과 연결지을 수 있을까? 라고 Claude에게 물어보았다.
  • 결론적으로 두 개념은 리소스 관리와 최적화라는 측면에서 유사한 목적을 가지고 있다는 답변을 받았다. 일리있다.

(1) 메모리 풀

  • 목적: 메모리 할당 및 해제의 오버헤드 감소, 메모리 파편화 방지
  • 작동 방식: 미리 일정량의 메모리를 할당하고, 필요할 때 가져다 쓰고 반환
  • 장점: 빠른 메모리 할당, 메모리 누수 방지

(2) AWS S3 객체 싱글톤 패턴

  • 목적: 리소스 사용 최적화, 연결 관리 단순화
  • 작동 방식: 하나의 S3 클라이언트 객체를 생성하고 재사용
  • 장점: 연결 생성 오버헤드 감소, 리소스 사용 효율화

3. TLS(스레드 전용 저장소)와 자바스크립트

  • 책에서도 계속 언급하듯, TLS는 각 스레드에 대해 고유한 데이터 저장 영역을 할당하는 메커니즘이다.
  • 즉, 스레드 로컬 기능을 제공하기 위한 하부구조로서의 역할을 한다.
  • 그렇다면 자바스크립트는 싱글 스레드 언어니까, TLS 혹은 스레드 로컬 개념 자체가 없을까?
  • 반은 맞고 반은 틀리다.
  • 전통적인 자바스크립트 환경에서는 기본적으로 TLS나 스레드 로컬을 지원하지 않았다.
  • 하지만 요즘은 싱글 스레드 모델과 비동기 프로그래밍 특성에 맞는 대안적인 방법(async, closure 등)이 사용되고 있다.

Chapter3.7: 대표적인 메모리 버그

1. 역참조

(1) 역참조 의미

  • '역참조' 라는 단어를 들어보기는 했으나, 정확히 무엇인지 설명할 수 없어 알아보았다.
  • 역참조(Dereferencing)는 포인터나 참조를 통해 해당 메모리 주소에 저장된 실제 값에 접근하는 과정을 말한다.
  • 즉, 포인터가 가리키는 메모리 위치의 값을 읽거나 수정하는 작업이다.

(2) 역참조 활용

  • 주로 동적 메모리 할당된 데이터에 접근하거나, 간접적으로 변수를 조작하거나 읽을 때 사용된다.
  • C/C++에서는 책에서 자주 본 * 연산자를 사용해 역참조를 한다.
  • 하지만 잘못된 역참조는 segmentation fault 등의 오류를 발생시키므로 주의하여 사용해야 한다.

(3) 자바스크립트에서의 역참조

  • 다만, 자바스크립트와 같은 고수준 언어에서는 GC 등으로 자동 메모리 관리 기능을 제공한다.
  • 대신, 객체나 배열의 속성에 접근할 때 내부적으로 역참조와 유사한 작업이 일어나긴 한다.

(4) 역참조와 참조

  • 헷갈릴 것 같아 정리해본다.
  • 참조는 메모리 위치를 가리키는 것으로, 변수나 포인터가 특정 메모리 주소를 '참조'한다고 표현한다.
  • 역참조는 참조가 가리키는 메모리 위치의 실제 값을 얻는 과정으로, 포인터나 참조를 통해 실제 데이터에 접근한다.

2. Stack Overflow vs. Heap Overflow

(1) Stack Overflow

  • 스택 오버플로우는 우리가 잘 알다시피, 프로그램의 호출 스택이 할당된 메모리 공간을 초과할 때 발생한다.
  • 주로 과도한 재귀 호출, 큰 로컬 변수 할당, 무한 루프 내에서의 함수 호출 등이 원인이다.
  • 이는 정적 메모리 영역에서 발생하며, 일반적으로 (다행히도) 즉시 프로그램 종료를 유발한다.
  • 대부분 운영체제에서 쉽게 감지된다.

(2) Heap Overflow

  • 힙 오버플로우는 동적으로 할당된 메모리(힙)가 사용 가능한 공간을 초과할 때 발생한다.
  • 주로 메모리 누수 (할당된 메모리를 해제하지 않음), 과도한 동적 메모리 할당 등이 원인이다.
  • 이는 주로 동적 메모리 영역에서 발생하며, (불행히도) 즉시 오류가 발생하지 않고, 점진적 성능 저하를 유발한다.
  • 때문에 감지하기 어려울 수 있다.

3. perf

  • p.274 마지막 즈음의 perf는 메모리 누수를 추적할 수 있는 도구라고 한다.
  • 스터디 시간에 이걸 어떻게 읽냐는 이야기가 나왔는데 민경 님 말씀처럼 'performance' 라는 단어에서 비롯되었기에
  • [퍼프] 라고 읽는다고 한다. 깨알 토막 상식!
  • 크롬 개발자 도구 performance 탭으로 사이트 메모리 누수에 관해 알아볼 수 있다고 이야기가 나왔는데
  • 현재 작업 중인 사이트를 예시로 살펴보았다. 아직 뭐가 뭔지를 잘 모르겠어서 성능 작업 할 때 더 파보면 좋을듯 하다.
whosebook_performance.mp4

혼자 복습 겸 기록을 해보았는데, 여러분께도 도움이 되면 좋겠네요 🙏🏻

@ella-yschoi ella-yschoi self-assigned this Jul 15, 2024
@ella-yschoi ella-yschoi changed the title [Chapter 4] 07/13 스터디 때 이야기 나왔던 주제와 자료들 [Chapter3.5-3.9] 스터디 때 이야기 나왔던 주제와 자료들 Jul 15, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant