2026/04/07 3

OS 3편 - Race Condition, synchronized (feat. volatile)

여러 스레드가 같은 메모리를 동시에 건드릴 때 생기는 문제다. 로컬에선 안 터지다가 운영에서 트래픽 몰릴 때 갑자기 데이터가 이상해지는 버그의 주범이다. 1. Race Condition이란count++ 한 줄처럼 보이지만 CPU 입장에선 3단계다.1. count 값을 메모리에서 읽어옴 (READ)2. 1을 더함 (ADD)3. 결과를 메모리에 저장 (WRITE)스레드 2개가 동시에 실행되면 이 사이에 끼어들 수 있다.스레드 1 스레드 2READ → count = 0 READ → count = 0ADD → 0 + 1 = 1 A..

CS/OS 2026.04.07

OS 2편 - 동기 vs 비동기, 그리고 언제 써야 하는가

스레드가 "기다리는 시간"을 어떻게 쓰느냐의 차이다. 단순히 빠르고 느린 게 아니라, 상황에 따라 골라 써야 한다.1. 동기(Synchronous)란동기 방식에서 스레드는 작업이 끝날 때까지 그 자리에서 기다린다. DB 쿼리를 날리면 응답이 올 때까지, 외부 API를 호출하면 결과가 올 때까지 스레드는 아무것도 못 하고 점유만 한다. 이걸 블로킹(Blocking) 이라 한다.스레드 1├── 요청 받음├── DB 쿼리 날림├── ⏳ DB 응답 기다리는 중... (CPU 안 씀, 스레드 점유 중)├── ⏳ 기다리는 중...├── DB 응답 옴├── 결과 가공└── 응답 반환DB 쿼리 100ms 중 실제 CPU를 쓰는 시간은 5ms 정도다. 나머지 95ms는 그냥 대기다. 그런데 스레드는 그 시간 내내 자리를..

CS/OS 2026.04.07

OS 1편 - 프로세스, 스레드, Thread Pool

프로세스 vs 스레드프로세스는 OS가 프로그램 실행 시 만드는 독립된 단위다. 각자 메모리 공간을 가지고 있어서 서로 침범하지 못한다. java -jar로 Spring 앱을 띄우면 프로세스 1개가 생긴다.스레드는 프로세스 안에서 실제로 코드를 실행하는 단위다. 같은 프로세스 안의 스레드끼리는 메모리를 공유한다. Tomcat은 HTTP 요청이 들어오면 스레드 1개를 할당해서 처리한다.컨텍스트 스위칭CPU는 한 번에 스레드 하나만 실행한다. "동시에 처리"처럼 보이는 건 CPU가 스레드들을 극도로 빠르게 오가기 때문이다. 이 전환 과정 자체가 CPU 자원을 소모한다.스레드가 많아질수록 전환 비용이 증가해서, 일정 수를 넘으면 오히려 전체 처리 속도가 떨어진다.Thread Pool스레드를 매번 만들고 없애는 ..

CS/OS 2026.04.07