Thread를 사용하면 각 Thread마다 독립적으로 동시에 일을 수행합니다.

하지만 좀더 정확하게 말하면 현실적으로는 꼭 그렇지는 않습니다.

, 만들어진 Thread가 항상 동시에 일을 하고 있는 것은 아니란 뜻입니다.

 보통 컴퓨터에는 CPU가 몇 개 밖에 없는데, 몇 개 안되는 CPU를 가지고 수십 개의

Thread를 동시에 수행시킬수는 없기 때문에 Runnable Thread에게 순서를 정해서 CPU

시스템 자원을 할당해줍니다. 이런 행동을 스케쥴링이라고 합니다.

자바 런타임 환경은 경쟁하는 Thread를 스케쥴링하는 아주 단순한 원칙이 있습니다.

모든 Runnable Thread마다 우선순위가 정해져 있는데, 이 우선순위에 따라서 스케쥴링을

합니다. 우선 순위가 높은 Thread가 있으면 CPU등 시스템 자원을 할당합니다.

 

자바의 Thread의 우선 순위는 Thread를 만든 Thread의 우선순위를 물려받게 됩니다.

물론 만들어진 Thread의 우선 순위를 조절할 수 있긴합니다. 만들어지는 Thread

우선 순위를 만드는 Thread의 우선 순위보다 높게 할 수은 없겠지요.

우선순위의 값은 MIN_PRIORITY MAX_PRIORITY값으로 Thread 클래스에 정의되어 있는데

숫자가 높으면 우선순위가 높은겁니다. 빨리 스케쥴링된다는 뜻입니다.

어떤 순간에 경쟁하고 있는 Runnable Thread가 있다면 그중 가장 우선 순위가 높은

Thread가 선택되어 집니다. Runnable Thread들은 시스템 자원을 우선 순위 Runnable

Thread에게 항상 빼앗긴다는 것입니다.

만약 Runnable Thread가 모두 우선 순위가 같다면 일을 하고 있는 Thread의 시스템

자원을 강제로 뺏아가지는 않습니다. ,일을 하고 있는 Thread와 같은 우선 순위의

Thread가 많이 있다 하더라도 일을 하고 있는 Thread가 모두 일을 마친후에야 시스템

자원을 차지할 수 있는 기회가 생깁니다.

하지만 만약 시분할 방식의 스케줄링이 지원된다면 정해진 시간 분량만큼 시스템 자원을

사용한 후에는 시스템 자원을 내어 놓고 다음 순서를 기다리게 되겠지요.

하지만 모든 자바 런타임환경이 시분할 방식의 스케쥴링을 지원한다고 볼수는 없기 때문에

신분할 방식에 의존해서 프로그램을 해서는 곤란하겠습니다.

 

요약하면 Runnable Thread가 여러 개인 경우 우선 순위가 높은 Thread는 항상 선택되어

지고,동일한 우선순위의 Thread의 경우는 일하고 있는 Thread가 계속 권리를 가집니다.

우선 순위가 낮다면 절대로 선택되지 않습니다.

시스템 자원을 사용하는 Runnable Thread보다 좀 더 우선순위가 높은 Runnable Thread

생기게 되면 우선 순위가 높은 Thread가 바로 선택되어집니다.

물론 우선 순위의 Runnable Thread라도 yield() 메소드를 호출하거나 run() 메소드를

모두 수행해서 일생을 마치게 되면 우선 순위가 낮은 Thread에게 기회가 옵니다.

하지만 Thread yield() 메소드를 호출한다고 해도 자신보다 우선 순위가 낮은 Thread

에게는 기회를 양보할 수 없습니다. 양보가 안되는 겁니다.

 

자바 런타임 환경이 시분할 방식의 스케쥴링을 구현한다고 하면 Thread에게 할당된 시간

분량이 지나면 Running Thread는 시스템 자원을 모두 반환하고 다음 기회를 기다리게

됩니다. 대개의 시스템이 그렇지만 우선순위가 가장 높은 Thread가 대개 시스템 자원을

확보해서 일을 하겠지만 항상 우선순위가 높은 Thread가 시스템 자원을 독점하느냐 하면

그렇지는 않습니다. 만약 모든 예외가 없이 우선 순위만으로 스케쥴링이 된다면 우선 순위

가 낮은 Thread의 경우 시스템 자원을 할당 받지 못해서 일을 해볼 기회 자체를 얻지

못할 수 있기 때문에 시스템마다 이런 상황에 대한 대비를 해놓기 때문입니다.

Posted by
,