본문 바로가기
[ Program ]/C#

스레드의 상태

by 관이119 2012. 9. 17.



개발자로 살아간다는건... ™ | 카푸치노


스레드의 상태를 아는 것은 스레드를 어떻게 제어하느냐와 관련이 있습니다. 스레드의 상태는 대표적으로 생성 직후의 상태(Unstarted), 실행 가능한 상태(Runnable), 대기상태(Suspended), 실행을 끝내고 죽는 상태(Stopped) 나눌 있습니다. 일단, 스레드가 생성된 Start 하면, 스레드는 3가지 상태로 전이(轉移) 가능합니다. 이번 절에서는 스레드의 상태에 대해서 알아보도록 하겠습니다.

qUnstarted 상태

스레드에 해당하는 메서드를 하나 디자인하고 메서드의 대리자인 ThreadStart 델리게이트를 생성합니다. 그리고, 생성된 ThreadStart 델리게이트를 매개변수로 하여 Thread 생성하게 됩니다. Unstarted 상태는 스레드가 생성된 직후를 의미합니다. 이것은 Start하기 바로 직전의 상태를 나타냅니다. 상태에서 스레드의 Start() 메서드가 호출되면 실행가능 상태가 되고, 해당 스레드의 메서드가 종료하면 바로 Stopped상태가 됩니다.

q실행가능(Runnable) 상태

새로운 스레드가 생성되어 스레드의 Start() 메서드를 호출하면, 스레드는 Runnable 상태가 됩니다. Runnable 상태는 두가지로 나뉘게 됩니다. CPU 점유하느냐 하지 못하느냐에 따라 두가지로 나뉘게 됩니다. CPU 차지한 스레드가 있을 것이고, 나머지는 후보(候補) 스레드가 것입니다. Runnable 상태의 스레드들은 실행큐라고 하는 저장공간에 넣어 두고 CLR 의해서 관리됩니다. 실행큐란 실행가능 상태에 있는 스레드들을 넣어 두는 자료구조입니다. 알고 보면 CPU 순간에 하나의 스레드만을 실행할 있습니다. 실행큐 있는 스레드들 중에서 하나만을 골라서 실행하는데 번갈아가면서 실행을 하는 것입니다. 물론, 하나의 스레드만이 실행스레드이고 나머지는 후보스레드 되는 것입니다. 두가지 경우를 모두 Runnable 상태라고 말합니다.

q대기상태(Suspended)

현재 실행중인 스레드에서 Suspend(), Sleep() 메서드를 호출하게 되면 스레드는 Runnable 상태에서 Suspended 상태 전환하게 됩니다. Runnable 상태를 벗어난 것이죠. 조금 전에 말한 실행큐에서 제거되고 대기큐라는 곳으로 자리를 옮기게 됩니다. 그리고는 실행큐에 들어갈 조건이 때까지 기다리게 됩니다. 대기큐에 존재하는 스레드들은 CPU 사용할 권한이 없기 때문에 대기상태가 됩니다.

이렇게 Suspend() Sleep() 메서드가 호출될 경우 스레드는 실행가능 상태에서 대기상태로 전환하게 되는데, 반대로 대기상태에서 실행가능 상태로 전환해 주기 위해서는 Suspend() 메서드 호출된 경우에는 Resume() 메서드 호출하고, Sleep() 메서드가 호출된 경우에는 주어진 시간이 경과하면 자동으로 실행가능(Runnable) 상태가 됩니다.

q종료상태(Stopped)

스레드는 하나의 실행 단위입니다. 따라서, 스레드가 일을 모두 마치면 스레드는 Stopped 상태 됩니다. 또한, 작업 도중에 Abort() 메서드 호출해도 스레드는 종료하게 됩니다. 이렇게 해당 스레드의 메서드가 끝나거나 리턴된 경우 또는 강제로 종료될 경우 스레드는 Stopped 상태 됩니다.

이러한 스레드의 상태를 변경하려면 다음 표에서처럼 Thread 클래스에 정의된 메서드를 사용하면 됩니다.

메서드

실행결과

Thread.Start()

해당 스레드의 실행

Thread.Abort()

해당 스레드의 종료

Thread.Join()

해당 스레드의 실행 종료시까지 대기

Thread.Suspend()

해당 스레드를 대기상태로 변경

Thread.Resume()

해당 스레드를 실행 상태로 변경

Thread.Sleep()

해당 스레드를 특정시간동안 대기상태로 변경

13-1 스레드의 상태를 변경하는 메서드

그렇다면, 위에서 나열한 메서드를 실행한 , 실제로 스레드의 상태가 변경되었는지 알아볼 방법이 있을까요? 물론, 있습니다. Thread 클래스의 ThreadState 속성 해당 스레드의 상태 집합을 정의하고 있습니다. 속성을 사용하면 현재 동작중인 스레드의 상태를 있습니다.

Thread.ThreadState

Unstrated

스레드의 초기 생성단계

Running

스레드에서 Start 호출

스레드가 실행

스레드에서 Resume 호출

WaitSleepJoin

스레드에서 Sleep 호출

스레드에서 Wait 호출

스레드에서 Join 호출

SuspendRequest

스레드에서 Suspend 호출

Suspended

스레드가 Suspend 요청에 응답

AbortRequested

스레드에서 Abort 호출

Stopped

스레드가 Abort 요청에 응답

스레드가 종결

13-2 스레드의 상태정보

이렇게 스레드의 정보나 설정 등을 알아볼 있는 방법도 Thread 클래스에서 제공해 주고 있으며, 그것들 가지를 아래의 표에 정리하였으니 참고하시기 바랍니다.

속성

설명

Thread.CurrentThread

현재 실행중인 스레드를 반환

Thread.IsAlive

해당 스레드의 실행 여부를 반환

Thread.Name

해당 스레드의 이름을 설정하거나 반환

Thread.IsBackground

해당 스레드가 백그라운드 스레드인지의 여부를 반환

Thread.ThreadState

해당 스레드의 상태를 반환

Thread.Priority

해당 스레드의 우선순위를 설정하거나 반환

13-3 스레드의 정보를 제공하거나 설정하는 속성


'[ Program ] > C#' 카테고리의 다른 글

vs2010 에서 WCF REST 프로젝트 무작정 만들기  (0) 2012.09.17
커스텀 열거자(IEnumerable, IEnumerator)  (0) 2012.09.17
C# 주의해야 할 문법  (0) 2012.09.17
클래스객체정의  (0) 2012.09.17
데이터베이스 연결  (0) 2012.09.17

댓글