스레드
기술노트
🧵 스레드 (Thread)
스레드는 프로세스(Process) 내에서 실행되는 작업의 최소 단위입니다. 하나의 프로세스는 하나 이상의 스레드를 가질 수 있으며, 각 스레드는 독립적인 실행 흐름을 가집니다.
프로세스가 운영체제로부터 자원을 할당받는 '공장'이라면, 스레드는 공장 안에서 실제로 작업을 수행하는 '일꾼'에 비유할 수 있습니다.
🧐 프로세스와 스레드
- 프로세스 : 실행 중인 프로그램의 인스턴스. 자신만의 독립적인 메모리 공간(Code, Data, Heap)을 가집니다.
- 스레드 : 프로세스 내에서 다른 스레드와 Stack 영역을 제외한 모든 메모리(Code, Data, Heap)를 공유합니다. 각 스레드는 자신만의 독립적인 스택과 프로그램 카운터(PC) 레지스터를 가집니다.
이러한 메모리 공유 덕분에, 스레드 간의 통신은 프로세스 간 통신(IPC)보다 훨씬 빠르고 효율적입니다.
🚀 멀티스레딩 (Multi-threading)
하나의 프로세스가 여러 스레드를 동시에 실행하여 동시성(Concurrency)을 높이는 것을 멀티스레딩이라고 합니다. 멀티코어 환경에서는 병렬성(Parallelism)을 통해 성능을 극대화할 수 있습니다.
- 장점 :
> * 응답성 향상: 시간이 오래 걸리는 작업을 별도의 스레드에서 처리하여, 메인 스레드는 사용자 입력에 즉시 반응할 수 있습니다. > * 자원 효율성: 메모리를 공유하므로 새로운 프로세스를 생성하는 것보다 자원 소모가 적고, 생성 속도가 빠릅니다.
- 단점 :
> * 동기화 문제: 여러 스레드가 공유 자원에 동시에 접근하면 '경쟁 상태(Race Condition)'나 '교착 상태(Deadlock)'와 같은 심각한 문제가 발생할 수 있습니다. 이를 해결하기 위해 뮤텍스, 세마포어 등 복잡한 동기화 기법이 필요합니다. > * 디버깅의 어려움: 실행 흐름이 비결정적이라 버그를 재현하고 수정하기가 매우 어렵습니다.
💡 개발자 핵심 Point
- 웹 서버는 수많은 클라이언트의 요청을 동시에 처리하기 위해 멀티스레딩 모델을 사용합니다.
- GUI 애플리케이션에서 UI 업데이트는 메인 스레드에서, 오래 걸리는 파일 다운로드나 데이터 처리는 백그라운드 스레드에서 수행하여 응답성을 유지합니다.
- 멀티스레딩 프로그래밍은 강력하지만, 동기화 문제라는 복잡성을 항상 동반합니다. 따라서 공유 자원 접근 시에는 항상 주의를 기울여야 합니다.