[JAVA]Thread(쓰레드)- 3.싱글쓰레드(single-thread)와 멀티쓰레드(multi-thread)
저번에 멀티쓰레드와 멀티프로세스에 관해서 설명한적이 있는데
이번에는 싱글쓰레드와 멀티쓰레드에 관해 다뤄보려고한다.
그전에 컨텍스 스위칭에대해 알고넘어가사
컨텍스트 스위칭(context switching)이란 프로세스 또는 쓰레드 간의 작업 전환을 말한다.
<가정을 해보자>
두개의 작업을
-하나의 쓰레드(t1)로 처리하는 경우
-두 개의 쓰레드로 처리하는경우(t1,t2)
t1으로 두 작업을 처리하는 경우는 한 작업을 마친후에 다른 작업을 시작한다.
t1,t2으로 작업하는 경우 짧은시간동안 2개의 쓰레드가 번갈아가며 작업을 수행해서 동시에 두작업이 처리되는 것과 같이 느끼게한다.
싱글코어에서 싱글쓰레드 프로세스와 멀티쓰레드 프로세스를 비교하면
두 경우다 작업을 수행한 시간은 거의 같다.
오히려 두 개의 쓰레드로 작업한 시간이 싱글쓰레드로 작업한 시간보다 더 걸리는데
그 이유는
쓰레드간 작업전환(context switching)에 시간이 걸리기 때문이다.
작업전환을 할대는 현재 진행 중인 작업의 상태등을 저장하고 읽어 오는 시간이 소요된다.
(쓰레드 스위칭에 비해 프로세스 스위칭이 더 많은 정보 저장해야하므로 더 많은 시간이 소요됨!)
그래서 싱글코어에서 단순 cpu만을 사용하는 계산작업이라면 오히려 멀티쓰레드보다 싱글쓰레드로 프로그래밍 하는게 더 효율적이다.
두 개의 쓰레드로 작업하는데 더 많은 시간이 걸린 이유는 두가지다.
(1)두 쓰레드가 번갈아가며 작업을 처리하기에 쓰레드간 작업전환시간이 소요됨
(2)한 쓰레드가 화면에 출력하고 있는 동안 다른 쓰레드는 출력이 끝나기 기다려야하는데 이때 발생하는 대기시간 때문이다.
여러 쓰레드가 여러 작업을 동시에 진행하는 것을 병행(concurrent)라고 하고,
하나의 작업을 여러 쓰레드가 나눠서 처리하는 것을 병렬(parallel)이라고 한다.
1.싱글코어로 두 개의 쓰레드를 실행하는 경우와
2.멀티코어로 두개의 쓰레드를 실행하는 경우에도 차이가 발생한다.
1의 경우는 멀티쓰레드라도 하나의 코어가 번갈아가며 작업을 수행하는 거라 두 작업이 절대 겹치지 않는다.
2의 경우는 멀티쓰레드로 두 작업을 수행하면, 동시에 두 쓰레드가 수행될 수 있으므로
두 작업, A와B가 겹치는 부분이 발생한다.
--> 그래서 화면(console)이라는 자원을 놓고 두쓰레드가 경쟁하게된다.
하지만 이런 결과는 실행할때마다 다른 결과를 얻을 수 있다.
왜냐면 내가 실행하고있는 예제프로그램(프로세스)이 OS의 프로세스 스케줄러의 영향을 받기 때문이다.
JVM이 쓰레드 스케줄러에 의해 어떤 쓰레드가 얼마동안 실행될건지 결정하는거와 같이
프로세스도 프로세스 스케줄러에 의해서 실행순서와 실행시간이 결정되기 때문에
매 순간 상황에 따라 프로세스 할당되는 실행시간이 일정치않고, 쓰레드에게 할당되는 시간 도한 일정하지 않다.
--> 그래서 쓰레드가 이런 불확실성을 가지고 있다는 것을 염두에 둬야한다.
자바가 OS에 독립적이라곤 하지만 실제로는 OS종속적인 부분이 몇가지 있는데 쓰레드도 그 중의 하나이다.
(JVM종류에 따라 쓰레드 스케줄러의 구현 방법도 다를수 있다.)
..그림 나중에 첨부해야지!!
두 쓰레드가 서로 다른 자원 사용하는 작업의 경우는 싱글쓰레드 프로세스보다 멅이쓰레드 프로세스가 더 효율적이다.
ex)) 사용자로부터 데이터 입력받는 작업, 네트워크 파일 주고받는 작업, 프린터로 파일 출력하는 작업
-->외부기기와의 입출력을 필요로 하는경우
(A)사용자로부터 입력받는 작업
(B)화면에 출력하는 작업
이 두가지를 하나의 쓰레드로 처리하면 사용자가 입력을 마칠 때까지 아무 일도 하지 못하고 기다려야한다.
그러나 두 개의 쓰레드로 처리하면 사용자 입력 기다리는 동안 다른 쓰레드가 작업을 처리할 수 잇기 때문에 보다 효율적인 cpu사용이 가능하다.