학습 자료 글/컴퓨터시스템

컴퓨터시스템 기초 18. 스레드와 동기화는 왜 멀티코어에서 필수가 될까

cedis 2026. 3. 31. 16:26

[컴퓨터 시스템] 18. 스레드와 동기화는 왜 멀티코어에서 필수가 될까

여러 프로세스를 봤다면, 이제 한 프로세스 안에서 여러 실행 흐름이 동시에 움직이는 스레드를 볼 차례입니다. 멀티코어 시대의 성능 이야기는 결국 동시성과 동기화 문제를 피해 갈 수 없습니다.

이번 글은 스레드를 가볍게 소개하는 수준이 아니라, 왜 공유 상태가 문제를 만들고 왜 동기화가 필요해지는지를 중심으로 정리합니다.

먼저 짚고 갈 용어
thread: 같은 프로세스 자원을 공유하면서 실행되는 개별 실행 흐름
synchronization: 동시에 접근하는 공유 상태를 올바르게 조율하는 규칙
race condition: 실행 순서에 따라 결과가 달라지는 위험한 상황
이번 글에서 다루는 것
  • 프로세스와 스레드 차이
  • 공유 상태가 왜 문제를 만드는지
  • 동기화가 필요한 이유
  • lock 같은 도구를 어떤 질문으로 이해하면 좋은지
  • 적용형 미니 문제
한눈에 보는 흐름
1
프로세스와 스레드 차이
2
공유 상태가 왜 문제를 만드는지
3
동기화가 필요한 이유
4
lock 같은 도구를 어떤 질문으로 이해하면 좋은지

1. 스레드는 실행 흐름을 나누되 자원은 많이 공유한다

프로세스가 비교적 독립된 실행 단위라면, 스레드는 같은 프로세스 안에서 코드와 많은 자원을 공유하는 실행 흐름입니다. 덕분에 협력이 빠를 수 있지만, 동시에 같은 데이터를 건드릴 위험도 커집니다.

그림으로 먼저 보기
주소 공간
프로세스: 대체로 분리
스레드: 대체로 공유
협력 비용
프로세스: 더 큰 편
스레드: 더 작은 편
동시성 위험
프로세스: 경계가 비교적 뚜렷
스레드: 공유 상태 때문에 더 직접적
비교프로세스스레드
주소 공간대체로 분리대체로 공유
협력 비용더 큰 편더 작은 편
동시성 위험경계가 비교적 뚜렷공유 상태 때문에 더 직접적

2. 공유 상태가 있으면 순서가 결과를 바꾼다

스레드가 동시에 같은 변수나 자료구조를 만지면, 어떤 순서로 실행되었는지에 따라 결과가 달라질 수 있습니다. 이때 생기는 대표 문제가 race condition입니다.

즉 문제는 단순히 동시에 돈다는 사실이 아니라, 공유 상태를 안전하게 다루지 않았다는 데 있습니다.

핵심 질문
이 데이터는 여러 스레드가 동시에 만질 수 있는가, 그리고 그때 순서가 결과를 바꿀 수 있는가를 먼저 물어야 합니다.

3. 동기화는 동시에 접근해도 규칙이 깨지지 않게 만든다

동기화는 속도를 일부 희생하더라도 올바른 결과를 보장하기 위한 규칙입니다. 대표적으로 lock은 어떤 순간에는 한 스레드만 특정 공유 자원에 접근하게 만들어 줍니다.

그림으로 먼저 보기
lock
무슨 문제를 줄이려 하나: 동시에 같은 임계 구역에 들어가는 문제
atomic operation
무슨 문제를 줄이려 하나: 아주 작은 갱신을 끊기지 않게 처리하는 문제
condition variable 등
무슨 문제를 줄이려 하나: 기다림과 깨움 조율

중요한 것은 lock 자체를 외우는 것이 아니라, 공유 상태를 안전하게 바꾸려면 접근 순서를 제어해야 한다는 원칙입니다.

도구/개념무슨 문제를 줄이려 하나
lock동시에 같은 임계 구역에 들어가는 문제
atomic operation아주 작은 갱신을 끊기지 않게 처리하는 문제
condition variable 등기다림과 깨움 조율

4. 현실적인 코드 장면으로 보면 왜 문제가 생기는지 보인다

겉으로는 한 줄이지만 실제로는 읽기, 더하기, 쓰기 같은 여러 단계로 쪼개질 수 있습니다. 그래서 두 스레드가 동시에 실행하면 기대보다 증가 횟수가 적어질 수 있습니다.

C
shared_counter = shared_counter + 1;
왜 한 줄인데도 안전하지 않을까
고수준 한 줄이 저수준 여러 단계로 풀리기 때문에, 중간에 다른 스레드가 끼어들면 결과가 어긋날 수 있습니다.

5. 직접 해볼 문제: lock이 없는 증가 연산을 설명해 보자

이 문제는 동기화 도구 이름보다, 왜 공유 상태가 위험한지 설명하는 연습입니다.

미니 문제
두 스레드가 동시에 `counter = counter + 1` 을 실행할 때, 최종 값이 기대보다 작아질 수 있는 이유를 읽기-계산-쓰기 단계로 나누어 설명해 보세요.

이번 글에서 기억할 것

스레드는 같은 프로세스 자원을 많이 공유하므로 협력은 쉽지만 공유 상태 문제도 커진다.
race condition의 핵심은 동시에 돈다는 사실보다 공유 상태 접근 순서가 결과를 바꾼다는 데 있다.
동기화는 성능보다 먼저 올바른 결과를 지키기 위한 규칙이다.

스스로 점검

프로세스와 스레드 차이를 주소 공간과 공유 관점에서 설명할 수 있는가
race condition이 왜 생기는지 말할 수 있는가
lock이 왜 필요한지 공유 상태 관점에서 설명할 수 있는가

다음 글 예고

다음 글에서는 시야를 더 넓혀, 분산 메모리와 가속기가 한 머신 바깥의 계산 모델을 어떻게 바꾸는지 정리합니다.

한 줄 정리
멀티코어 시대의 핵심 문제는 동시에 많이 돌리는 것 자체보다, 공유 상태를 올바르게 조율하는 규칙을 갖추는 데 있습니다.