14.1 멀티 스레드 개념
운영체제는 실행 중인 프로그램을 프로세스(process)로 관리한다. 멀티 태스킹(multi tasking)은 두 가지 이상의 작업을 동시에 처리하는 것을 말하는데, 이때 운영체제는 멀티 프로세스를 생성해서 처리한다. 하지만 멀티 태스킹이 꼭 멀티 프로세스를 뜻하지는 않는다.
하나의 프로세스 내에서 멀티 태스킹을 할 수 있도록 만들어진 프로그램들도 있다. 예를 들어 메신저는 채팅 작업을 하면서 동시에 파일 전송 작업을 수행하기도 한다.
하나의 프로세스가 두 가지 이상의 작업을 처리할 수 있는 이유는 멀티 스레드(multi thread)가 있기 때문이다. 스레드(thread)는 코드의 실행 흐름을 말하는데, 프로세스 내에 스레드가 두 개라면 두 개의 코드 실행 흐름이 생긴다는 의미이다.
멀티 프로세스들이 독립적으로 실행되며 서로에게 영향을 미치지 않는 것과 달리, 멀티 스레드는 하나의 프로세스 내부에서 생성되기 때문에 하나의 스레드가 예외를 발생시키면 프로세스가 종료되어 다른 스레드에게 영향을 미친다.
싱글 스레드 vs 멀티 스레드 시각화 (일꾼 비유)
flowchart TD
subgraph Single [싱글 스레드 (혼자 일하기)]
direction LR
W1[일꾼 1명] --> T1[청소하기] --> T2[빨래하기] --> T3[요리하기]
end
subgraph Multi [멀티 스레드 (분업하기)]
direction LR
W2[일꾼 A] --> TA[청소하기]
W3[일꾼 B] --> TB[빨래하기]
W4[일꾼 C] --> TC[요리하기]
end
style Single fill:#f9f9f9,stroke:#333
style Multi fill:#e6f3ff,stroke:#333
style W1 fill:#ffcc99,stroke:#333
style W2 fill:#ffcc99,stroke:#333
style W3 fill:#ffcc99,stroke:#333
style W4 fill:#ffcc99,stroke:#333
예를 들어 워드와 엑셀을 동시에 사용하는 도중에 워드에 오류가 생겨 먹통이 되더라도 엑셀은 여전히 사용 가능하다. 그러나 멀티 스레드로 동작하는 메신저의 경우, 파일을 전송하는 스레드에서 예외가 발생하면 메신저 프로세스 자체가 종료되기 때문에 채팅 스레드도 같이 종료된다. 그렇기 때문에 멀티 스레드를 사용할 경우에는 예외 처리에 만전을 기해야 한다.
멀티 스레드는 데이터를 분할해서 병렬로 처리하는 곳에서 사용하기도 하고, 안드로이드 앱에서 네트워크 통신을 하기 위해 사용하기도 한다. 또한 다수의 클라이언트 요청을 처리하는 서버를 개발할 때에도 사용된다.
자바 21부터는 가상 스레드(virtual thread) 기능이 추가되었다. 이번 장에서 설명하는 스레드는 운영체제 스레드와 1:1로 매핑되는 플랫폼 스레드(platform thread)일 때 복수 개의 가상 스레드가 운영체제의 스레드 1개와 매핑되면서 실행된다.