태그: 동시성
16편
-
CPython 내부로 이해하는 Python: 바이트코드와 인터프리터, GIL, 가비지 컬렉션, 임포트 시스템
CPython이 소스를 바이트코드로 컴파일해 ceval 루프로 실행하는 구조, GIL이 풀리는 시점과 threading·multiprocessing 선택, 참조 카운트와 세대별 GC, sys.modules와 importlib 임포트 경로, 순환 임포트를 설명합니다.
-
Go 런타임 깊이 보기: G/M/P 스케줄러, 채널 구현, 인터페이스 레이아웃, 삼색 GC
Go 런타임이 고루틴을 G/M/P 모델로 스케줄링하는 방식, 언버퍼드·버퍼드 채널과 select의 동작, iface와 빈 인터페이스의 메모리 레이아웃, 쓰기 장벽을 쓰는 삼색 마킹 GC와 GOGC 조정을 설명합니다. context 취소와 워커 풀 패턴도 다룹니다.
-
JVM 깊이 보기: 바이트코드·JIT·클래스 로딩·JMM·GC와 프로덕션 Java 패턴
클래스 파일과 바이트코드가 인터프리터와 JIT을 거쳐 실행되는 과정, 클래스 로더 위임 모델과 JPMS, happens-before와 volatile의 한계, G1·ZGC 동작, JFR 관측과 우아한 종료까지 JVM 내부를 운영 관점으로 설명합니다.
-
데이터베이스 트랜잭션 심화 — MVCC·2PL·데드락·WAL·실무 패턴
트랜잭션이 ACID를 어떻게 보장하는지 엔진 내부 관점에서 정리합니다. 격리 수준과 이상 현상, MVCC 가시성과 VACUUM, 2단계 락킹, 데드락 탐지와 희생자 선택, WAL과 체크포인트, 갱신 손실을 막는 SQL 패턴을 PostgreSQL과 InnoDB 예로 설명합니다.
-
Swift async/await 흔한 실수와 디버깅 팁 | 실전 체크리스트
동기 함수에서 async를 호출하려다 막히는 문제, 기다리지 않은 Task 누수, MainActor 격리 위반, TaskGroup 에러 누락, SwiftUI onAppear에서 만든 Task, 취소 확인 누락, Sendable 위반까지 Swift 동시성의 흔한 실수 일곱 가지를 코드로 고칩니다.
-
Go context로 타임아웃·취소 처리하기 | 실전 패턴 가이드
Go의 context.WithTimeout으로 DB와 외부 API 호출에 상한을 걸고, WithCancel로 한 단계가 실패하면 나머지 워커를 멈추고, HTTP 서버에서 요청 컨텍스트와 Shutdown 컨텍스트를 따로 쓰는 방법을 코드로 보여줍니다. 세 API의 선택 기준도 다룹니다.
-
Java Virtual Thread로 동시성 코드 바꾸기 | JDK 21 마이그레이션 가이드
JDK 21 가상 스레드를 newVirtualThreadPerTaskExecutor와 Thread.ofVirtual로 도입하고, 기존 스레드 풀과 Spring Boot 3.2 설정을 옮기는 방법, PINNED 상태 디버깅과 DB 커넥션 고갈 같은 전환 후 문제를 다룹니다.
-
Rust 동시성 | Thread, Channel, Arc, Mutex
Rust 동시성 프로그래밍. thread::spawn과 move 클로저로 데이터 넘기기, 채널(mpsc)로 메시지 주고받기, Arc<Mutex<T>>로 상태 공유하기, 데이터를 청크로 나눈 병렬 계산 예제를 정리합니다.
-
Java 멀티스레드 | Thread, Runnable, Executor
Thread 상속보다 Runnable 구현을 권장하는 이유, ExecutorService 스레드 풀과 Callable·Future로 결과를 받는 방법, synchronized 메서드와 블록으로 경쟁 상태를 막는 법을 병렬 다운로더 예제로 설명합니다.
-
C++ 멀티스레딩 기초: std::thread·mutex·생산자-소비자와 자주 겪는 문제
std::thread 생성과 인자 전달, mutex와 lock_guard로 경쟁 조건 막기, 생산자-소비자와 스레드 풀 구현, 그리고 데드락, detach 후 댕글링 참조, false sharing처럼 멀티스레드 코드에서 자주 겪는 문제의 원인과 해결을 예제로 다룹니다.
-
C++ 메모리 모델: happens-before, memory_order 선택 기준, 데이터 레이스가 UB인 이유
C++11부터 도입된 메모리 모델을 정리합니다. happens-before, synchronizes-with 관계, memory_order(relaxed/acquire-release/seq_cst) 선택 기준, 그리고 데이터 레이스가 왜 정의되지 않은 동작(UB)으로 이어지는지 실전 코드로 설명합니다.
-
C++ 개발자를 위한 Go 언어 2주 학습 커리큘럼: Day별 일정과 C++ 개념 대응
C++ 개발자가 Go를 배울 때 클래스 없는 구조체와 인터페이스, 에러 값 반환, 고루틴과 채널로 사고방식을 옮기는 과정을 Day별 2주 일정으로 정리했습니다. M:N 스케줄러와 채널 내부 구조, C++ 코드를 Go로 옮길 때의 주의점도 다룹니다.
-
[Go 2주 완성 #06] Day 10~11: 고루틴과 채널 - 동시성 프로그래밍의 혁명
std::thread보다 훨씬 작은 스택으로 시작하는 고루틴과 WaitGroup, 고루틴 사이의 통신 수단인 채널, 버퍼 채널, select의 타임아웃과 논블로킹 처리를 C++ 코드와 비교합니다. 워커 풀, 파이프라인, 팬아웃·팬인 동시성 패턴도 다룹니다.
-
C++ 작업 큐 설계: 워크 스틸링으로 스레드 풀 성능 끌어올리기
메인 스레드에서 무거운 작업을 돌려 UI가 멈추는 문제를 조건 변수 기반 작업 큐와 스레드 풀로 푸는 과정을 구현합니다. std::future로 결과 받기, 부하 불균형을 줄이는 워크 스틸링, spurious wakeup과 shutdown 타이밍, 예외로 워커가 죽는 문제도 다룹니다.
-
C++ vs Go: 성능, 동시성 모델, 프로젝트별 선택 기준
C++로 웹 API를 만들다 개발 속도가 밀리거나 Go로 지연에 민감한 시스템을 만들다 GC가 문제가 되는 선택 실패 사례를 두고 두 언어를 비교합니다. 스레드·이벤트 루프와 고루틴 M:N 스케줄링, 컨텍스트 스위칭 비용, CPU 바운드 성능을 다룹니다.
-
C++ Strand | 락(Lock) 없는 동시성 제어 [#3]
Boost.Asio Strand가 mutex 없이 핸들러를 논리적으로 직렬화하는 원리, make_strand로 strand를 만들고 bind_executor로 완료 핸들러를 묶는 방법, 연결마다 strand 하나를 두는 세션 설계와 흔한 실수를 예제로 설명합니다.