[컴퓨터 시스템] 18. 스레드와 동기화는 왜 멀티코어에서 필수가 될까
여러 프로세스를 봤다면, 이제 한 프로세스 안에서 여러 실행 흐름이 동시에 움직이는 스레드를 볼 차례입니다. 멀티코어 시대의 성능 이야기는 결국 동시성과 동기화 문제를 피해 갈 수 없습니다.
이번 글은 스레드를 가볍게 소개하는 수준이 아니라, 왜 공유 상태가 문제를 만들고 왜 동기화가 필요해지는지를 중심으로 정리합니다.
- 프로세스와 스레드 차이
- 공유 상태가 왜 문제를 만드는지
- 동기화가 필요한 이유
- lock 같은 도구를 어떤 질문으로 이해하면 좋은지
- 적용형 미니 문제
1. 스레드는 실행 흐름을 나누되 자원은 많이 공유한다
프로세스가 비교적 독립된 실행 단위라면, 스레드는 같은 프로세스 안에서 코드와 많은 자원을 공유하는 실행 흐름입니다. 덕분에 협력이 빠를 수 있지만, 동시에 같은 데이터를 건드릴 위험도 커집니다.
| 비교 | 프로세스 | 스레드 |
|---|---|---|
| 주소 공간 | 대체로 분리 | 대체로 공유 |
| 협력 비용 | 더 큰 편 | 더 작은 편 |
| 동시성 위험 | 경계가 비교적 뚜렷 | 공유 상태 때문에 더 직접적 |
2. 공유 상태가 있으면 순서가 결과를 바꾼다
스레드가 동시에 같은 변수나 자료구조를 만지면, 어떤 순서로 실행되었는지에 따라 결과가 달라질 수 있습니다. 이때 생기는 대표 문제가 race condition입니다.
즉 문제는 단순히 동시에 돈다는 사실이 아니라, 공유 상태를 안전하게 다루지 않았다는 데 있습니다.
3. 동기화는 동시에 접근해도 규칙이 깨지지 않게 만든다
동기화는 속도를 일부 희생하더라도 올바른 결과를 보장하기 위한 규칙입니다. 대표적으로 lock은 어떤 순간에는 한 스레드만 특정 공유 자원에 접근하게 만들어 줍니다.
중요한 것은 lock 자체를 외우는 것이 아니라, 공유 상태를 안전하게 바꾸려면 접근 순서를 제어해야 한다는 원칙입니다.
| 도구/개념 | 무슨 문제를 줄이려 하나 |
|---|---|
| lock | 동시에 같은 임계 구역에 들어가는 문제 |
| atomic operation | 아주 작은 갱신을 끊기지 않게 처리하는 문제 |
| condition variable 등 | 기다림과 깨움 조율 |
4. 현실적인 코드 장면으로 보면 왜 문제가 생기는지 보인다
겉으로는 한 줄이지만 실제로는 읽기, 더하기, 쓰기 같은 여러 단계로 쪼개질 수 있습니다. 그래서 두 스레드가 동시에 실행하면 기대보다 증가 횟수가 적어질 수 있습니다.
shared_counter = shared_counter + 1;5. 직접 해볼 문제: lock이 없는 증가 연산을 설명해 보자
이 문제는 동기화 도구 이름보다, 왜 공유 상태가 위험한지 설명하는 연습입니다.
이번 글에서 기억할 것
스스로 점검
다음 글 예고
다음 글에서는 시야를 더 넓혀, 분산 메모리와 가속기가 한 머신 바깥의 계산 모델을 어떻게 바꾸는지 정리합니다.
'학습 자료 글 > 컴퓨터시스템' 카테고리의 다른 글
| 컴퓨터시스템 기초 19. 분산 메모리와 가속기는 한 머신 밖에서 무엇을 바꿀까 (0) | 2026.03.31 |
|---|---|
| 컴퓨터시스템 기초 17. 시스템 호출과 IPC는 프로세스 사이를 어떻게 잇는가 (0) | 2026.03.31 |
| 컴퓨터시스템 기초 16. 운영체제는 프로세스와 가상 메모리를 어떻게 관리할까 (0) | 2026.03.31 |
| 컴퓨터시스템 기초 15. 코드 최적화는 왜 측정과 locality가 먼저일까 (0) | 2026.03.31 |
| 컴퓨터시스템 기초 14. 메모리 계층은 왜 프로그램 속도를 바꿀까 (0) | 2026.03.31 |