반응형

main 쓰레드

  • main메서드의 코드를 구행하는 쓰레드


예를 들어서 이런 프로그램을  실행한다고 가정해보자.
그러면, java인터프리터가 Hello클래스에 있는 메인 메서드를 호출한다.

그러면 새로운 호출 스택이 만들어지고, 쓰레드가 이 main메서드에 있는 코드를 순서대로 쭉 실행한다.
이것이 main쓰레드다.
main쓰레드는 사용자 쓰레드다.

 

  • 쓰레드는 '사용자 쓰레드'와 '떼몬 쓰레드' 두 종류가 있다.

쓰레드에는 2가지 종류가 있는데,
사용자 쓰레드는 main 쓰레드이고,
데몬 쓰레드는 사용자 쓰레드가 하는 역할을 보조 해주는 역할을 하는 쓰레드이다.

프로그램은 사용자 쓰레드가 하나도 없을 때 종료된다.

지금까지는 main쓰레드가 하나밖에 없었기 때문에 main쓰레드가 종료되면 전체 프로그램이 종료되었지만,
멀티 쓰레드 프로그래밍에서 지금은  사용자 쓰레드가 2개이므로 main메서드가 실행을 종료해도, 아직 실행중인 쓰레드가 남아있으면 프로그램은 종료되지 않는다.

그림처럼 main쓰레드가 실행을 마치고 종료되어도, 프로그램은 살아있다.
아직 실행중인 쓰레드가 하나 남아있기 때문이다.

 

[Ex13_11]

 


 

싱글쓰레드와 멀티쓰레드

 

싱글쓰레드로 작성한 프로그램은, 작업A를 먼저 실행하고 종료되면, 그다음 작업 B를 실행하고 끝나면 종료된다.

[Ex13_3]

싱글쓰레드로 작성하면 두작업이 절대 겹치지 않는다.

 

 

멀티 쓰레드로 작성하면 작업 A를 별도의 쓰레드로 돌리고, 작업 B도 별도의 쓰레드로 작성해서  분리해서 쓰레드를 생성하고 실행하면, 위 그림처럼 실행된다. A작업과 B작업이 번갈아가면서 실행된다.
맨위의 그림에서는 각각 같은 시간단위로 실행되는 것처럼 그렸지만, 실제로는 OS의 스케줄러가 결정하기때문에 이것을 우리가 알 수는 없다. 스케줄러의 알고리즘에 의해 실행된다.

[Ex13_2]

 

그런데 그림을 보면, 멀티쓰레드의 작업시간이 조금더 길게 걸리는것처럼 그림을 그렸는데,
그 이유는,
A작업에서 B작업으로 넘어가는 것을 context switching(문맥전환)이라고 하는데,
어떤 작업을 하다가 다른 작업으로 넘어가려면 아무래도 시간이 걸린다.
context switching 때문에  시간이 소요되므로 싱글쓰레드보다 멀티쓰레드작업이 좀더 시간이 걸릴 수 있기때문에 위 그림처럼 그렸다.

그러면 멀티 쓰레드의 장점은 뭘까?
시간이 조금 더 걸리더라도 두가지 작업을 동시에 할수 있다!
이것이 멀티 쓰레드의 장점이다.

 


 

쓰레드의 I/O 블락킹(blocking)

I/O는 input/output을 뜻한다. 입출력을 의미한다.

I/O 블락킹(blocking)은 입출력시 작업중단 을 의미한다.

어떨때 I/O 블락킹이 일어나는지 살펴보자.

 

싱글쓰레드 코드를 보자.
A와 B작업을 하는데,
A는 입력을 받고, B는 카운트다운을 한다.
그러면 이 프로그램을 실행시켰을 때,

A작업이 진행이 되다가, 사용자가 입력을 안하면 계속 기다려야 한다.
입력을 마쳐야 그 다음줄로 넘어가니깐 말이다.
그러면 이 시간동안 프로그램은 정지상태가 된다.
그리고 사용자가 입력을 마친 다음에 B작업이 시작된다.

 

이럴 때 이 작업을 멀티 쓰레드로 바꾸면 위의 코드처럼 되는데,
A작업을 메인쓰레드가 하고, B작업을 별도의 쓰레드로 돌린다.
그러면 아까와  똑같이 사용자 입력을 기다린다고 했을 때, 그동안 B작업이 수행될 수 있다.
그러면 이런 경우 싱글쓰레드 일때보다 멀티쓰레드일때의 작업이 빨리 끝날 것이다.

 

좌측 : 싱글 쓰레드

우측 : 멀티 쓰레드

반응형