#memory
노트 30개
Frontend › JavaScript
가비지 컬렉션과 메모리 누수JavaScript 엔진은 루트에서 참조를 따라 닿을 수 있는(reachable) 값만 남기고 나머지를 자동으로 회수한다. 루트와 도달 가능성, 서로 참조해도 닿을 수 없으면 지워지는 '섬', 기본 알고리즘 mark-and-sweep과 순환 참조에 약했던 참조 카운팅, 세대별·점진적·병렬·유휴 시간 수집 같은 최적화(V8의 스캐빈지·mark-compact·쓰기 장벽), 그리고 GC가 막지 못하는 누수 패턴(전역, 잊힌 타이머·리스너, 클로저, 떨어져 나간 DOM, 끝없는 캐시)과 WeakMap·WeakRef·FinalizationRegistry를 정리한다.
Frontend › JavaScript
변수와 데이터 타입식별자 규칙과 이름 짓기, let·const·var의 차이와 호이스팅, 원시 타입과 참조 타입, 원시값의 래퍼 객체(new String을 쓰지 않는 이유), typeof, null과 undefined의 구분, 값 복사와 참조 공유(비교·얕은 복사·structuredClone·함수 인자·const와 Object.freeze), 스택·힙과 가비지 컬렉션, 동적 타입과 여덟 가지 타입, 대문자 상수를 쓰는 때와 변수를 재사용하지 않는 이유.
Frontend › Mobile
iOS 앱 기본 개념: 생명 주기, 이벤트 전달, ARCiOS 앱의 실행 상태와 씬 기반 생명 주기, UIViewController의 뷰 생명 주기 메서드, 객체 사이에 이벤트를 전하는 델리게이트·클로저·NotificationCenter의 선택 기준, ARC와 강한 순환 참조를 weak·unowned로 끊는 법, frame과 bounds, 데이터 저장 방법을 정리한다.
Computer Science
C 프로그래밍C 언어의 컴파일 과정과 자료형·연산자·문자열, 포인터와 메모리, 구조체·공용체와 함수 포인터, 스코프와 링키지, 입출력, 빌드 도구(gcc·make)와 디버깅 도구, 호출 규약과 저수준 최적화, 역사와 표준.
Computer Science › C Programming
포인터와 메모리C에서 주소와 포인터로 메모리를 다루는 법과 자주 걸리는 함정. 주소·역참조, 문자열의 실체, 동적 할당과 저장 기간, 스택과 힙, 배열과 포인터가 다른 경우, 읽기 전용 리터럴, const의 위치, 이중 포인터, 댕글링 포인터, memcpy와 memmove, malloc/free와 new/delete의 짝.
Computer Science › C Programming
호출 규약과 스택 프레임함수 호출이 기계어 수준에서 어떻게 이루어지는지 정리한다. 스택 프레임과 프롤로그·에필로그, 스택이 자라는 방향을 확인하는 법, cdecl과 System V AMD64 같은 호출 규약, 가변 인자 함수(va_list)가 동작하는 원리, 꼬리 호출 최적화.
Computer Science › C Programming
C 디버깅 도구C 프로그램의 버그를 잡는 도구를 쓰임새별로 정리한다. GDB·LLDB로 멈춰서 들여다보기, AddressSanitizer·UBSan으로 메모리 오류와 미정의 동작 잡기, leaks·Valgrind로 누수 찾기, strace로 시스템 콜 추적하기, 그리고 Segmentation fault와 Bus error의 차이.
Computer Science › C Programming
C의 스코프와 링키지C에서 같은 이름이 무엇을 가리키는지는 스코프, 이름 공간, 링키지가 정한다. 블록·파일 스코프와 이름 가림, 태그·멤버·라벨·일반 식별자의 네 가지 이름 공간, 저장 기간, static으로 파일 밖 노출을 막는 내부 링키지, 기호 상수를 #define·enum·const로 정의하는 법을 정리한다.
Computer Science › C Programming
C의 정수 자료형과 형 변환C 표준은 자료형의 최소 크기만 정한다. 고정 폭 정수(stdint.h)와 size_t, 정수 승격과 일반 산술 변환, 부호 확장, 부호 있는 정수 오버플로가 미정의 동작인 이유, 부동소수점 비교와 고정소수점까지 C에서 숫자가 예상과 다르게 계산되는 지점을 정리한다.
Computer Science
컴퓨터 구조CPU, 메모리, 입출력 장치가 어떻게 구성되고 협력해 프로그램을 실행하는지, 그리고 현대 CPU의 비순차 실행·분기 예측·캐시가 코드 성능에 어떤 영향을 주는지 다루는 분야.
Computer Science › Computer Architecture
디지털 논리 회로와 부품디지털 컴퓨터의 구성과 2진을 쓰는 이유, 트랜지스터로 만든 논리 게이트와 NAND·NOR 범용 게이트, 부울 대수와 정규형, 카르노 맵 간소화, 조합 회로(가산기·BCD 가산기·비교기·디코더·우선순위 인코더·MUX·DEMUX·코드 변환기·패리티)와 디코더·MUX로 함수 만들기, 래치와 플립플롭(특성식·여기표), 멀티바이브레이터와 555 타이머, 순차 회로 설계(타이밍, 무어·밀리 머신, 상태도에서 입력식까지), 시프트 레지스터와 링·존슨 카운터, 리플·동기·mod-N 카운터와 분주기, 셀 행렬로 짠 RAM과 ROM, 집적회로의 규모와 논리군, 게이트의 전기적 특성과 프로그래머블 논리 소자.
Computer Science › Computer Architecture
메모리 계층 구조레지스터부터 디스크까지 속도·용량·가격이 다른 저장 장치를 계층으로 묶는 구조(계층별 지연 시간의 자릿수)와 RAM의 종류(SRAM·DRAM의 셀 구조, DRAM의 행·열 접근 타이밍과 순차 접근이 빠른 이유, NUMA), 칩을 병렬·직렬로 이어 만드는 기억장치 모듈, 하드 디스크·플래시 메모리(셀 원리, NOR·NAND, SSD와 FTL), RAID(작은 쓰기 문제), 연관 메모리.
Computer Science › Computer Architecture
캐시 메모리와 MMU캐시의 주소 매핑(연관·직접·집합 연관)과 쓰기 정책, 그리고 하드웨어 관점에서 MMU가 맡는 재배치·공유·보호와 세그먼트 보호 필드.
Computer Science › Computer Architecture
캐시를 고려한 코드프로그래머가 캐시를 직접 제어할 수 없는 대신 접근 패턴으로 성능을 끌어내는 방법. 캐시 라인과 하드웨어 프리페처, 행렬 곱의 전치·블로킹, 배열과 연결 리스트의 실제 차이, 넌템포럴 저장과 쓰기 결합 버퍼, 캐시 일관성(MESI)과 거짓 공유, TLB shootdown, 캐시 효과를 걸러 내는 마이크로벤치마크 방법을 정리한다.
Computer Science › Computer Architecture
컴퓨터 시스템의 기본 구성ENIAC에서 프로그램 내장 방식, 집적회로를 거쳐 CPU·메모리·저장 장치로 이루어진 현대 컴퓨터의 기본 구조.
Computer Science › Computer Architecture
파이프라인과 병렬 처리플린 분류, 파이프라인의 원리와 해저드 해결법, 벡터 처리와 메모리 인터리빙, 다중 프로세서의 병렬 처리 단위·메모리 접근 모델(UMA·NUMA·NORMA)·시스템 구성(SMP·MPP·CC-NUMA·클러스터)·상호연결망과 토폴로지.
Computer Science › Computer Architecture
현대 CPU의 마이크로아키텍처교과서의 5단계 파이프라인과 달리 현대 x86·ARM 코어가 명령어를 μop으로 쪼개 비순차·슈퍼스칼라로 실행하는 구조. 프런트엔드(디코더·μop 캐시·LSD), 재정렬 버퍼와 예약 스테이션, 실행 포트와 포트 압력, 분기 예측과 분기 없는 코드, SMT를 정리한다.
Computer Science
운영체제하드웨어와 프로그램 사이에서 자원을 관리하고 실행 환경을 제공하는 시스템 소프트웨어에 대한 노트 모음. 프로세스·메모리·파일의 이론과 함께 UNIX 시스템 프로그래밍(파일 디스크립터, 시그널, 셸, pthread, 타이머)과 리눅스 운영(systemd, 접근 제어, 배포판, 가상화)을 다룬다.
Computer Science › Operating System
가상 메모리요구 페이징과 페이지 폴트 처리, OPT·FIFO·LRU·LFU·Clock 페이지 교체 알고리즘, 다양한 캐싱 환경, 프레임 할당과 스래싱, Working Set·PFF, 페이지 크기.
Computer Science › Operating System
메모리 관리논리·물리 주소와 주소 바인딩, MMU, 동적 로딩·링킹과 스와핑, 연속 할당과 단편화, 페이징(TLB·다단계 페이지 테이블·쓰기 시 복사)과 세그멘테이션.
Computer Science › Operating System
파일 시스템 구현블록과 연속·연결·인덱스 할당, inode의 직접·간접 블록과 경로 탐색, FAT, 빈 공간·디렉터리 관리, VFS/NFS, 버퍼 캐시와 페이지 캐시.
Computer Science › Programming Languages
메모리 풀같은 크기의 객체를 자주 할당·해제할 때 큰 블록을 미리 잡아 두고 한 칸씩 나눠 주는 메모리 풀을 정리한다. 고정 크기 풀은 빈 칸 인덱스 스택 하나로 할당과 해제를 O(1)에 끝내고, 가변 풀은 고정 풀을 청크로 이어 붙인다. 클래스의 operator new/delete를 오버로딩하면 호출 코드를 바꾸지 않고 풀을 쓸 수 있다.
Computer Science › Programming Languages
프로그램이 실행되기까지: 컴파일, 바이트코드, 인터프리터, GC소스 코드가 CPU에서 돌기까지의 세 갈래(네이티브 컴파일, 바이트코드 + VM·JIT, 인터프리터)와, 운영체제가 실행 파일을 띄워 종료하기까지의 단계, 가비지 컬렉션이 관리하는 영역과 추적·참조 카운팅의 비교, 순환 참조와 retain cycle, GC의 장단점과 Java·Python·Go의 방식, 브라우저에서 네이티브 코드를 돌리는 WebAssembly를 정리한다.
Computer Science › Programming Languages
C++ 기초: 문법, 참조자, 클래스, 복사와 이동, 오버로딩C++ 프로그램의 구조, 초기화 문법과 L·R-value, 입출력 스트림, 헤더와 네임스페이스, 저장 지정자(static·extern·mutable), switch의 fallthrough, 포인터와 참조자의 차이, 그리고 클래스의 접근 지정·friend·this·생성자 종류·초기화 리스트·static 멤버·소멸자와 RAII·private 생성자와 소멸자, 복사 생성자와 복사 대입·얕은 복사와 깊은 복사·이동·3·5·0의 규칙, 함수 오버로딩과 연산자 오버로딩, explicit 형 변환을 정리한다. 참조자는 null이 없는 별명이고, 자원은 소멸자에 묶으며, 인자 하나짜리 생성자에는 기본으로 explicit을 붙인다.
Computer Science › Programming Languages
C++ 상속과 가상 함수: 접근 지정, 생성·소멸 순서, vtable, 슬라이싱, 다중 상속C++ 상속의 다섯 가지 형태(단일·다중·다단계·계층·혼합), protected와 상속 방식(public·protected·private)이 접근 수준을 어떻게 바꾸는지, 기반에서 파생으로 생성되고 역순으로 소멸되는 순서, 가상 함수가 vtable과 vptr로 호출 대상을 고르는 원리와 비가상 함수의 이름 가림, 가상 생성자와 static 가상 함수가 없는 이유, 생성자·소멸자 안의 가상 호출과 pure virtual call, 가상 소멸자, 순수 가상 함수와 추상 클래스, 객체 슬라이싱, 다중 상속의 생성 순서와 다이아몬드 문제·가상 상속을 정리한다.
Computer Science › Programming Languages
C++ 스마트 포인터: unique_ptr, shared_ptr, weak_ptr힙 객체의 소유권을 RAII 객체로 표현하는 C++ 스마트 포인터를 정리한다. 단독 소유인 unique_ptr(이동만 가능, 원시 포인터와 같은 크기), 참조 카운트로 공유하는 shared_ptr(제어 블록, make_shared, 원자적 카운트), 순환 참조를 끊는 비소유 weak_ptr(lock), C++17에서 제거된 auto_ptr의 문제, 함수 인자로 넘기는 규칙을 다룬다. 기본은 unique_ptr이고 소유가 정말 여럿일 때만 shared_ptr을 쓴다.
Computer Science › Programming Languages
C++ 예외 처리의 내부 동작C++의 throw가 실제로 하는 일을 정리한다. 예외 객체는 힙에 할당되어 참조 카운트로 해제되고, 스택 되감기는 컴파일러가 만든 테이블(.eh_frame, LSDA)을 보고 함수와 call site를 찾아 소멸자를 부른다. 현대 컴파일러의 zero-cost 방식은 try 자체에는 비용이 없지만 throw가 매우 비싸므로, 예외는 진짜 예외 상황에만 쓰고 일상적인 실패는 오류 코드나 std::expected로 돌려준다.
Computer Science › Programming Languages
Go 언어: 설계 원칙, 타입, 에러 처리, 빌드와 테스트, GCGo의 장단점과 The Zen of Go의 원칙, 암묵적으로 구현되는 인터페이스와 nil 인터페이스 함정, 값과 포인터 리시버, 배열과 슬라이스 헤더·append, Swiss Table 기반 맵, 구조체 임베딩, 제네릭과 타입 제약, error 값과 감싸기·errors.Is/As, defer·panic·recover, 정적 바이너리 빌드와 모듈·MVS·워크스페이스, 테이블 기반 테스트와 벤치마크, 세대 구분도 압축도 하지 않는 동시 GC와 GOGC·GOMEMLIMIT, 클린 아키텍처 계층으로 프로젝트를 나누는 방법을 정리한다.
Computer Science › Programming Languages
JVM 내부 구조: 실행 엔진, 클래스 로딩, 메모리 영역, GCJVM의 구성 요소(클래스로더·런타임 데이터 영역·실행 엔진)와 계층형 JIT, javac가 만든 바이트코드가 클래스 로딩(로딩·링크·초기화, 부모 위임)을 거쳐 실행되는 과정, 스택과 힙의 역할, 세대별 GC와 Serial·Parallel·G1·ZGC·Shenandoah 비교, GC 로그·힙 덤프로 메모리 문제를 진단하는 방법, GraalVM Native Image와 AOT 캐시를 정리한다.
Tools › Chrome DevTools
DevTools로 성능·메모리 분석하기Performance 패널의 실시간 지표 화면과 트레이스 녹화·읽기(메인 트랙, 플레임 차트, Bottom-up·Call tree, 긴 작업, 인사이트, 주석, 저장·공유, 선택기 통계), 성능 모니터, 렌더링 탭과 레이어 패널, 커버리지, 메모리 패널로 누수·팽창·잦은 GC를 찾는 절차, Lighthouse 실행법을 정리한다.