section 7 part 2
아니 개 복잡하잖아 실제로 프로덕션 들어가면 더 복잡하고 더 방대할거 아니야 아니?
대용량 buffer
- 거대 버퍼 무단 할당 서버 환경 제약
- 1 기가 바이트 10억 바이트 1e9 exponent지수 0이 9개
- 스케일 컨트롤 서버증설: 스케일 아웃
- 코드 상 버퍼 생성은 가상공간이 아니라 물리적인 램을 점유하는 것
- 자바스크립트 데이터는 v8엔진으 메모리 제한 1.4기가바이트 내외
- 하지만, 버퍼는 off heap memory
- 운영 체제의 순수 빈 공간을 직접 사용
OOM Out of memory crash
- 필수 여유공간 headroom을 20~30%
- buffer.fill() 내장 method, js 엔진 표면이 아닌 내부 C++레벨에서 동작
- fill method 역시 main thread를 멈춰 세우는 동기 sync작업, anti pattern
- c++ 함수로 작업 처리 시간을 극단적으로 압축
- 병목으 ㅣ최소화 -> 정상상태로 즉각 복귀
- node.js buffer alloc의 상한선 4gb(32bit)
allocUnsafe()
- 메모리 초기화 과정 완전 생략
- 0으로 지우는 수고 없이 날 것 그대로 던져줌
- 메모리 노출 취약점 memory disclosure vulnerability
- chunk 대용량 데이터으 실시간 전송 조각
- allocUnsafe사용시 빈 공간 반환을 치명적 데이터 유출을 초래
- 메모리 초기화& system call의 생략 CPU 자원확보
- allocUnsafe가 진짜 빠른 이유는 node.js의 캐싱 시스템 buffer pool
- node를 실행하는 그 순간 로우레벨 최적화를 위해 8KiB를 가지게 됨
- CS의 미세한 계산단위, 로우레벨에서 중요
- Pooling 자원을 매번 생성하지 않고 떼어다 재사용하는 기법 buffer.poolsize
- system call mode switch 모드 전환과 컨텍스트 스위칭 유발
- user mode -> kernel mode mode switch발생, context switching의 시작
- 하드웨어를 제어하기 위해서는 kernel 모드로 진입을 해야 함
- 커널 모드란 운영체제만 들어가는 물리적 하드웨어 통제 구역
- 유저모드를 멈추고 커널모드로 진입하는 system call
- allocUnsafe를 사용하면 버퍼 풀에서 필요한 만큼 즉시 잘라낸다.
- 버퍼 풀을 사용하려면 요구크기가 풀 사이즈의 전체 절반보다 작아야만 한다.
-
bitwise right shift 비트 이동 연산자 오른쪽으로 한칸 밀어서 버림
- 모든 비트가 이동하면 값은 정확히 절반이 됨.
- 물리적 회로 레벨의 처리 방식이기 때문에 수학 연산보다 훨씬 빠르다.
allocUnsafeSlow()
- 메모리 풀에서 사용하지 않고 운영체제에 새로운 메모리를 요구한다.
- memory fragmentation 메모리 단편화
- 작지만 서버가 죽을 때까지 수명이 엄청나게 긴 데이터를 다룰 때 일부러 공용 버퍼 풀을 건드리지 않는다.
스트림
- 쉴새없이 데이터를 주고받은 msa에서 유일한 운반 보관함 버퍼
- 스트림이란 유연한 처리, 무중단 흐름
- stream wrapper includes buffer chunks
- http req/res역시 stream itself
- packets 네트워크 유입 buffer 버퍼 재조립 stream 스트림을 통해 외부로
- serialization 직렬화
- 운영체제의 램 안에서 바로 사용가능한 c++ 레벨의 연속된 메모리 공간 버퍼
- big endian BE , little Endian LE
- .byteLength 는 메모리가 점유한 바이트 수를 계산
- zero copy architecture .subarray() 주소만 옮겨서 읽는 기법
- .copy()는 원본에는 타격이 없음
- SIMD Single Instruction Multi Data 단일 명령 다중 데이터 처리
- 매직넘버: png 이미지는 89 50 4E 47로 시작
- buffer 에서 웹 표준 blob Binary Large Object 이진 대형 객체
소감
- 미션 하는데 너무 헷갈렸다.
- 실제 코딩 예제로 보면 생각보다 헷갈린다. 특히 변화과정 같은 것들은 케이스가 다양하기 때문에
- 많은 것들을 할 수 있을 것 같긴 한데 지금은 그래서 이게 언제 어디 쓰이는지
- 그리고 컴퓨터에서 물리적으로 어떻게 작동하는 건지는 좀 헷갈림
- os kernel ram dma? cpu register v8 worker thread 등등 nodejs와 컴퓨터 자체의 개념들이 함께 돌아가는 게 굉장히 헷갈려서 클로드랑 챗지피티한테 모르는 게 생길 때마다 물리적으로 어떤 일이 일어나서 어디로 전달되서 결과적으로 코드가 실행되는 부품은 어디서 영향을 받고 그런 것들을 물어보고 있음.