
DB 분산락을 공부할려고 했다.
트레픽이 몰리게 되면, 사람들은 그 짧은 시간에 서버에게 요청을 보내게 되고, 그럼 "수량 제한" 혹은 "선착순" 등등 이런 이벤트를 어떻게 처리하는지 공부하고 싶어서 그랬다.
그래서, 동시성을 공부할려고 했는데...
동시에 "딸깍"하고 누른다 해서 동시가 아니네?
정확하게 알아보자.
작업(Task)들이 빠르게 전환하면서 실행되어, 동시에 실행되는 것처럼 '보이는 것'
정확히 말하면 동시성이라고 동시에 실행되는 것이 아니다.

CPU에서 작업간, 문맥교환(Context Switch)이 빠르게 일어나면서 동시에 실행되는 것처럼 보인다.
📦 전제
1. 한개의 프로세스가 있다고 가정.
2. 프로세스는 총 4개의 스레드로 OS가 분할했다고 가정.
3. 비교할 CPU 환경:
1C2T: 물리 코어 1개 + 하이퍼스레딩으로 논리 스레드 2개
2C4T: 물리 코어 2개 + 논리 스레드 4개 (하이퍼스레딩 포함이든 아니든)
실행 가능 개수: 최대 2개 스레드 (논리적 병렬)
나머지 두개의 스레드는 대기하다가 context switch로 교체된다.
⏱️ 실행 흐름:
T1 T2 → (context switch) → T3 T4 → (반복)
원래대로는 한 코어당, 하나의 스레드만 실행이 가능하다.
하지만 요즘 CPU는 SMT(동시 멀티스레딩)을 지원해서, T1 T2가 빠르게 왔다갔다 하면서 동시에 작업되는 것처럼 보인다.
그럼 T1 T2에서 CPU가 문맥교환을 거치며 T3 T4가 작업이 된다.
실행 가능 개수: 최대 4개 스레드 (논리적 병렬)
모든 스레드를 거의 동시에 실행 가능하다.
⏱️ 실행 흐름:
T1 T2 T3 T4 (모두 동시에 실행되거나, 거의 동시에 실행됨)
문맥교환이 거의 필요 없는 것을 볼 수 있다.
CPU 자원을 더 많이 쓸 수 있음 → Idle Time 최소화 → 처리 속도 빠름
멀티코어에서 더 많이 쓰이는 이유는,
기본적으로 운영체제는 프로세스나 스레드의 작업을 시간 단위(타임슬라이스)로 나누어 CPU에 분배해, 유휴 시간(Idle Time)을 최소화한다.
※ 유휴 시간(Idle Time): CPU가 놀고 먹는 시간
당연히 위의 예제를 보면 알겠지만, 코어가 많으면 스레드도 늘어난다.
그러니 더 빠르게 작업을 처리할 수 있다.
물리적으로 같은 시간에 작업을 동시에 수행하는 것
병렬성은 여러 CPU나 코어를 사용하여 여러 작업을 실제로 동시에 실행한다.
이를 통해, 대규모 데이터 처리나 복잡한 계산 작업을 빠르게 처리할 수 있다.
대규모 DB의 Query 처리, 대용량 파일의 압축 해제 등
병렬 처리를 통해 성능을 크게 향상시킬 수 있다.
(개인적 의견이다. 틀릴 수 있다.)
이 글을 포스팅 할려고 여러개의 블로그나 문서를 읽었는데, 전부 다 동시성에는 경쟁상태가 발생하고, 병렬성은 동시성에 포함된다고 적혀있다.
밑에 경쟁상태를 적어놨지만, 저 이론대로라면 "병렬성에도 경쟁상태가 발생이 가능한데? 왜 동시성에만 나타나는거지?"를 고민했다.
정확하게는 병렬성과 동시성은 동시성 프로그래밍(Concurrent Programming)에 포함되는 개념이라고 한다.
"동시성 프로그래밍을 어떻게 구현하는가?" 에 지금까지 설명한 동시성과 병렬성이 있다고 생각한다.
그리고 동시성 프로그래밍은 경쟁상태(Race Condition), 데드락(Deadlock), 기아(Starvation)를 야기할 수 있다.
결론적으로 서두에서 내가 말한 "동시성"은 동시성 프로그래밍을 의미한 뜻이였다.
(DB락은 그러명 경쟁상태를 해결하는 방식이겠지...?)
게다가 멀티 코어 멀티 스레드에서 병렬성으로 작업하는 게, 항상 성능상 이점이 있는 것은 아니다.
I/O 요청 후, 기다리는 작업이 많은 경우를 처리할 때, 때로는 단일코어에서 동시성으로 처리 하는 것이 효율적일 수 있다.
여러 프로세스 및 스레드가 동시에 동일한 데이터(공유 데이터)를 조작할 때, 타이밍이나 접근 순서에 따라 예상했던 결과가 달라질 수 있는 상황을 의미
<Class Counter {
int count = 0;
void increment() {
count++;
}
}
좋아요👍 기능이 있다고 가정하자.
유저A가 좋아요 버튼을 누르면, count 변수에 접근하게 된다.
이때, 동시에 유저B가 좋아요 버튼을 눌러서 count 변수에 동시에 접근한다.
그러면? 두 유저는 현재 좋아요 수가 0으로 인식한다.
그럼 저 count++가 두 번 작동하니, 당연히 좋아요도 2번이 되어야 정상이다.
하지만 유저B는 유저A가 0에서 ++ 연산을 하기 전에 count 변수에 접근했으니, 좋아요는 1로 기록된다.
이러한 상태를 경쟁상태(Race Condition)라고 한다.