Multithreading
멀티스레딩이란
멀티스레딩은 하나의 프로세스 안에서 여러 스레드가 동시에 실행 흐름을 가지는 구조다. 같은 프로세스 안에 있기 때문에 코드, 힙, 전역 데이터 같은 자원을 공유하면서도, 각 스레드는 자기만의 스택과 실행 문맥을 가진다.
즉 멀티스레딩은 “작업을 나눈다”는 의미이기도 하고, “같은 주소 공간 안에서 여러 실행 흐름을 운영한다”는 의미이기도 하다.
왜 쓰는가
멀티스레딩이 필요한 대표 이유는 다음과 같다.
- I/O 대기 중에도 다른 작업을 계속 수행하기 위해
- 여러 작업을 병렬로 처리해 응답성을 높이기 위해
- 같은 프로세스 내부에서 자원 공유 비용을 줄이기 위해
예를 들어 서버에서는 요청 처리, 백그라운드 작업, 로그 전송이 각기 다른 스레드에서 돌 수 있다.
장점
1. 자원 공유가 빠르다
스레드는 같은 프로세스 내부 자원을 공유하므로, 프로세스 간 통신보다 데이터 교환 비용이 작다.
2. 문맥 전환 비용이 상대적으로 작다
프로세스 전환보다 스레드 전환이 일반적으로 더 가볍다. 같은 주소 공간을 쓰기 때문이다.
3. 응답성을 높이기 쉽다
하나의 작업이 오래 걸려도 다른 작업이 별도 스레드에서 계속 진행될 수 있다.
단점
1. 동기화가 어렵다
공유 자원을 동시에 만지면 race condition, deadlock, visibility 문제가 생길 수 있다.
2. 하나의 버그가 전체 프로세스에 영향을 줄 수 있다
같은 주소 공간을 공유하므로 잘못된 메모리 접근이나 치명적 예외가 전체 안정성에 영향을 줄 수 있다.
3. 디버깅이 어렵다
멀티스레드 버그는 항상 재현되지 않고, 타이밍에 따라 나타났다 사라지기 쉽다.
멀티스레딩을 쓴다고 항상 병렬적인 것은 아니다
스레드가 여러 개라고 해서 항상 CPU 병렬성이 얻어지는 것은 아니다. 실제로는 다음을 구분해야 한다.
Concurrency: 여러 작업을 번갈아 처리Parallelism: 여러 작업을 실제로 동시에 처리
멀티스레딩은 concurrency를 위한 도구이고, 멀티코어 환경에서는 parallelism까지 이어질 수 있다.
실무에서 중요한 질문
- 이 작업은 CPU bound인가, I/O bound인가
- 공유 자원이 많은가
- 락 경합이 심해질 가능성이 있는가
- 스레드 수를 늘리면 정말 처리량이 오르는가
멀티스레딩의 성능은 스레드 수 자체보다 작업 성격과 동기화 비용에 더 크게 좌우된다.
정리
멀티스레딩은 같은 프로세스 안에서 여러 실행 흐름을 운영하는 방식이다. 자원 공유와 응답성 측면에서는 강력하지만, 동기화와 디버깅 복잡도까지 함께 가져온다는 점을 항상 같이 봐야 한다.
댓글
아직 댓글이 없습니다